欲望以提升热忱,毅力以磨平高山!|

XichenOC

园龄:1个月粉丝:4关注:0

2025-01-20 19:23阅读: 3评论: 0推荐: 0

P2391 白雪皑皑

P2391 白雪皑皑

题目翻译:

给定\(n,m,p,q\),先进行\(m\)次染色操作,将
\((i*p+q)\) \(mod\) \(n+1\)\((i*q+p)\) \(mod\) \(n+1\)赋值为\(i\),求最后这\(n\)片雪花被染成什么颜色

题目分析:

我们分析区间\(l\)\(r\)可以发现,\((i*p+q)\) \(mod\) \(n+1\)\((i\) \(mod\) \(n\) \(*p+q)\) \(mod\) \(n+1\) $ $ \(mod\) \(n\)是等价的,也就是说只有最后\(n\)次的染色有意义,而\(n \le 10^6\),因此我们只需要维护一线段树,区间修改,单点查询即可。

完整代码:

#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
using namespace std;
const int N=1e6+5;
int tr[4*N];
void push_down(int p){
    if(tr[p]){
        tr[lc]=tr[rc]=tr[p];
        tr[p]=0;
    }
}
void update(int p,int l,int r,int ll,int rr,int x){
    if(ll<=l && r<=rr){
        tr[p]=x;
        return;
    }
    push_down(p);
    int mid=(l+r)>>1;
    if(ll<=mid)update(lc,l,mid,ll,rr,x);
    if(mid<rr)update(rc,mid+1,r,ll,rr,x);
}
int query(int p,int l,int r,int x){
    if(l==r){
        return tr[p];
    }
    push_down(p);
    int mid=(l+r)>>1;
    if(x<=mid)query(lc,l,mid,x);
    else query(rc,mid+1,r,x);
}
int main(){
    int n,m,p,q;
    cin>>n>>m>>p>>q;
    int k=m>n?m-n+1:1;
    for(int i=k;i<=m;i++){
        int l=(i*p+q)%n+1,r=(i*q+p)%n+1;
        if(l>r)swap(l,r);
        update(1,1,n,l,r,i);
    }
    for(int i=1;i<=n;i++){
        cout<<query(1,1,n,i)<<endl;
    }
}

线段树讲解

本文作者:XichenOC

本文链接:https://www.cnblogs.com/XichenOC/p/18682377

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   XichenOC  阅读(3)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起