1a很舒服,
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int MAXN=66666;
struct Line{
ll l,r,h;
int s;
Line(ll _l,ll _r,ll _h,int _s)
{
l=_l;
r=_r;
h=_h;
s=_s;
}
bool operator <(const struct Line &b)const{
return h<b.h;
}
};
struct node{
ll x1,y1,x2,y2,s;
node(ll _x1,ll _y1,ll _x2,ll _y2,ll _s)
{
x1=_x1;
y1=_y1;
x2=_x2;
y2=_y2;
s=_s;
}
};
ll s[3];
vector<ll> vt1;
vector<Line> vt2;
vector<node> vt3;
ll sum[MAXN<<2];
int lazy[MAXN<<2];
void pushup(int l,int r,int rt)
{
if(lazy[rt]) sum[rt]=vt1[r+1]-vt1[l];
else if(l==r) sum[rt]=0;
else sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
lazy[rt]+=c;
pushup(l,r,rt);
return;
}
int mid=(l+r)>>1;
if(L<=mid) update(L,R,c,lson);
if(R>mid) update(L,R,c,rson);
pushup(l,r,rt);
}
int main()
{
int t;
cin>>t;
int kace=1;
while(t--)
{
vt3.clear();
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
scanf("%lld",&s[i]);
for(int i=0;i<n;i++)
{
ll x1,y1,x2,y2;
int k;
scanf("%lld%lld%lld%lld%d",&x1,&y1,&x2,&y2,&k);
vt3.push_back(node(x1,y1,x2,y2,s[k-1]));
}
sort(s,s+m);
ll ans1=0;
int cur=0;
for(int i=0;i<m;i++)
{
vt1.clear();
vt2.clear();
for(int j=0;j<n;j++)
{
if(vt3[j].s>=s[i])
{
vt1.push_back(vt3[j].x1);
vt1.push_back(vt3[j].x2);
vt2.push_back(Line(vt3[j].x1,vt3[j].x2,vt3[j].y1,1));
vt2.push_back(Line(vt3[j].x1,vt3[j].x2,vt3[j].y2,-1));
}
}
sort(vt1.begin(),vt1.end());
sort(vt2.begin(),vt2.end());
vt1.erase(unique(vt1.begin(),vt1.end()),vt1.end());
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
ll ans=0;
for(int z=0;z<vt2.size()-1;z++)
{
int l=lower_bound(vt1.begin(),vt1.end(),vt2[z].l)-vt1.begin();
int r=lower_bound(vt1.begin(),vt1.end(),vt2[z].r)-vt1.begin()-1;
update(l,r,vt2[z].s,0,vt1.size()-1,1);
ans+=sum[1]*(vt2[z+1].h-vt2[z].h);
}
ans1+=ans*(s[i]-cur);
cur=s[i];
}
printf("Case %d: %lld\n",kace++,ans1);
}
return 0;
}