【COGS-2638】数列操作ψ 线段树
题目链接:
http://cogs.pro/cogs/problem/problem.php?pid=2638
Solution
用jry推荐的写法即可做到单次O(log2N),不过随机数据下表现非常优秀。
log2大概就是一共log位,然后每位O(N)级的,所以一共NlogN段,每段在线段树上又是log。
jls给的详细证明就是说,每位单独考虑形成一个01串,势能函数就是每位差分后的1的个数,太详细的啥我也不是很熟练了..要是有路过的大神能详细讲一下咩QwQ
具体的就是维护一个区间的same,其二进制下01的意义表示区间中所有数的二进制位第k位是否相同。
处理标记,当整个区间的 需要修改 的二进制位相同时即可直接打上标记。
然后就是正常搞了啊..其实当满足上述的情况后修改就可以变成区间加减标记来处理了,只需要一个标记即可,常数会更优一点。
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; inline int read() { int x=0,f=1; char ch= getchar (); while (ch< '0' || ch> '9' ) { if (ch== '-' ) f=-1; ch= getchar ();} while (ch>= '0' && ch<= '9' ) {x=x*10+ch- '0' ; ch= getchar ();} return x*f; } #define MAXN 100010 int N,M,a[MAXN]; #define AllSame ((1<<30)-1) struct SgtNode{ int l,r,otag,atag,same,maxx; }tree[MAXN<<2]; inline void Update( const int &now) { tree[now].maxx=max(tree[now<<1].maxx,tree[now<<1|1].maxx); tree[now].same=( tree[now<<1].same & tree[now<<1|1].same ) & ( tree[now<<1].maxx ^ (~tree[now<<1|1].maxx) ); } inline void Build( const int &now, const int &l, const int &r) { tree[now].l=l; tree[now].r=r; tree[now].otag=0; tree[now].atag=AllSame; if (l==r) { tree[now].maxx=a[l]; tree[now].same=AllSame; return ; } int mid=(l+r)>>1; Build(now<<1,l,mid); Build(now<<1|1,mid+1,r); Update(now); } inline void And( const int &now, const int &val) {tree[now].maxx&=val; tree[now].otag&=val; tree[now].atag&=val;} inline void Or( const int &now, const int &val) {tree[now].maxx|=val; tree[now].otag|=val; tree[now].atag|=val;} inline void Pushdown( const int &now) { if (tree[now].l==tree[now].r || (!tree[now].otag && tree[now].atag==AllSame)) return ; int ot=tree[now].otag,at=tree[now].atag; tree[now].otag=0; tree[now].atag=AllSame; if (ot) Or(now<<1,ot),Or(now<<1|1,ot); if (at!=AllSame) And(now<<1,at),And(now<<1|1,at); } inline bool CheckOr( const int &same, const int &val) { return (same&val)==val;} inline void ModifyOr( const int &now, const int &L, const int &R, const int &val) { int l=tree[now].l,r=tree[now].r; if (L>r || R<l) return ; if (L<=l && R>=r && CheckOr(tree[now].same,val)) { Or(now,val); return ; } Pushdown(now); ModifyOr(now<<1,L,R,val); ModifyOr(now<<1|1,L,R,val); Update(now); } inline bool CheckAnd( const int &same, const int &val) { return (~same&AllSame|val)==val;} inline void ModifyAnd( const int &now, const int &L, const int &R, const int &val) { int l=tree[now].l,r=tree[now].r; if (L>r || R<l) return ; if (L<=l && R>=r && CheckAnd(tree[now].same,val)) { And(now,val); return ; } Pushdown(now); ModifyAnd(now<<1,L,R,val); ModifyAnd(now<<1|1,L,R,val); Update(now); } inline int Query( const int &now, const int &L, const int &R) { int l=tree[now].l,r=tree[now].r; if (L<=l && R>=r) { return tree[now].maxx; } Pushdown(now); int mid=(l+r)>>1,re=0; if (L<=mid) re=Query(now<<1,L,R); if (R>mid) re=max(re,Query(now<<1|1,L,R)); return re; } int main() { freopen ( "series_wei.in" , "r" ,stdin); freopen ( "series_wei.out" , "w" ,stdout); N=read(),M=read(); for ( int i=1; i<=N; i++) a[i]=read(); Build(1,1,N); while (M--) { int opt=read(),l=read(),r=read(),val; switch (opt) { case 1: val=read(); ModifyAnd(1,l,r,val); break ; case 2: val=read(); ModifyOr(1,l,r,val); break ; case 3: printf ( "%d\n" ,Query(1,l,r)); break ; } } return 0; } /* 8 6 4 0 5 7 2 9 12 8 2 2 5 15 1 3 5 2 3 5 7 1 5 7 12 2 1 6 4 3 2 6 */ |
——It's a lonely path. Don't make it any lonelier than it has to be.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