BZOJ4418: [Shoi2013]扇形面积并
题解: 看上去好像很难的样子 计算几何??? 看了眼输出 整数?? 模拟一下??? 好像直接维护就行 我们考虑对于[-m,m]范围内的整数点 左端点+1 右端点-1(对应的r半径) 对于当前点在树状数组上二分找到当前第K大的数 然后统计贡献即可
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <stack> #include <queue> #include <cmath> #include <set> #include <map> #define mp make_pair #define pb push_back #define pii pair<int,int> #define link(x) for(edge *j=h[x];j;j=j->next) #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,r,l) for(int i=r;i>=l;i--) const int MAXN=1e5+10; const double eps=1e-8; #define ll long long using namespace std; struct edge{int t;edge*next;}e[MAXN<<1],*h[MAXN],*o=e; void add(int x,int y){o->t=y;o->next=h[x];h[x]=o++;} ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return x*f; } int sum[MAXN],sz,n,m,k; int get_id(int x){return x&(-x);} void update(int x,int vul){for(int i=x;i<=sz;i+=get_id(i))sum[i]+=vul;return ;} int querty(int x){int ans=0;for(int i=x;i>0;i-=get_id(i))ans+=sum[i];return ans;} bool check(int t){ if(querty(sz)-querty(t-1)>=k)return true; return false; } int slove(){ int l=1;int r=sz;int ans=0; while(l<=r){ int mid=(l+r)>>1; if(check(mid))l=mid+1,ans=mid; else r=mid-1; } return ans; } vector<pair<int,bool> >vec[MAXN*20]; int main(){ n=read();m=read();k=read();sz=0;int r,a1,a2; inc(i,1,n){ r=read();a1=read();a2=read();sz=max(sz,r); if(a1<a2)vec[m+a1].pb(mp(r,1)),vec[m+a2].pb(mp(r,0)); else vec[0].pb(mp(r,1)),vec[m+a2].pb(mp(r,0)),vec[m+a1].pb(mp(r,1)),vec[2*m].pb(mp(r,0)); } ll ans=0; for(int i=-m;i<=m;i++){ for(int j=0;j<vec[i+m].size();j++)update(vec[i+m][j].first,vec[i+m][j].second==1?1:-1); int t1=slove(); ans+=1LL*t1*t1; } printf("%lld\n",ans); }
4418: [Shoi2013]扇形面积并
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 220 Solved: 121
[Submit][Status][Discuss]
Description
给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖。
Input
第一行是三个整数n,m,k。n代表同心扇形的个数,m用来等分 [-π,π]的弧度。
从第二行开始的n行,每行三个整数r,a1,a2。描述了一个圆心在原点的扇形,半径为r,圆心角是从弧度πa1/m到πa2/m,a1可能大于a2,逆时针扫过的区域为该扇形面积。
Output
输出一个整数ans,至少被K个扇形所覆盖的总面积等于π/2m×ans
保证答案不超过2^63-1
Sample Input
【输入样例1】
3 8 2
1 -8 8
3 -7 3
5 -5 5
【输入样例2】
2 4 1
4 4 2
1 -4 4
3 8 2
1 -8 8
3 -7 3
5 -5 5
【输入样例2】
2 4 1
4 4 2
1 -4 4
Sample Output
【输出样例1】
76
【输出样例2】
98
76
【输出样例2】
98