传送门

分析

分析一下x+lowbit(x)x + lowbit(x)x+lowbit(x)这个操作
如果多次操作之后,那么xxx中只会有最高位存在一,这个时候再执行一次操作就会使整个数字乘二
所以,我们可以在线段树上给每个区间打上标记,标记这个区间是否可以直接乘二进行修改即可

代码

#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
#define _CRT_SECURE_NO_WARNINGS
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef vector<int> VI;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
const ll mod = 998244353;
const double eps = 1e-9;
const double PI = acos(-1);
template<typename T>inline void read(T &a) {char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}
int gcd(int a, int b) {return (b > 0) ? gcd(b, a % b) : a;}
int n,a[N],m;struct Node{int l,r;ll sum,add;bool flag;
}tr[N * 4];ll lowbit(ll x){return x & -x;
}ll ksm(ll x,ll y,ll z = mod){ll ans=1,base=x;while(y){if(y&1)ans*=base,ans%=z;base*=base;base%=z;y>>=1;}return ans;
}void push(int u){tr[u].sum = (tr[u << 1].sum + tr[u << 1 | 1].sum) % mod;tr[u].flag = tr[u << 1].flag && tr[u << 1 | 1].flag;
}void down(int u){if(tr[u].add){ll &k = tr[u].add;ll p = ksm(2,k);tr[u << 1].sum = tr[u << 1].sum * p % mod;tr[u << 1 | 1].sum = tr[u << 1 | 1].sum * p % mod;tr[u << 1].add += k;tr[u << 1 | 1].add += k;k = 0;}
}void build(int u,int l,int r){tr[u] = {l,r,0,0,0};if(l == r){tr[u].sum = a[l];if(tr[u].sum == lowbit(tr[u].sum)) tr[u].flag = 1;return;}int mid = (l + r) >> 1;build(u << 1,l,mid),build(u << 1 | 1,mid + 1,r);push(u);
}void modify(int u,int l,int r){if(tr[u].l >= l && tr[u].r <= r && tr[u].flag){tr[u].sum = tr[u].sum * 2 % mod;tr[u].add++;return;}if(tr[u].l == tr[u].r){tr[u].sum += lowbit(tr[u].sum);if(tr[u].sum == lowbit(tr[u].sum)) tr[u].flag = 1;return;}down(u);int mid = (tr[u].l + tr[u].r) >> 1;if(l <= mid) modify(u << 1,l,r);if(r > mid) modify(u << 1 | 1,l,r);push(u);
}ll query(int u,int l,int r){if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;down(u);ll ans = 0;int mid = (tr[u].l + tr[u].r) >> 1;if(l <= mid) ans = query(u << 1,l,r);if(r > mid) ans = (ans + query(u << 1 | 1,l,r)) % mod;return ans;
}int main() {int T;read(T);while(T--){read(n);for(int i = 1;i <= n;i++) read(a[i]),a[i] %= mod;build(1,1,n);read(m);while(m--){int op,l,r;read(op),read(l),read(r);if(op == 1) modify(1,l,r);else {dl(query(1,l,r));}}}return 0;
}

2021CCPC东北四省赛 D. Lowbit 势能线段树相关推荐

  1. 势能线段树(吉司机线段树)专题

    势能线段树(吉司机线段树)专题 势能线段树在近期训练时遇到了好几次,但是由于本人太懒一直没补完,结果ICPC网络赛还真就出了一道势能线段树Orz--结果当然是没做出来--痛定思痛,这回把之前欠的一块儿 ...

  2. 2018东北四省赛 Store The Matrix (矩阵)

    2018东北四省赛 Store The Matrix (矩阵) 题目描述 Given a matrix M with r rows and c columns. It is obviously tha ...

  3. 势能线段树/吉司机线段树-我没有脑子

    势能线段树/吉司机线段树 BZOJ3211 花神游历各国 BZOJ5312 冒险 BZOJ4355 Play with sequence BZOJ4695 最假女选手 \(A_i = max(A_i, ...

  4. CF765F Souvenirs(势能线段树)

    CF765F Souvenirs problem solution code problem 题目链接 solution 这个势能线段树简直是太巧妙了!!!( ఠൠఠ )ノ 将询问按右端点升序离线下来 ...

  5. 势能线段树(均摊分析)

    势能线段树 线段树能够通过打懒标记实现区间修改的条件有两个: 能够快速处理懒标记对区间询问结果的影响 能够快速实现懒标记的合并 但有的区间修改不满足上面两个条件(如区间整除/开方/取模等). 但某些修 ...

  6. 【题型总结】势能线段树

    吉老师势能线段树论文 ABC256Ex - I like Query Problem 题目链接 1 L R x:对 i = L , L + 1 , ⋯ , R i=L,L+1,\cdots,R i=L ...

  7. 东北四省赛H-Skyscraper-线段树的区间合并优化

    题目描述: At the main street of Byteland, there will be built n skyscrapers, standing sequentially one n ...

  8. 2019 ICPC银川区域赛 G - Pot!!(线段树维护动态RMQ)

    传送门 题目大意 若ppp为质数,定义potp(n)pot_p(n)potp​(n)为nnn分解质因数ppp的指数.给定一个初始全为111的序列aaa,有两种操作: MULTIPLY l r:将区间[ ...

  9. 【YBT2023寒假Day4 C】樱桃莓莓(交互)(四毛子分块)(线段树)

    樱桃莓莓 题目链接:YBT2023寒假Day4 C 题目大意 有一个黑盒操作满足交换律和结合律,有 n 个数,q 次询问,每次选 m 个下标,你要计算所有不包含那 m 个下标的数进行黑盒操作之后的结果 ...

最新文章

  1. 平面广告设计和Web设计的差别
  2. 如果我是小白, 学Python要准备什么呢?
  3. PCL-1.8.1从源码搭建开发环境三(QHULL库的编译)
  4. GridBagLayout布局管理器应用详解
  5. oracle pl sql 抛出例外
  6. android8.0学习(1)---Android Treble 概述
  7. day12 生成器和各种推导式
  8. Javascript面向对象全面剖析 —创建对象
  9. 微信小程序毕业设计(一)
  10. 陶哲轩实分析 3.1节 习题试解
  11. 嘻哈说:设计模式之工厂方法模式
  12. 小白学 Python 爬虫(26):为啥上海二手房你都买不起
  13. 日历查询系统c语言1,C语言 日历查询系统 成品
  14. 祝贺 Influx Technology 成为北航 AERO 大学生方程式赛车队一级赞助商
  15. 音视频技术开发周刊 | 229
  16. Samsung MDM partners
  17. div的display属性和visibility属性
  18. glidedsky挑战-图片式反爬(雪碧图)
  19. linux时间同步命令shell,LINUX时间同步脚本或命令
  20. Py-Tetrazine-Py-Amide-Butyric acid相关介绍,1233234-76-8

热门文章

  1. vegan 包进行Adonis 分析
  2. [学习] 08 提高背书速度新玩法
  3. 路漫漫其修远兮,吾将上下而求索(2019培训总结)
  4. DRV8711的通用步进电机驱动器和直流电机驱动器
  5. 九种卫星地图的快速比较和选择方法
  6. STM32串口通信配置(USART1+USART2+USART3+UART4)
  7. 普林斯顿大学计算机专业,普林斯顿大学计算机专业就业前景怎么样?
  8. [构造]Array 2022牛客多校第6场 A
  9. 使用计算机报点系统时填记,铁路 车务 运转系统 自动闭塞《接发列车作业标准》...
  10. freeSwitch DISA实现