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

浙公网安备 33010602011771号