2024.10.4 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018)
Solved:7/11
Penalty:914
Rank:1/74
Rank(vp):63/1k+
Dirt:22%
G
答案是4*纯色块数+5。
考虑怎么维护这个纯色块数。
这道题的修改保证了一个块纯色当且仅当其行列都纯色。
因此对行列分别维护一棵线段树,维护每一层分别有多少个纯色节点,按层乘起来相加就行。
K
1 操作的增加量是单点修改矩阵求和,2 操作的增加量是矩阵修改单点求和。
经典三维偏序。因为空间限制只有 256M 所以不能开线段树套线段树(能开也不写这玩意
在这存一个写的比较清楚的cdq分治的板子。
struct que{
int x,y,id,typ;
bool left;
bool operator<(const que& q)const{
return x<q.x||x==q.x&&id<q.id;
}
}q[N*4],tq[N*4];
ll ans[N];
int c[N*4];
void upd(int x,int y){
for(;x<=tot;x+=x&-x)c[x]+=y;
}
int qry(int x){
int res=0;
for(;x;x-=x&-x)res+=c[x];
return res;
}
void solve1(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
for(int i=l;i<=mid;++i)tq[i]=q[i],tq[i].left=1;
for(int i=mid+1;i<=r;++i)tq[i]=q[i],tq[i].left=0;
sort(tq+l,tq+r+1);
for(int i=l;i<=r;++i){
if(tq[i].left&&!tq[i].typ)upd(tq[i].y,1);
if(!tq[i].left&&tq[i].typ)ans[tq[i].id]+=qry(tq[i].y)*tq[i].typ;
}
for(int i=l;i<=r;++i){
if(tq[i].left&&!tq[i].typ)upd(tq[i].y,-1);
}
solve1(l,mid);
solve1(mid+1,r);
}
void solve2(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
for(int i=l;i<=mid;++i)tq[i]=q[i],tq[i].left=1;
for(int i=mid+1;i<=r;++i)tq[i]=q[i],tq[i].left=0;
sort(tq+l,tq+r+1,
[](que a,que b){return a.x>b.x||a.x==b.x&&a.id<b.id;}
);
for(int i=l;i<=r;++i){
if(tq[i].left&&tq[i].typ)upd(tq[i].y,tq[i].typ);
if(!tq[i].left&&!tq[i].typ)ans[tq[i].id]+=qry(tot)-qry(tq[i].y-1);
}
for(int i=l;i<=r;++i){
if(tq[i].left&&tq[i].typ)upd(tq[i].y,-tq[i].typ);
}
solve2(l,mid);
solve2(mid+1,r);
}
我愿意追随你的轨迹,不远万里,不问归期