http://www.cnblogs.com/kane0526/archive/2013/03/07/2948446.html
http://blog.csdn.net/acdreamers/article/details/11854781
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <cctype> #include <vector> #include <iterator> #include <set> #include <map> #include <sstream> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define pb push_back #define debug printf("!\n") #define MAXN 160000+5 #define MAX(a,b) a>b?a:b #define blank pf("\n") #define LL long long #define ALL(x) x.begin(),x.end() #define INS(x) inserter(x,x.begin()) #define pqueue priority_queue #define INF 0x3f3f3f3f #define ls (rt<<1) #define rs (rt<<1|1) int n,m; double hh[MAXN],col[MAXN<<3],len[MAXN<<3]; int V[MAXN]; struct node { double l,r,x,c; int v; node(){} node(double a,double b,double c,double d,int e):l(a),r(b),x(c),c(d),v(e){} bool operator < (const node &b) const { return x<b.x; } }a[MAXN<<3],tmp[MAXN<<3]; void PushUp(int rt,int l,int r) { if(col[rt]) { len[rt] = hh[r+1] - hh[l]; } else if(l==r) len[rt] = 0; else { len[rt] = len[ls]+len[rs]; } } void update(int val,int L,int R,int l,int r,int rt) { if(L<=l && r<=R) { col[rt] += val; PushUp(rt,l,r); return; } int mid = (l+r)>>1; if(L <= mid) update(val,L,R,l,mid,ls); if(R > mid) update(val,L,R,mid+1,r,rs); PushUp(rt,l,r); } int main() { int n,i,j,t,kase=1; double ans; sf("%d",&t); while(t--) { sf("%d%d",&n,&m); int v=0; for(i=1;i<=m;i++) sf("%d",&V[i]); for(i=1;i<=n;i++) { double x1,x2,y1,y2; int r; sf("%lf%lf%lf%lf%d",&x1,&y1,&x2,&y2,&r); hh[++v]=y1; a[v]=node(y1,y2,x1,1,V[r]); hh[++v]=y2; a[v]=node(y1,y2,x2,-1,V[r]); } sort(hh+1,hh+1+v); sort(a+1,a+1+v); int d=1; for(i=2;i<=v;i++) if(hh[i]!=hh[i-1]) hh[++d]=hh[i]; double ans=0; V[0]=0; sort(V,V+m+1); int ct =0; for(j=1;j<=m;j++) { ct=0; for(i=1;i<=v;i++) if(a[i].v>V[j-1]) tmp[ct++]=a[i]; mem(col,0); mem(len,0); for(i=0;i<ct-1;i++) { //int l=BinarySearch(tmp[i].l,1,M); //int r=BinarySearch(tmp[i].r,1,M)-1; int l = lower_bound(hh+1,hh+d,tmp[i].l)-hh; int r = lower_bound(hh+1,hh+d,tmp[i].r)-hh-1; if(l<=r) update(tmp[i].c,l,r,1,d,1); ans+=len[1]*(double)(V[j]-V[j-1])*(tmp[i+1].x-tmp[i].x); } } pf("Case %d: %.0lf\n",kase++,ans); } return 0; }
时间: 2024-10-28 20:55:40