集训日记

线段树模板总结

t1 如题,已知一个数列,你需要进行下面三种操作:

将某区间每一个数乘上 x; 将某区间每一个数加上 x; 求出某区间每一个数的和。 输入格式 第一行包含三个整数 n,q,m,分别表示该数列数字的个数、操作的总个数和模数。

第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。

接下来 q 行每行包含若干个整数,表示一个操作,具体如下:

操作 1 1: 格式:1 x y k 含义:将区间 [x,y] 内每个数乘上 k

操作 2 2: 格式:2 x y k 含义:将区间 [x,y] 内每个数加上 k

操作 3 3: 格式:3 x y 含义:输出区间 [x,y] 内每个数的和对 m 取模所得的结果

输出格式 输出包含若干行整数,即为所有操作 3 3 的结果。

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+5; struct node { int l,r; ll sum,lx,lj; }p[maxn<<2]; int n,m,q; ll a[maxn]; inline void pushup(int x) { p[x].sum=(p[x<<1].sum+p[x<<1|1].sum)%q; } inline void pushdn(int x) { p[x<<1].sum=(p[x<<1].sum*p[x].lx+(ll)(p[x<<1].r-p[x<<1].l+1)*p[x].lj)%q; p[x<<1|1].sum=(p[x<<1|1].sum*p[x].lx+(ll)(p[x<<1|1].r-p[x<<1|1].l+1)*p[x].lj)%q; p[x<<1].lj=(p[x<<1].lj*p[x].lx+p[x].lj)%q; p[x<<1|1].lj=(p[x<<1|1].lj*p[x].lx+p[x].lj)%q; p[x<<1].lx=(p[x<<1].lx*p[x].lx)%q; p[x<<1|1].lx=(p[x<<1|1].lx*p[x].lx)%q; p[x].lj=0; p[x].lx=1; } inline void build(int l,int r,int x) { p[x].l=l; p[x].r=r; p[x].lj=0; p[x].lx=1; if(l==r) { p[x].sum=a[l]%q; return ; } int mid=l+r>>1; build(l,mid,x<<1); build(mid+1,r,x<<1|1); pushup(x); } inline void uj(int l,int r,int cur,ll x) { int L=p[cur].l; int R=p[cur].r; if(l<=L and R<=r) { p[cur].lj+=x; p[cur].lj%=q; p[cur].sum+=(ll)(p[cur].r-p[cur].l+1)*x; p[cur].sum%=q; return ; } pushdn(cur); int mid=L+R>>1; if(r<=mid) uj(l,r,cur<<1,x); else if(l>mid) uj(l,r,cur<<1|1,x); else { uj(l,mid,cur<<1,x); uj(mid+1,r,cur<<1|1,x); } pushup(cur); } inline void ux(int l,int r,int cur,ll x) { int L=p[cur].l; int R=p[cur].r; if(l<=L and R<=r) { p[cur].sum=(p[cur].sum*x)%q; p[cur].lx=(p[cur].lx*x)%q; p[cur].lj=(p[cur].lj*x)%q; return ; } pushdn(cur); int mid=L+R>>1; if(r<=mid) ux(l,r,cur<<1,x); else if(l>mid) ux(l,r,cur<<1|1,x); else { ux(l,mid,cur<<1,x); ux(mid+1,r,cur<<1|1,x); } pushup(cur); } inline ll qy(int l,int r,int cur) { int L=p[cur].l; int R=p[cur].r; if(l<=L and R<=r) return p[cur].sum%q; pushdn(cur); int mid=L+R>>1; if(r<=mid) return qy(l,r,cur<<1)%q; else if(l>mid) return qy(l,r,cur<<1|1)%q; else return (qy(l,mid,cur<<1)%q+qy(mid+1,r,cur<<1|1)%q)%q; } int main() { while(cin>>n>>m>>q) { for(int i=1;i<=n;i++) cin>>a[i]; build(1,n,1); int x,y,z;ll k; while(m--) { cin>>x; if(x==1) { cin>>y>>z>>k; ux(y,z,1,k); } else if(x==2) { cin>>y>>z>>k; uj(y,z,1,k); } else { cin>>y>>z; cout<<qy(y,z,1)%q<<endl; } } } return 0; }

