Codeforces Round #645 (Div. 2) Solution

前言

終於橙名了.(我應該是最水的橙名了,QAQ~~)
在這裏插入圖片描述

AA

簽到題.

BB

簽到題+1.
一撥人一起衝進去一定不會不優!
枚舉那個閾值即可.

int n,a[N];
 
 
int main() {
	int _;qr(_); while(_--) {
		qr(n);for(int i=1;i<=n;i++) qr(a[i]);
		sort(a+1,a+n+1);
		int ans=0;
		for(int i=1;i<=n;i++) if(i>=a[i]) ans=max(ans,i);
		pr2(ans+1);
	}
	return 0;
}

CC

考場上想了一個比較麻煩的做法.
在這裏插入圖片描述
由上圖可觀察到,從一個格子出發向右和向下後相似的路徑中,下面那部分每個格子的值都比上面對應位置要大1.

由於總共有x2x1+y2y1x2-x1+y2-y1次移動,所以等價於預處理一個該長度的01串作爲差分數組(x2x11x2-x1個1)),我們求得前綴和後,每個位置的權值和就是和最小路徑和的差.
我們求得最大路徑與最小路徑的差即可.

關於爲啥期間每個值都出現:只要移動路徑中存在77字形線路(先橫後下),(即不是最大值),那麼我們可以調整爲先下後上,這樣明顯權值+1.證畢!

ps:比賽時候好像把x,y搞反了,但是沒有啥問題.

int main() {
	int _;qr(_); while(_--) {
		ll a,b,c,d,u,v,w; qr(a);qr(b); qr(c); qr(d);
		u=d-b; v=c-a; w=u+v; 
		pr2((w+v+1)*u/2-(u+1)*u/2+1);
	}
	return 0;
}
 

官方題解:由上面的調整權值和的做法可以看出,路徑每次把一個格子下移,所以總共的下移次數爲(x2x1)(y2y1)(x2-x1)*(y2-y1),即除去最小路徑上的點的總點數.
代碼更顯然:

int T;
ll a,b,c,d;

int main() {
	qr(T); while(T--) {
		qr(a); qr(b); qr(c); qr(d);
		pr2((c-a)*(d-b)+1); 
	}
	return 0;
}

DD

複製一遍,暴力掃描即可.

ll n,x,d[N],c[N],ans;
 
int main() {
//	int _;qr(_); while(_--) {
		qr(n); qr(x); for(int i=1;i<=n;i++) qr(d[i]),d[i+n]=d[i];
		for(int i=1;i<=2*n;i++) c[i]=c[i-1]+(d[i]+1)*d[i]/2,d[i]+=d[i-1];
		ans=x;
		for(int i=1,j=0;i<=2*n;i++) {
			while(d[i]-d[j]>x) j++;//(j,i]爲整月.
			ll y=d[j]-d[j-1],t=min(y,x-(d[i]-d[j]));
			ans=max(ans,c[i]-c[j]+(y+y-t+1)*t/2);
		}
		pr2(ans);
//	}
	return 0;
}
 

EE

FF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章