前言
終於橙名了.(我應該是最水的橙名了,QAQ~~)
簽到題.
簽到題+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;
}
考場上想了一個比較麻煩的做法.
由上圖可觀察到,從一個格子出發向右和向下後相似的路徑中,下面那部分每個格子的值都比上面對應位置要大1.
由於總共有次移動,所以等價於預處理一個該長度的01串作爲差分數組()),我們求得前綴和後,每個位置的權值和就是和最小路徑和的差.
我們求得最大路徑與最小路徑的差即可.
關於爲啥期間每個值都出現:只要移動路徑中存在字形線路(先橫後下),(即不是最大值),那麼我們可以調整爲先下後上,這樣明顯權值+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;
}
官方題解:由上面的調整權值和的做法可以看出,路徑每次把一個格子下移,所以總共的下移次數爲,即除去最小路徑上的點的總點數.
代碼更顯然:
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;
}
複製一遍,暴力掃描即可.
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;
}