#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 160005
#define LL long long
using namespace std;
struct node
{
LL x1,x2,y;
LL c,v;
node(long long x1=0,long long x2=0,long long y=0,long long c=0,long long v=0):x1(x1),x2(x2),y(y),c(c),v(v){};
bool friend operator<(node X,node Y)
{
return X.y<Y.y;
}
}p[maxn],temp[maxn];
LL sum[maxn];
LL value[maxn];
LL num[maxn];
LL col[maxn];
long long len;
void up(LL L,LL R,LL rt)
{
if(col[rt])
sum[rt]=num[R]-num[L-1];
else if(L==R)sum[rt]=0;
else sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void update(LL L,LL R,LL rt,LL a,LL b,LL c)
{
if(a<=L&&b>=R)
{
col[rt]+=c;
up(L,R,rt);
return;
}
LL m=(L+R)/2;
if(a<=m)
{
update(L,m,rt<<1,a,b,c);
}
if(b>m)update(m+1,R,rt<<1|1,a,b,c);
up(L,R,rt);
}
int main()
{
LL T,n,m,x1,y1,x2,y2,Kind,i,j,L,R,Case=1;
LL NUM;
scanf("%I64d",&T);
while(T--)
{
NUM=0;
scanf("%I64d %I64d",&n,&m);
for(i=1;i<=m;i++)
scanf("%I64d",&value[i]);
for(i=0;i<n;i++)
{
scanf("%I64d %I64d %I64d %I64d %I64d",&x1,&y1,&x2,&y2,&Kind);
p[2*i]=node(x1,x2,y1,1,value[Kind]);
p[2*i+1]=node(x1,x2,y2,-1,value[Kind]);
num[2*i]=x1;
num[2*i+1]=x2;
}
sort(p,p+2*n);
sort(num,num+2*n);
len=0;
for(i=1;i<2*n;i++)
{
if(num[i]!=num[i-1])
{
num[++len]=num[i];
}
}
value[0]=0;
sort(value,value+m+1);
for(i=1;i<=m;i++)
{
LL N=0;
for(j=0;j<2*n;j++)
{
if(p[j].v>value[i-1])
temp[N++]=p[j];
}
memset(sum,0,sizeof(sum));
memset(col,0,sizeof(col));
for(j=0;j<N-1;j++)
{
L=lower_bound(num,num+len,temp[j].x1)-num+1;
R=lower_bound(num,num+len,temp[j].x2)-num;
if(L<=R)
{
update(1,len,1,L,R,temp[j].c);
}
NUM+=sum[1]*(value[i]-value[i-1])*(temp[j+1].y-temp[j].y);
}
}
printf("Case %I64d: %I64d\n",Case++,NUM);
}
return 0;
}
08-18
341
12-25
05-17
05-17
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交