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 @ 2024-10-29 21:44  EssnSlaryt  阅读(3)  评论(0编辑  收藏  举报