线段树这方面我的评价是多看板子,多做题,多上oiwiki,多玩原神

既然Merlin想听奇闻趣事 我简单说一说 首先,我在电脑上看的不是擦边网页(只是想从贾玲的经历中找一些坚持的动力,不知道这个的请反思自己春节期间在网上看什么),hl的电脑没有vpn啊!!!!!我一个禁欲系男神至于吗?! 其次,昨天我们棕名事件的后续:我中午利用宿舍的办公电话“公车上书”,肇事者当然遭到了hlgg的“关怀教育”,但是想到gg将会亲切地教育我们还是很激动的(毕竟晚上洗不成澡了)。~~在hl洗澡一定注意南通 。 ~~

说到洗澡也可以在这里说一说我们的寝室文化,309,310寝室可谓分工明确,一个谈了一晚上 *** (我还想要号),309则是尝试过4人挤在同一个澡间内(干什么我不说), 其中Merlin最为卓越地发现了电动牙刷的新作用(此处省略inf个字)。
名场面:递推算法https://images.cnblogs.com/cnblogs_com/blogs/815875/galleries/2374596/o_240219125932_image.png

2.20 书接上回,今天这个离谱的倍增可谓一言难尽啊! 同时,大雪封山那道题让我回到了年前折磨lyn的光辉岁月学习LCA的历程。有一说一,AC_love在LCA上属实有建树

“是不是你妈‘健康’对你影响太大了?” “你是不是‘母亲去世’了?”(‘’内的内容请自行脑补)

话不多说 简单附上板子 经典题目,genius acm
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,m,t,k; const ll maxn=10000005; ll a[maxn],tmp[maxn],tep[maxn]; bool check(int l,int r,int fin) { if(r>n) return 0; for(int i=l;i<=r;i++) tep[i]=a[i]; sort(tep+fin,tep+r+1); int h1=l,h2=fin,cnt=0,le=l,rr=r; while(h1<fin && h2<=r) { if(tep[h1]<=tep[h2]) tmp[++cnt]=tep[h1++]; else tmp[++cnt]=tep[h2++]; } while(h1<fin) tmp[++cnt]=tep[h1++]; while(h2<=r) tmp[++cnt]=tep[h2++]; ll sum=0; l=1,r=rr-le+1; for(int i=1;i<r && i<=m;i++,l++,r--) { sum+=pow((ll)(tmp[l]-tmp[r]),2); } if(sum<=k) for(int i=le,j=1;i<=rr;i++,j++) { a[i]=tmp[j]; } return sum<=k; } void work() { int ans=0,fin=0; cin>>n>>m>>k; for(int i=1;i<=n;i++) cin>>a[i]; while(1) { int L,R,p; L=R=fin+1; p=1;ans++; while(p>0) { if(check(L,R+p,R+1)) R+=p,p*=2; else p/=2; } if(R==n) break; fin=R; } cout<<ans<<endl; return ; } int main() { cin>>t; while(t--) work(); return 0; }

今天早上宿管阿姨那嘹亮的嗓音准时唤醒了我,让我找到了曾经惹怒我母上大人后一大早被扇醒的感觉。是谁在我睡着后聊到凌晨3点我不说。(此处关心一下咖啡免疫的snowycat1234)喝咖啡我主张高启强式

突然想起,敲代码时我在用耳机听谭咏麟的歌,不晓得MerlinLee认为我在听什么(doge。谁玩了一下午The Powder Toy我不说

在这里给未来的学弟学妹 (学妹留给Merlin) 几点建议

1,hl的高手绝对比廿四多很多,而且大多从小学开始着手oi,所以做好被虐的准备(似乎只有snowycat才有虐别人的资本)

2,hl食堂-1楼的鸡排和随机开在校园内小卖铺是为数不多可以满足北方人胃口的存在。

3,尤其小心南通

4,不要尝试在gg眼皮子底下用手机

5,饭卡充钱别充太多,否则如果丢了得不偿失。

6,hl好看的女生比较多,向身边的同学可以推荐一下。(对吧Merlin)

posted @ 2024-02-20 21:02  类人群星闪耀时  阅读(26)  评论(0编辑  收藏  举报