首页 > 其他分享 >板子

板子

时间:2023-10-13 13:55:59浏览次数:26  
标签:pre int long 板子 add chen mod

线段树

#include<bits/stdc++.h>
using namespace std;
struct node {
    int l,r;
    long long pre,add,chen;
} t[1000000];
long long a[1000000];
long long n,m,mod;
void build(int p,int l,int r) {
    t[p].l=l;
    t[p].r=r;
    t[p].chen=1;
    if(l==r) {
        t[p].pre=a[l]%mod;
        return ;

    }
    long long mid=(l+r)>>1;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
}

void spread(long long p) {
    t[p*2].pre=(t[p*2].pre*t[p].chen+(t[p].add*(t[p*2].r-t[p*2].l+1))%mod)%mod;
    t[p*2+1].pre=(t[p*2+1].pre*t[p].chen+(t[p].add*(t[p*2+1].r-t[p*2+1].l+1)%mod))%mod;
    
    t[p*2+1].add=(t[p].add+(t[p*2+1].add*t[p].chen))%mod;
    t[p*2].add=(t[p].add+t[p*2].add*t[p].chen)%mod;

    t[p*2].chen=(t[p*2].chen*t[p].chen)%mod;
    t[p*2+1].chen=(t[p*2+1].chen*t[p].chen)%mod;
    
    t[p].chen=1;
    t[p].add=0;
    return ;
}
void change(int p,int x,int y,int z) {

    if(t[p].l>=x&&t[p].r<=y) {
        t[p].pre=(t[p].pre+z*(t[p].r-t[p].l+1))%mod;
        t[p].add=(t[p].add+z)%mod;
        return ;
    }
    spread(p);
    int mid=(t[p].r+t[p].l)>>1;
    if(x<=mid)change(p*2,x,y,z);
    if(y>mid)change(p*2+1,x,y,z);
    t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
    return ;
}
void change2(int p,int x,int y,int z) {
    if(t[p].l>=x&&t[p].r<=y) {
        t[p].add=(t[p].add*z)%mod;

        t[p].pre*=z;
        t[p].pre%=mod;

        t[p].chen*=z;
        t[p].chen%=mod;
        return ;
    }
    spread(p);
    int mid=(t[p].r+t[p].l)>>1;
    if(x<=mid)change2(p*2,x,y,z);
    if(y>mid)change2(p*2+1,x,y,z);
    t[p].pre=t[p*2].pre+t[p*2+1].pre;
    return ;
}
long long query(int p,int x,int y) {
    if(x<=t[p].l&&t[p].r<=y)return t[p].pre%mod;
    spread(p);
    int mid=(t[p].r+t[p].l)>>1;
    long long ans=0;
    if(x<=mid)ans+=query(p*2,x,y)%mod;
    if(y>mid)ans+=query(p*2+1,x,y)%mod;
    ans%=mod;
    return ans;
}
int main() {
    
    scanf("%d%d%d",&n,&m,&mod);
    for(int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    for(int i=1; i<=m; i++) {
        int q;
        scanf("%d",&q);
        if(q==2) {
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            change(1,x,y,k);
        }
        else if(q==1) {
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            change2(1,x,y,k);
        } else {
            int x,y;
            scanf("%d%d",&x,&y);
            cout<<query(1,x,y)<<endl;
        }
    }
    return 0;

}
线段树

ST表

#include<bits/stdc++.h> 
using namespace std;
int n;

int q;
int dp1[100005][100];
int h[1000000];
void work1( ){
    for(int i=1;i<=n;i++)dp1[i][0]=h[i];
    for(int i=1;(1<<i)<=n;i++){
        for(int j=1;j+(1<<i)-1<=n;j++){
            dp1[j][i]=max(dp1[j][i-1],dp1[j+(1<<(i-1))][i-1]);
        }
    }
    return ;
}
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-48;ch=getchar();}
    return x*f;
}
int RMQ1(int l,int r){
    int k=0;
    while((1<<k+1)<=(r-l+1))k++;
    
    return max(dp1[l][k],dp1[r-(1<<k)+1][k]);
}

