0%

思路讲解

二分是假的,离散化,差分是真的。

还是有一定难度的,一是要想到离散化+差分快速判断该数是否符合条件。第二是要缩小答案范围,注意到,只有a和b才能成为答案(a+1不就差评了?那为什么不选b?—————a-1不就还好评那?那为什么不选a?)

AC代码

https://codeforces.com/contest/2051/submission/319412463

心路历程(WA,TLE,MLE……)

三分做法,WA了

https://codeforces.com/contest/2051/submission/319133918

后面几次WA是因为清空不够多,sum没加够。

思路讲解

那个公式的意思其实就是只有0,2,4,8,。。才能有边长为2的正方形。
0,4,8,12,。。。才能有边长为4的正方形。

图中的1,2,3,4对应加粗斜体的dfs部分。

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	ROF(i,log2(b-a),0){
ll b_=b/pow2[i]*pow2[i],a_=ceil(a*1.0/pow2[i])*pow2[i];
ll d_=d/pow2[i]*pow2[i],c_=ceil(c*1.0/pow2[i])*pow2[i];
if(b_<=a) continue;
if(a_>=b) continue;
if(d_<=c) continue;
if(c_>=d) continue;
if(a_+pow2[i]>b_) continue;
if(c_+pow2[i]>d_) continue;
ans+=abs(a_-b_)/pow2[i]*(abs(c_-d_)/pow2[i]);
#ifdef LOCAL
debug(a_)
debug(b_)
debug(c_)
debug(d_)
debug(pow2[i])
debug(ans)
cerr<<"\n";
#endif
dfs(a,a_,c,d);
dfs(b_,b,c,d);
dfs(a_,b_,c,c_);
dfs(a_,b_,d_,d);
return;
}

AC代码

https://codeforces.com/contest/2074/submission/319087712

心路历程(WA,TLE,MLE……)

直接模拟4叉树,TLE

https://codeforces.com/contest/2074/submission/319043232

思路讲解

呃,这题虽然套着一个几何的背景,但我认为考察重点并不在几何上。

正解竟然就是随机化做法?这题的意义是什么那?我也不是很理解。

AC代码

https://codeforces.com/contest/2074/submission/318930035

心路历程(WA,TLE,MLE……)

TLE

https://codeforces.com/contest/2074/submission/318918084

思路讲解

其实不难,挺简单的。

我的思路是由于限制了半径的大小的总和,所以说可以把每个圆的每个x都扫一遍,扫到这个x了这个圆在这个x上包含了几个点就很容易知道了。然后把x上有多少个点被包含存在Cnt里就好了,最后扫一遍加起来就好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FOR(i,1,N){
ll r=xr[i][1],x=xr[i][0];
FOR(j,x-r,x+r){
ll len=abs(j-x);
ll yCanChoose=sqrtl(r*r-len*len);
yCanChoose*=2,yCanChoose+=1;
if(Cnt.find(j)==Cnt.end()){
Cnt[j]=yCanChoose;
}else{
Cnt[j]=max(yCanChoose,Cnt[j]);
}
}
}
ll ans=0;
for(auto ele:Cnt){
ans+=ele.se;
}

AC代码

https://codeforces.com/contest/2074/submission/318915158

心路历程(WA,TLE,MLE……)

思路讲解

K其实就是吃掉一个寿司所需要花费的时间。
你可以不停拿,但是最后要吃完,拿的时候不能吃。

这个其实是个贪心,这个把题目完全读完就可以得出。

https://www.luogu.com.cn/article/flnzpg4m 这个题解写的很清楚。

总的来说,其实就是这么选一定是合法的,但不一定最优。

image

而且可以证明所有的O是不能再往后移了,只能往前移。当然,往前移一定是合法的。

具体而言是这样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ll idx=0;
ROF(i,N,1){
++idx;
if(idx%(K+1)==0){
spec[i]=true;
}
}
priority_queue<ll> pq;
ll ans=0;
FOR(i,1,N){
pq.push(D[i]);
if(spec[i]){
ans+=pq.top();
pq.pop(); // 记得要弹出,不用清空,往前移比较多也是可以接受的。
}
}

AC代码

https://codeforces.com/contest/2085/submission/319924135

心路历程(WA,TLE,MLE……)