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);
}
posted @   EssnSlaryt  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示