首页 > 其他分享 >2020ICPC南京J

2020ICPC南京J

时间:2023-05-05 18:45:59浏览次数:47  
标签:lc int 南京 tr 2020ICPC rc fi fsz

以前没写过势能线段树,然后错了114514个地方,我有罪。

#include<bits/stdc++.h>
using namespace std;
const int N=200013;
int a[N];
struct segtree{
#define mid ((l+r)>>1)
#define ls x<<1,l,mid
#define rs x<<1|1,mid+1,r
#define lc tr[x<<1]
#define rc tr[x<<1|1]
    struct info{
        int fi,fsz,se,c[32],xsm,tg;
    }tr[N<<2];
    void pu(int x){
        tr[x].xsm=lc.xsm^rc.xsm;
        for(int i=0;i<30;i++)tr[x].c[i]=lc.c[i]+rc.c[i];
        if(rc.fi>lc.fi)tr[x].fi=lc.fi,tr[x].fsz=lc.fsz,tr[x].se=min(lc.se,rc.fi);
        if(rc.fi<lc.fi)tr[x].fi=rc.fi,tr[x].fsz=rc.fsz,tr[x].se=min(rc.se,lc.fi);
        if(rc.fi==lc.fi)tr[x].fi=lc.fi,tr[x].fsz=lc.fsz+rc.fsz,tr[x].se=min(lc.se,rc.se);
    }
    void build(int x,int l,int r){
        tr[x].tg=-1;
        if(l==r){
            tr[x].xsm=tr[x].fi=a[l],tr[x].fsz=1;
            tr[x].se=(1<<30)-1;
            for(int i=0;i<30;i++)tr[x].c[i]=a[l]>>i&1;
            return;
        }
        build(ls),build(rs),pu(x);
    }
    void pd(int x){
        auto&t=tr[x].tg;
        if(t!=-1){
            if(lc.fi<t&&t<lc.se){
                for(int i=0;i<30;i++){
                    if(lc.fi>>i&1)lc.c[i]-=lc.fsz;
                    if(t>>i&1)lc.c[i]+=lc.fsz;
                }
                if(lc.fsz&1)lc.xsm^=lc.fi^t;
                lc.fi=lc.tg=t;
            }
            if(rc.fi<t&&t<rc.se){
                for(int i=0;i<30;i++){
                    if(rc.fi>>i&1)rc.c[i]-=rc.fsz;
                    if(t>>i&1)rc.c[i]+=rc.fsz;
                }
                if(rc.fsz&1)rc.xsm^=rc.fi^t;
                rc.fi=rc.tg=t;
            }
        }
        t=-1;
    }
    void add(int x,int l,int r,int L,int R,int val){
        if(L<=l&&R>=r){
            if(val<=tr[x].fi)return;
            else if(val<tr[x].se){
                for(int i=0;i<30;i++){
                    if(tr[x].fi>>i&1)tr[x].c[i]-=tr[x].fsz;
                    if(val>>i&1)tr[x].c[i]+=tr[x].fsz;
                }
                if(tr[x].fsz&1)tr[x].xsm^=tr[x].fi^val;
                tr[x].fi=tr[x].tg=val;
            }
            else pd(x),add(ls,L,R,val),add(rs,L,R,val),pu(x);
            return;
        }
        pd(x);
        if(L<=mid)add(ls,L,R,val);
        if(R>mid)add(rs,L,R,val);
        pu(x);
    }
    int qry(int x,int l,int r,int L,int R,int b){
        if(L<=l&&R>=r)return tr[x].c[b];
        int res=0;pd(x);
        if(L<=mid)res+=qry(ls,L,R,b);
        if(R>mid)res+=qry(rs,L,R,b);
        return res;
    }
    int qry(int x,int l,int r,int L,int R){
        if(L<=l&&R>=r)return tr[x].xsm;
        int res=0;pd(x);
        if(L<=mid)res^=qry(ls,L,R);
        if(R>mid)res^=qry(rs,L,R);
        return res;
    }
}T;

