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 MB
Submit: 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

Sample Output

【输出样例1】
76
【输出样例2】
98
posted @ 2018-09-11 17:44  wang9897  阅读(150)  评论(0编辑  收藏  举报