首页 > 其他分享 >P4247 [清华集训2012]序列操作

P4247 [清华集训2012]序列操作

时间:2024-10-22 14:24:55浏览次数:1  
标签:leq int sum tree define P4247 2012 集训 mod

题目描述

有一个长度为\(n\)的序列,有三个操作:

  1. I a b c表示将\([a,b]\)这一段区间的元素集体增加\(c\);
  2. R a b表示将\([a,b]\)区间内所有元素变成相反数;
  3. Q a b c表示询问\([a,b]\)这一段区间中选择\(c\)个数相乘的所有方案的和\(\mod 19940417\)的值。

对于100%的数据,\(n \leq 50000, q \leq 50000\),初始序列的元素的绝对值\(\leq 10^9\),保证\([a,b]\)是一个合法区间,I操作中\(|c| \leq 10^9\),Q操作中\(1 \leq c \leq \min(b-a+1,20)\)。

思路

\(1.\) 区间加,线段树基础操作。

\(2.\) 取反,显而易见奇变偶不变。

\(3.\) 查询,发现 \(c\) 的值域很小,我们可直接维护答案。

细节

\(1.\)上传 \(pushup\)

考虑 DP

\(f_{l,r,c}=f_{l,mid,i}* f_{mid+1,r,j}(i+j=c)\)

\(2.\)区间加时更新答案

手写几项展开可发现

\(f_{l,r,c}= \sum\limits_{i=0}^{c}f_{l,r,i} \cdot x^{c-i}\cdot C_{r-l+1-i}^{c-i}\)

可先预处理出杨辉三角形

\(3.\)标记优先级

取反时,要将加标记取反。

取反先于加法

固定模数一定要加const!!!!!