void work(){
    int n;cin>>n;
    int q;cin>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    T.build(1,1,n);
    for(int i=1,l,r,op,x;i<=q;i++){
        cin>>op>>l>>r>>x;
        if(op==1)T.add(1,1,n,l,r,x);
        else{
            int val=T.qry(1,1,n,l,r);
            if(val==x){
                cout<<0<<'\n';
                continue;
            }
            int xx=__lg(val^x);
            cout<<T.qry(1,1,n,l,r,xx)+(x>>xx&1)<<'\n';
        }
    }
}
int main(){
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout.tie(0);
    int T=1; //cin>>T
    while(T--) work();
    return 0;
}

  

标签:lc,int,南京,tr,2020ICPC,rc,fi,fsz
From: https://www.cnblogs.com/Bakabamboo/p/17375072.html

相关文章

  • R语言指数平滑预测法分析南京出租车打车软件空载率时间序列补贴政策可行性
    报告链接:http://tecdat.cn/?p=32161原文出处:拓端数据部落公众号本文通过建立空载率的数学模型,帮助客户来分析出租车的空载率,从而对出租车补贴政策能否提高高峰期的实载率,缓解打车难问题进行了说明。分析思路1.利用这么多天的数据,按照算法先算出每天的日平今年空载率,绘制成曲线......
  • 来自南京玄武湖畔的云栖之声
    今天我来到了南京,下榻到了南京香格里拉大酒店。比邻玄武湖而建的香格里拉,显得别有一番风水。晨曦中,我围绕酒店散步,发现周围郁郁葱葱的树木里,夹杂着几棵枇杷树,已经硕果累累了,就差几周即可黄黄的催人欲滴。当然,也少不了像张开的玉掌般的枫叶。为什么这么形容呢?因为实在是太美了,绿色的......
  • 游记 | 20230402 · 牛首山踏春 · 南京眼夜景
    目录0周六晚·准备1周日白天·牛首山1.1出发·随流·抄近路1.2游览佛顶宫1.3河堤·湖岸·桃花溪2周日下午·新发现(河西天街店)·蘇小柳(河西分院)3周日晚上·南京眼·保利大剧院总结0周六晚·准备去年秋天,我们三个去了栖霞山;今年春天,打算去牛首山逛......
  • 南京凯盛携手图扑共建智慧水泥工厂
    前言自2020年以来,图扑软件和南京凯盛国际工程有限公司,合作建设了多个水泥工厂数字孪生项目,其服务客户包括冀东水泥、南方水泥、西南水泥、中联水泥、昆钢嘉华等。孪生工......
  • 南京Java培训班哪家好,什么样的可选
    南京Java培训班哪家好?我们应该明确自己的学习目的,是为了什么而选择Java培训班学习,优势又是什么,能给我们带来什么帮助,当清楚这些之后,我们就能很好的在众多的南京Java培训中......
  • 南京
    天气早晚温差较大,穿着需要注意。动车南京站下车,前往住宿休整,结束后晚饭时间。周五晚饭南京大牌档:单从大众点评的差评可以看到用户反应较多为上菜速度慢,但是针对菜......
  • 亚信科技亮相南京软博会,数智赋能百行千业
    11月23至25日,主题为“软件赋能数智转型”的2022中国(南京)国际软件产品和信息服务交易博览会在南京国际博览中心盛大启幕。“数智化全栈能力提供商”亚信科技携“云网边端”......
  • 2018南京Gym - 101981J - Prime Game(计数)
    第一个元素的素因子2:它能贡献的区间有[1,1],[1,2],……,[1,10]10个区间第一个元素的素因子3:它能贡献的区间有[1,1],[1,2],……,[1,10]10个区间当前sum=10+10第二个元素......
  • 2022icpc 南京
    G.Inscryption贪心回溯在题目中0可以变成策略1,也可以变成策略2,但策略2是比策略1更加优秀的策略,所以当遇到0时能变成策略2就变成策略2,但是变成策略2可能会让后面的决策......
  • 2022 ICPC 南京 D
    D.ChatProgram二分答案x我们考虑如何O(n)check首先我们可以将大于等于x的都看成1否则看成0题意转化为我们通过一次操作将这个01序列中的1变得大于k个我们设dp[i]为i......