博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树
阅读量:5076 次
发布时间:2019-06-12

本文共 2387 字,大约阅读时间需要 7 分钟。

#include 
#include
#include
#include
#define INF 0x3f3f3f3f#define MOD 1000000007#define mem(a,b) memset((a),b,sizeof(a))#define TS printf("!!!\n")#define pb push_back#define pai pair
//using ll = long long;//using ull= unsigned long long;//std::ios::sync_with_stdio(false);using namespace std;//priority_queue
,greater
> que;typedef long long ll;typedef unsigned long long ull;typedef pair
pairint;const double EPS=1e-8;const double PI=acos(-1);const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;const int maxn = 1e5+10;ll a[maxn],mod,ans[maxn];struct node{ int l,r; ll sum,add,mul,lazy; void update(int a,int m,int len){ add = ((ll)(add*m+a))%mod; mul = ((ll)(m*mul))%mod; sum = ((ll)((ll)sum*m+(ll)len*a))%mod; }}tree[maxn<<2];void pushup(int rt){ tree[rt].sum = (tree[rt<<1].sum + tree[rt<<1|1].sum) % mod;}void pushdown(int rt,int len){ if(tree[rt].add!=0 || tree[rt].mul!=1){ tree[rt<<1].update(tree[rt].add,tree[rt].mul,len-(len>>1)); tree[rt<<1|1].update(tree[rt].add,tree[rt].mul,len>>1); tree[rt].add = 0; tree[rt].mul = 1; }}void build(int rt,int l,int r){ tree[rt].l = l, tree[rt].r = r; tree[rt].add = 0, tree[rt].mul = 1; if(l == r) { tree[rt].sum = a[l]; return ; } int mid = (l+r)/2; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); pushup(rt);}void update(int rt,int l,int r,int add,int mul){ int L = tree[rt].l, R = tree[rt].r; if(l<=L && R<=r){ tree[rt].update(add,mul,R-L+1); return ; } pushdown(rt,R-L+1); int mid = (L+R)/2; if(l<=mid) update(rt<<1,l,r,add,mul); if(r>mid) update(rt<<1|1,l,r,add,mul); pushup(rt);}ll query(int rt,int l,int r){ int L = tree[rt].l, R = tree[rt].r; if(l<=L && R<=r) return tree[rt].sum; else{ ll ans = 0; pushdown(rt,R-L+1); int mid = (L+R)/2; if(l<=mid) ans+=query(rt<<1,l,r)%mod; if(r>mid) ans+=query(rt<<1|1,l,r)%mod; pushup(rt); return ans; }}int main(){ //freopen("input.txt","r",stdin); int n; cin >> n; cin >> mod; for(int i=1; i<=n; i++){ cin >>a[i]; } build(1,1,n); int m; cin >> m; while(m--){ int op; cin >> op; if(op == 1){ //a到b之间乘x int a,b,x; cin >> a >>b >> x; update(1,a,b,0,x); }else if(op == 2){ //a到b之间加x int a,b,add; cin >> a >>b >> add; update(1,a,b,add,1); }else{ int a,b; cin >> a >>b; printf("%lld\n",query(1,a,b)%mod); } } return 0;}
区间乘法加法求和

 

转载于:https://www.cnblogs.com/Aragaki/p/7266391.html

你可能感兴趣的文章
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
windows下编译FreeSwitch
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
django Models 常用的字段和参数
查看>>
IOS--沙盒机制
查看>>
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
sqlite的坑
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
Jquery ui widget开发
查看>>
关于indexOf的使用
查看>>
英语单词
查看>>
Mongo自动备份
查看>>
cer证书签名验证
查看>>
新手Python第一天(接触)
查看>>
【bzoj1029】[JSOI2007]建筑抢修
查看>>
synchronized
查看>>