2 h就废在这上面了(算是首黑纪念了

Code

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define Ld long double
#define l(p) tree[p].l
#define r(p) tree[p].r
#define sum(p,k) tree[p].sum[k]
#define chg(p) tree[p].chg
#define add(p) tree[p].add
const int N = 60005,M=20005,mod=19940417;

int n,q,y,l,r,pos;                  `
LL c[N][25],d[50],x;
char op[2];
struct Segment_tree{
    int l,r,chg;
    LL sum[25],add;
}tree[N*4];

inline int min(int a,int b){
    return a<b?a:b
}
inline LL readc(){
    char ch=getchar();
    while(!((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))) ch=getchar();
    return ch;
}
inline LL read(){
    LL s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+ch-'0';ch=getchar();}
    return s*w;
}
inline void print(LL x){
    char F[200];LL cnt=0;
    if(x==0){putchar('0');putchar('\n');return ;}
    if(x<0){putchar('-');x=-x;}
    while(x){F[++cnt]=x%10;x/=10;}
    while(cnt) putchar(F[cnt--]+'0');
    putchar('\n');return ;
}

void ad(int p,int k){
    if(!k||!p) return ;
    int l1=min(20,r(p)-l(p)+1);
    d[0]=1;
    for(int i=1;i<=l1;i++) d[i]=(d[i-1]*k)%mod;
    for(int i=l1;i>=1;i--){
        for(int j=0;j<i;j++){
            sum(p,i)=(sum(p,i)+((sum(p,j)*d[i-j]%mod)*c[r(p)-l(p)+1-j][i-j])%mod)%mod;
        }
    }
    add(p)=(add(p)+k)%mod;
    return ;
}

void ch(int p){
    if(!p) return ;
    for(int i=1;i<=min(20,r(p)-l(p)+1);i+=2)
    sum(p,i)=(mod-sum(p,i))%mod;
    add(p)=(mod-add(p))%mod;
    chg(p)^=1;
    return ;
}

void pushup(int p){
    int l1=min(20,r(p)-l(p)+1),l2=min(20,r(p<<1)-l(p<<1)+1),l3=min(20,r(p<<1|1)-l(p<<1|1)+1);
    for(int i=0;i<=l1;i++) sum(p,i)=0;
    for(int i=0;i<=l2;i++)
    for(int j=0;j<=l3;j++){
        if(i+j>20) break;
        sum(p,i+j)=(sum(p,i+j)+sum(p<<1,i)*sum(p<<1|1,j)%mod)%mod;
    }
    return ;
}

void pushdown(int p){
    if(chg(p)){
        ch(p<<1);ch(p<<1|1);
        chg(p)=0;
    }
    if(add(p)){
        ad(p<<1,add(p));
        ad(p<<1|1,add(p));
        add(p)=0;
    }
    return ;
}

void build(int p,int l,int r){
    l(p)=l,r(p)=r;
    sum(p,0)=1;
    if(l==r){
        sum(p,1)=(read()%mod+mod)%mod;
        return ;
    }
    int mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    pushup(p);
    return ;
}

void change(int p,int l,int r,LL x,LL op){
    if(l(p)>=l&&r(p)<=r){
        if(op==1)
            ad(p,x);
        else
            ch(p);
        return ;
    }
    pushdown(p);
    int mid=(l(p)+r(p))>>1;
    if(l<=mid) change(p<<1,l,r,x,op);
    if(r>mid) change(p<<1|1,l,r,x,op);
    pushup(p);
    return ;
}

Segment_tree merge(Segment_tree ls,Segment_tree rs,int x){
    x=20;
    Segment_tree now;
    now.r=rs.r,now.l=ls.l;
    int l1=min(x,now.r-now.l+1),l2=min(x,ls.r-ls.l+1),l3=min(x,rs.r-rs.l+1);
    for(int i=0;i<=l1;i++) now.sum[i]=0;
    for(int i=0;i<=l2;i++)
    for(int j=0;j<=l3;j++){
        if(i+j>x) break;
        now.sum[i+j]=(now.sum[i+j]+ls.sum[i]*rs.sum[j]%mod)%mod;
    }
    return now;
}

Segment_tree query(int p,int l,int r,int x){
    if(l(p)>=l&&r(p)<=r) return tree[p];
    pushdown(p);
    LL mid=(l(p)+r(p))>>1;
    if(r<=mid) return query(p<<1,l,r,x);
    else
    if(l>mid) return query(p<<1|1,l,r,x);
    else return merge(query(p<<1,l,r,x),query(p<<1|1,l,r,x),x);
}

int main(){
    n=read(),q=read();
    c[0][0]=1;c[1][0]=1;c[1][1]=1;
    for(int i=2;i<=N-5;i++){
        c[i][0]=1;
        for(int j=1;j<=min(20,i);j++){
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
        }
    }
    build(1,1,n);
    for(int i=1;i<=q;i++){
        cin>>op;l=read(),r=read();
        if(op[0]=='I'){
            x=read();
            x%=mod;
            change(1,l,r,(x+mod)%mod,1);
        }else
        if(op[0]=='R'){
            change(1,l,r,0,0);
        }else
        if(op[0]=='Q'){
            x=read();
            print((query(1,l,r,x).sum[x]+mod)%mod);
        }
    }
    return 0;
}

发布时间:2022-11-16 18:45

标签:leq,int,sum,tree,define,P4247,2012,集训,mod
From: https://www.cnblogs.com/xingke233/p/18492616

相关文章

  • 【题解】Solution Set - NOIP2024集训Day58 字符串
    【题解】SolutionSet-NOIP2024集训Day58字符串https://www.becoder.com.cn/contest/5658「CF1466G」SongoftheSirens考虑对于\(s_i\),算钦定必须覆盖到\(t_i\)的匹配个数\(f_i\)。注意到\(s\)每次长度都会\(\times~2\)左右,其长度在\(O(\log|w|)\)的时候就......
  • CSP2024 前集训:csp-s模拟12
    前言咕了好久才写,当时又发烧了所以没有交。虽然有两道签,但一道时计算几何一道放了T4都没打,T1赛时猜到结论和先看T4的都赢麻了,T1赛时\(π\)只会背倒第九位精度炸了暴力都不对。剩下的题当天太难受了都没改,改的两道都是specialjudge哎?T1小h的几何九点圆圆心的证......
  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛10
    前言不想说啥了最简单的一题是紫,去死吧只改了T1、T2,T2原题翻译和赛时题面描述都很唐,赛后断断续续加了好多hack。T1岛屿设\(f_{a,b}\)表示\(a\)条两端同色链,\(b\)条两端异色链时连通块数量的期望。红红蓝蓝相连得到红蓝\(\tof_{a-1,b+1}\)。红红红蓝相连得到红红......
  • [POI2012] Cloakroom - Solution
    POI2012Cloakroom题目描述(搬自洛谷)有\(n\)件物品,每件物品有三个属性\(a_i,b_i,c_i\(a_i<b_i)\)。再给出\(q\)个询问,每个询问由非负整数\(m,k,s\)组成,问是否能够选出某些物品使得:对于每个选的物品\(i\),满足\(a_i\lem\)且\(b_i>m+s\)。所有选出物品的\(c_i......
  • NOIP2024集训Day57 哈希
    NOIP2024集训Day57哈希A.[CF213E]TwoPermutations考虑到都是排列,值域连续,于是\(a\)都加\(x\)之后相当于在值域上平移了一段,也是连续的。由于要进行比较,个很容易想到哈希。\(a\)的哈希值很好维护,每次平移一位加上\(\sumbase^i\)即可。考虑如何快速取出\(b\)中在......
  • 新高一暑假第一期集训恢复性训练【数据结构-并查集】(补)
    新高一暑假第一期集训恢复性训练【数据结构-并查集】(补)C.[POJ1417]TrueLiars先将题目中的好人和坏人转换一下,也即是如果\(x\)说\(y\)是好人,则他们两属于同一组,反之则不属于同一组。然后我们可以想到带权的并查集,用\(val_x\)代表\(x\)与其父节点的关系,当\(val_x\)......
  • Plain-Det:同时支持多数据集训练的新目标检测 | ECCV'24
    近期在大规模基础模型上的进展引发了对训练高效大型视觉模型的广泛关注。一个普遍的共识是必须聚合大量高质量的带注释数据。然而,鉴于计算机视觉中密集任务(如目标检测和分割)标注的固有挑战,实际的策略是结合并利用所有可用的数据进行训练。论文提出了Plain-Det,提供了灵活性以适应......
  • 【题解】Solution Set - NOIP2024集训Day57 字符串
    【题解】SolutionSet-NOIP2024集训Day57字符串https://www.becoder.com.cn/contest/5653「CF213E」TwoPermutations「CF961F」k-substrings「CF580E」KefaandWatch「CF504E」MishaandLCPonTree......
  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛08
    前言先痛骂没良心出题人,T1\(n\sqrtn\)多大你刚好给多大,一点不多给,T2才是签到题,因为放了T2位置打了暴力就去想T3了,我是唐氏,谁让你T1、T2swap的?T3实则三道题。但是还是感觉T1更简单啊,\(5e4\)搁哪儿摆着呢一眼\(O(n\sqrtn)\),甚至空间也是这么多,太明显了。挂分挂......
  • 2024 CCPC第五届辽宁省程序设计竞赛 集训1
    A.左移#include<bits/stdc++.h>usingnamespacestd;intmain(){intT;cin>>T;while(T--){strings;cin>>s;intans=-1;if(s.front()==s.back())ans=0;else{......