int main(){
n=read();
q=read();
for(int i=1;i<=n;i++){
    cin>>h[i];
}
work1();

for(int i=1;i<=q;i++){
    int a,b;
    a=read();
    b=read();
    printf("%d\n",RMQ1(a,b));
}
    return 0;
}
ST表

快读

#include<bits/stdc++.h>
using namespace std;
int read(){
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^8),ch=getchar();
    return x;
}
int n;
int a[1000000];
int main() {
cin>>n;
for(int i=1;i<=n;i++){
    a[i]=read();
}
    return 0;

}
快读

 

标签:pre,int,long,板子,add,chen,mod
From: https://www.cnblogs.com/yeahhhhhh/p/17649672.html

相关文章

  • 各种OI板子
    以下内容不定时更新,想到啥写啥。。读写优化快读codetemplate<classT>inlinevoidread(T&res){ charch=getchar();boolf=0;res=0; for(;!isdigit(ch);ch=getchar())f|=ch=='-'; for(;isdigit(ch);ch=getchar())res=(res<<1)+......
  • xcpc自用板子
    Bellman-Ford最短路O(nm)intINF=0x3f3f3f3f; structedge{intfrom,to,cost;}edges[12405]; intn,m; edgees[1000]; intd[2510];  voidshortest_path(ints){      for(inti=0;i<=n;i++){             d[i]=INF;     ......
  • LCT板子
    //我坚信LCT可以平替树剖#include<bits/stdc++.h>#definelst[o].ch[0]#definerst[o].ch[1]#defineintlonglongusingnamespacestd;constintN=500010;constintinf=1e9;intread(){intx=0,f=1;charch=getchar();while(ch<48||ch>57......
  • 多项式板子
    FFTconstdoublepi=acos(-1.0);intrev[N];voidFFT(complex<double>*a,intnr,intflag){for(inti=0;i<nr;i++){if(i<rev[i])swap(a[i],a[rev[i]]);}for(inti=1;i<nr;i<<=1){complex<double>wn(cos(p......
  • 【学习笔记】(13) 平衡树——记住不的板子
    TreapSplay无旋Treap——fhqtreap简介就是没有旋转操作的Treap,一些性质什么的都跟Treap类似。算法介绍(1)merge(x,y)将两棵“有序”(x中元素的权值最大值小于y中元素权值最小值)的Treap合并成一棵。intch[N][2],sz[N],pri[N],val[N];//val为权值,pri为优先级,sz......
  • 板子
    图论Tarjan求强连通分量intn,m,tot,top,cnt;intdfn[N],low[N];intq[N],ins[N],c[N];vector<int>eg[N],scc[N],neg[N];intcd[N];voidtarjan(intu){dfn[u]=low[u]=++tot;q[++top]=u,ins[u]=1;for(autox:eg[u]){if(!dfn[x]){......
  • 字符串哈希板子
    字符串哈希板子http://oj.daimayuan.top/course/7/problem/485单哈希#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;constintp=9999971,base=101;intn,m;chara[N],b[N];//字符串a,bintha[N],hb[N],c[N];//ha是a的哈希函数,hb是b的哈希......
  • CF70D Professor's task 题解 & 动态凸包板子
    CF70DProfessor'stask题解前言此篇题解用的是\(Andrew\),不想看这种做法的可以绕道。题意动态凸包板子题。维护动态凸包。两种操作,加一个点或查询一个点是否在凸包内。题解首先你得会静态二维凸包。维护二维凸包的方法挺多的,比如什么\(Andrew\)算法,\(Jarvis\)算法还......
  • 一点板子
    快读、关同步intread(){intf=1,x=0;charc=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}returnx*f;}ios::s......
  • 板子
    LCTstructLinkCutTree{structNode{intch[2];intfa;intrev_tag;//...};vector<Node>tree;map<pair<int,int>,bool>edge;voidinit(intn/*...*/){tree.resize(n......