/*
可以直接转化为HDU 3642 Get The Treasury来做
也就是把每一块土地的价值看成高进行处理
HDU 请使用__int64
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
using namespace std;
#define LL long long
const int maxn = 62222;
int s[4];
int kind;
int mp[2222222];
struct edge
{
int a,b,h;
int s;
};
struct cube
{
int x1,y1,z1,x2,y2,z2;
};
cube c[maxn];
edge e[maxn];
bool cmp(const edge &p,const edge &q)
{
if(p.h==q.h) return p.s<q.s;
return p.h<q.h;
}
int x[maxn];
int z[maxn];
int lazy[maxn<<2];
int sum[maxn<<2];
int n,m,p;
int kase;
void pushup(int l,int r,int rt)
{
int lc=rt<<1;
int rc=rt<<1|1;
if(lazy[rt]<0)
{
sum[rt]=x[r+1]-x[l];
}
else if(l==r) sum[rt]=0;
else sum[rt]=sum[lc]+sum[rc];
}
void update(int L,int R,int s,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
lazy[rt]+=s;
pushup(l,r,rt);
return;
}
int mid=(l+r)>>1;
if(L<=mid) update(L,R,s,l,mid,rt<<1);
if(R>mid) update(L,R,s,mid+1,r,rt<<1|1);
pushup(l,r,rt);
}
int bst(int v,int x[],int size)
{
int mid;
int l,r;
l=0,r=size-1;
while(l<=r)
{
mid=(l+r)>>1;
if(x[mid]==v) return mid;
if(x[mid]<v) l=mid+1;
else r=mid-1;
}
return -1;
}
void input()
{
scanf("%d%d",&n,&kind);
for(int i=1;i<=kind;i++) scanf("%d",&s[i]);
for(int i=0;i<n;i++)
{
int tmp;
scanf("%d%d%d%d%d",&c[i].x1,&c[i].y1,&c[i].x2,&c[i].y2,&tmp);
c[i].z1=0,c[i].z2=s[tmp];
}
//printf("%d\n",n);
}
void add_rectangel(int x1,int y1,int x2,int y2)
{
e[m].a=x1,e[m].b=x2,e[m].h=y1,e[m++].s=-1;
e[m].a=x1,e[m].b=x2,e[m].h=y2,e[m++].s=1;
}
void solve()
{
LL ans=0;
int cnt=1;
for(int i=0;i<n;i++)
{
x[2*i]=c[i].x1;
x[2*i+1]=c[i].x2;
}
for(int i=1;i<2*n;i++)
{
if(x[i]!=x[i-1]) x[cnt++]=x[i];
}
z[0]=0;
for(int i=1;i<=kind;i++) z[i]=s[i];
sort(z,z+kind+1);
sort(x,x+cnt);
for(int i=0;i<cnt;i++) mp[x[i]+1000000]=i;
for(int i=0;i<kind;i++)
{
memset(lazy,0,sizeof(lazy));
memset(sum,0,sizeof(sum));
m=0;
LL res=0;
for(int j=0;j<n;j++)
{
if(c[j].z1<=z[i]&&z[i]<c[j].z2)
{
add_rectangel(c[j].x1,c[j].y1,c[j].x2,c[j].y2);
}
}
sort(e,e+m,cmp);
int L,R;
for(int i=0;i+1<m;i++)
{
//L=bst(e[i].a,x,cnt);
//R=bst(e[i].b,x,cnt)-1;
L=mp[e[i].a+1000000];
R=mp[e[i].b+1000000]-1;
//printf("%d %d\n",L,R);
if(L<=R)
{
update(L,R,e[i].s,0,cnt-1,1);
res+=(LL)sum[1]*(e[i+1].h-e[i].h);
}
}
res*=z[i+1]-z[i];
ans+=res;
}
printf("Case %d: %lld\n",kase++,ans);
}
int main()
{
int T;
scanf("%d",&T);
kase=1;
while(T--)
{
input();
solve();
}
return 0;
}
HDU 3255 Farming
最新推荐文章于 2017-10-17 19:28:22 发布