http://acm.hdu.edu.cn/showproblem.php?pid=3634
最开始想复杂了 后来静下心来一想 原来很简单 主要还是要缕清思路
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #define ll long long using namespace std; const int N=105; const ll MOD = 1000000007; int a[N],b[N],L[N]; struct node { int x1,y1,x2,y2,v; }q[N]; bool cmp(node a,node b) { return a.v>b.v; } int main() { //freopen("data.in","r",stdin); int T; scanf("%d",&T); for(int w=1;w<=T;++w) { int n; scanf("%d",&n); int len=n*2; for(int i=0;i<n;++i) { scanf("%d %d %d %d %d",&q[i].x1,&q[i].y1,&q[i].x2,&q[i].y2,&q[i].v); a[i]=q[i].x1;a[i+n]=q[i].x2; b[i]=q[i].y1;b[i+n]=q[i].y2; } sort(q,q+n,cmp); sort(a,a+len); sort(b,b+len); ll ans=0; for(int i=1;i<len;++i) if(a[i]>a[i-1]) { for(int w=0;w<len-1;++w) L[w]=b[w+1]-b[w]; for(int l=0;l<n;++l) if(q[l].x1<=a[i-1]&&q[l].x2>=a[i]) { int d=0; for(int w=0;w<len-1;++w) { if(q[l].y1<=b[w]&&q[l].y2>=b[w+1]) { d+=L[w]; L[w]=0; } } ans+=((ll)(a[i]-a[i-1])*(d)*q[l].v); } } printf("Case %d: ",w); cout<<ans<<endl; } return 0; }