题解:P3997 [SHOI2013] 扇形面积并
PUTONGDEYITIREN · · 题解
思路
它这里给我们了一些扇形,叫我们求大于
方法
我们可以考虑一下扫描线,我们把每个扇形的
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define low (x&(-x))
ll const N=2e6+5;
ll n,m,k,tree[N],a,b,r,t,ans,pp;
vector<ll> p[N];
void update(ll x,ll d){while(x<=2e6+4)tree[x]+=d,x+=low;return;}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){//输入并把圆圈化为直线数组
cin>>r>>a>>b;
if(a>b) p[0].push_back(r);
p[a+m].push_back(r);
p[b+m].push_back(-r);
}
for(int i=0;i<2*m;i++){
for(int j=0;j<p[i].size();j++) update(abs(p[i][j]),p[i][j]/abs(p[i][j])),pp+=p[i][j]/abs(p[i][j]);
ll u=0,s=0;
if(pp>=k){//树状数组加倍增主要代码
for(int l=21;l>=0;l--)
if(u+(1<<l)<N&&s+tree[u+(1<<l)]<pp-k+1) s+=tree[u+=(1<<l)];
ans+=(u+1)*(u+1);
}
}
cout<<ans<<endl;
return 0;
}
细节
但相信大家对一些细节还有疑问,比如说如果