http://acm.hdu.edu.cn/showproblem.php?pid=1542
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=1e5;
struct node{double l,r,h;int tag;};
/////////////////////////////////////////////////////////
int n,k=0,Case=0,cnt=0,addv[N];
node s[N];
double x2,x3,y2,y3,ans=0,x[N],sumv[N],tmp[N];
/////////////////////////////////////////////////////////
bool cmp(node x,node y){return x.h<y.h;}
int find(double x){
int l=1,r=k,mid;
while(l<=r){
mid=l+r>>1;
if(tmp[mid]==x)return mid;
if(tmp[mid]>x)r=mid-1;
if(tmp[mid]<x)l=mid+1;
}
}
/////////////////////////////////////////////////////////
void init(){
k=0;
ans=0;
cnt=0;
memset(addv,0,sizeof(addv));
memset(sumv,0,sizeof(sumv));
}
/////////////////////////////////////////////////////////
void maintain(int o,int L,int R){
int lc=o<<1,rc=o<<1|1;
if(addv[o])sumv[o]=tmp[R+1]-tmp[L];
else if(L==R) sumv[o]=0;
else sumv[o]=sumv[lc]+sumv[rc];
}
void update(int o,int L,int R,int ql,int qr,int v){
int lc=o<<1,rc=o<<1|1,M=L+R>>1;
if(ql<=L&&R<=qr){addv[o]+=v;maintain(o,L,R);return;}
if(ql<=M)update(lc,L,M,ql,qr,v);
if(M<qr)update(rc,M+1,R,ql,qr,v);
maintain(o,L,R);
}
/////////////////////////////////////////////////////////
int main()
{
while(~scanf("%d",&n)&&n){
init();
rep(i,1,n){
scanf("%lf%lf%lf%lf",&x2,&y2,&x3,&y3);
cnt++;s[cnt].l=x2,s[cnt].r=x3,s[cnt].h=y2,s[cnt].tag=1; x[cnt]=x2;
cnt++;s[cnt].l=x2,s[cnt].r=x3,s[cnt].h=y3,s[cnt].tag=-1;x[cnt]=x3;
}
sort(x+1,x+cnt+1),sort(s+1,s+cnt+1,cmp);
rep(i,1,cnt)if(x[i]!=x[i-1]||i==1)tmp[++k]=x[i];
rep(i,1,cnt){
int l=find(s[i].l);
int r=find(s[i].r)-1;
update(1,1,k,l,r,s[i].tag);
ans+=sumv[1]*(s[i+1].h-s[i].h);
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",++Case,ans);
}
return 0;
}
https://www.luogu.org/problemnew/show/P4198
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=100000000;
int st;
int sumv[N],n,m,x,y;
double maxn[N];
int ed;
int count(double MAX,int o,int L,int R){
int lc=o<<1,rc=o<<1|1,M=L+R>>1;
if(L==R)return maxn[o]>MAX;
if(MAX>=maxn[lc])return count(MAX,rc,M+1,R);
else return sumv[o]-sumv[lc]+count(MAX,lc,L,M);
}
void update(int o,int L,int R,int p,double v){
int lc=o<<1,rc=o<<1|1,M=L+R>>1;
if(L==R){maxn[o]=v;sumv[o]=1;return;}
if(p<=M)update(lc,L,M,p,v);
else update(rc,M+1,R,p,v);
maxn[o]=max(maxn[lc],maxn[rc]);
sumv[o]=sumv[lc]+count(maxn[lc],rc,M+1,R);
}
int main()
{
//freopen("a.in","r",stdin);
scanf("%d%d",&n,&m);
rep(i,1,m){
scanf("%d%d",&x,&y);
update(1,1,n,x,1.0*y/x);
printf("%d\n",sumv[1]);
}
return 0;
}
1345

被折叠的 条评论
为什么被折叠?



