传送门

题意:定义一个无穷项的多项式f(x)f(x)f(x),初始各项系数都为0,现在有几种操作

  1. 将xLx^LxL到xRx^RxR这些项的系数乘上某个定值v

  2. 将xLx^LxL到xRx^RxR这些项的系数加上某个定值v

  3. 将xLx^LxL到xRx^RxR这些项乘上x变量

  4. 将某个定值v代入多项式F(x),并输出代入后多项式的值,之后多项式还原为代入前的状况

其中第四种操作不会出现超过10次。

N≤105,0≤L≤R≤105,0≤v≤109N\le10^5,0\le L\le R \le10^5,0 \le v\le10^9N≤105,0≤L≤R≤105,0≤v≤109


思路:

由于第四个操作不会出现超过101010次因此如果能快速维护各项系数可以O(n)O(n)O(n)遍历。

头两个操作是基操我们跳过吧qwqqwqqwq

主要看第三个操作,想象我们对x0x^0x0~x100001x^{100001}x100001这些项的系数用一棵平衡树来维护,这样操作三相当于将xrx^rxr的系数加到xr+1x^{r+1}xr+1上面,然后删掉这个xrx^rxr,然后把xlx^lxl ~xr−1x^{r-1}xr−1对应次数全部加111,然后插入一个新的系数为000的xlx^lxl。

于是这道题就做完了。

代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
inline int read(){
    #define gc getchar
    int ans=0;
    char ch=gc();
    while(!isdigit(ch))ch=gc();
    while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
    return ans;
    #undef gc
}
typedef long long ll;
typedef pair<int,int> pii;
const int N=2e5+5,mod=20130426;
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int mul(const int&a,const int&b){return (ll)a*b%mod;}
int pw[N],ans,n=100001;
namespace bst{
    #define lc (son[p][0])
    #define rc (son[p][1])
    int val[N],coe[N],siz[N],det[N],ad[N],ml[N],son[N][2],rd[N],rt=0,tot=0;
    inline int get(int v){return val[++tot]=v,siz[tot]=ml[tot]=1,rd[tot]=rand(),tot;}
    inline void pushup(int p){siz[p]=siz[lc]+1+siz[rc];}
    inline void pushval(int p,int v){if(!p)return;val[p]+=v,det[p]+=v;}
    inline void pushnow(int p,int v1,int v2){if(!p)return;coe[p]=add(mul(coe[p],v1),v2),ad[p]=add(mul(ad[p],v1),v2),ml[p]=mul(ml[p],v1);}
    inline void pushdown(int p){
        if(det[p]){
            if(lc)pushval(lc,det[p]);
            if(rc)pushval(rc,det[p]);
            det[p]=0;
        }
        if(ad[p]||ml[p]!=1){
            if(lc)pushnow(lc,ml[p],ad[p]);
            if(rc)pushnow(rc,ml[p],ad[p]);
            ml[p]=1,ad[p]=0;
        }
    }
    inline int merge(int a,int b){
        if(!a||!b)return a+b;
        pushdown(a),pushdown(b);
        if(rd[a]>rd[b])return son[a][1]=merge(son[a][1],b),pushup(a),a;
        return son[b][0]=merge(a,son[b][0]),pushup(b),b;
    }
    inline pii split(int p,int k){
        if(!p)return pii(0,0);
        pii tmp;
        pushdown(p);
        if(siz[lc]>=k)return tmp=split(lc,k),lc=tmp.se,pushup(p),pii(tmp.fi,p);
        return tmp=split(rc,k-siz[lc]-1),rc=tmp.fi,pushup(p),pii(p,tmp.se);
    }
    inline void insert(int id,int v){
        pii x=split(rt,id-1);
        rt=merge(x.fi,merge(get(v),x.se));
    }
    inline void build(int&p,int l,int r){
        if(l>r)return;
        int mid=l+r>>1;
        if(l==r){p=get(l-1);return;}
        p=get(mid-1),build(lc,l,mid-1),build(rc,mid+1,r),pushup(p);
    }
    inline void update(int l,int r,int v1,int v2){
        pii x=split(rt,l-1),y=split(x.se,r-l+1);
        pushnow(y.fi,v1,v2),rt=merge(x.fi,merge(y.fi,y.se));
    }
    inline void modify(int l,int r){
        pii x=split(rt,l-1),y=split(x.se,r-l+2),z=split(y.fi,r-l),t=split(z.se,1);
        coe[t.se]=add(coe[t.se],coe[t.fi]),pushval(z.fi,1),rt=merge(x.fi,merge(merge(z.fi,t.se),y.se));
        insert(l,l-1);
    }
    inline void query(int p){
        ans=add(ans,mul(pw[val[p]],coe[p]));
        pushdown(p);
        if(lc)query(lc);
        if(rc)query(rc);
    }
    #undef lc
    #undef rc
}
char s[5];
int main(){
    srand(time(NULL));
    bst::build(bst::rt,1,n+1);
    for(ri tt=read(),l,r,v;tt;--tt){
        scanf("%s",s);
        if(s[0]=='a'){
            l=read()+1,r=read()+1,v=read()%mod;
            bst::update(l,r,1,v);
        }
        if(s[0]=='m'&&strlen(s)==3){
            l=read()+1,r=read()+1,v=read()%mod;
            bst::update(l,r,v,0);
        }
        if(s[0]=='m'&&strlen(s)==4){
            l=read()+1,r=read()+1;
            bst::modify(l,r);
        }
        if(s[0]=='q'){
            v=read();
            pw[0]=1;
            ans=0;
            for(ri i=1;i<=n;++i)pw[i]=mul(pw[i-1],v);
            bst::query(bst::rt);
            cout<<ans<<'\n';
        }
    }
    return 0;
}

2019.03.29 bzoj3323: [Scoi2013]多项式的运算(非旋treap)的更多相关文章

  1. BZOJ3323: [Scoi2013]多项式的运算

    3323: [Scoi2013]多项式的运算 Time Limit: 12 Sec  Memory Limit: 64 MBSubmit: 128  Solved: 33[Submit][Status ...

  2. SCOI2013 多项式的运算

    ---恢复内容开始--- 又是一道裸数据结构题. 之前受序列操作的蛋疼写法影响,只用一个tag,不知道怎么记,之后看了下别人的,终于领悟要用两个tag,一个add,一个mul,维护相当简单,想清楚就行 ...

  3. 2019.03.29 bzoj5463: [APIO2018] 铁人两项(圆方树+树形dp)

    传送门 题意简述:给你一张无向图,问你满足存在从a−>b−>ca->b->ca−>b−>c且不经过重复节点的路径的有序点对(a,b,c)(a,b,c)(a,b,c) ...

  4. 2019.03.29 NOIP训练 友好国度(点分治+容斥)

    传送门 思路: 直接上点分治+容斥计算每个因数对应的贡献即可. 代码: #include<bits/stdc++.h> #define ri register int using name ...

  5. 2019.03.28 bzoj3326: [Scoi2013]数数(数位dp)

    传送门 题意: 一个人数数,规则如下: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串,列出该字符串的所有连续子串对应的B进制数的值. 对所有列 ...

  6. 2019.03.28 bzoj3322: [Scoi2013]摩托车交易(kruskal重构树+贪心)

    传送门 题意咕咕咕 思路: 先把所有可以列车通的缩成一个点,然后用新图建立kruskalkruskalkruskal重构树. 这样就可以倒着贪心模拟了. 代码: #include<bits/st ...

  7. 2019.03.28 bzoj3325: [Scoi2013]密码(manacher+模拟)

    传送门 题意: 现在有一个nnn个小写字母组成的字符串sss. 然后给你nnn个数aia_iai​,aia_iai​表示以sis_isi​为中心的最长回文串串长. 再给你n−1n-1n−1个数bib_ ...

  8. LUOGU3278 [SCOI2013]多项式的运算

    一次AC.吼啊. BZOJ权限QAQ 区间加和乘打标记,区间乘x就是区间移动,平衡树解决即可. 查询直接遍历一遍然后算出来 // It is made by XZZ #include<cstdi ...

  9. 2019.03.29 读书笔记 关于params与可选参数

    void Method1(string str, object a){} void Method2(string str, object a,object b) { } void Method3(st ...

随机推荐

  1. 【Debug】串口发送数据时部分字节被拉长,出现帧错误,原因MCU进入低功耗模式导致串口时钟停了!

    串口发送数据时部分字节被拉长,出现帧错误,原因MCU进入低功耗模式导致串口时钟停了!

  2. ubuntu中文乱码解决

    首先,安装中文支持包language-pack-zh-hans: $ sudo apt-get install language-pack-zh-hans 然后,修改/etc/environment( ...

  3. CentOS6.3上搭建expect无交互开发环境

    1.背景 在面向shell编程时对于需要交互的场合则必须通过人工来干预,而对于这种方式是违反无人职守的原则:现在expect就解决了这个问题, Expect是一个免费的编程工具语言,用来实现自动和交互 ...

  4. C# 小算法1

    //判断 第一条的 ‘叶子2’ 在 第二条 数据中的 索引 //任河特大桥,右幅,叶子2,桩基混凝土, //任河特大桥,,,,,右幅,,,叶子2,桥墩, string str1 = "任河特 ...

  5. 2019/2/11 LinuxRPM包管理

    一.RPM安装包管理: a.yum install  …… ,  yum remove ……,    yum update ……  , b.只下载安装包而不安装:yum install -y 包名 - ...

  6. Java框架spring 学习笔记(七):Spring相关概念

    Spring是开源.轻量级.一站式框架. Spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码实现. ioc:控制反转,把对象的创建交给Spring进行配置,比如一个类,在类里面有 ...

  7. docker学习-lnmp+redis之搭建redis容器服务

    1. 目录映射:/lnmp/data/redis:/data/lnmp/conf/redis/redis.conf:/etc/redis/redis.conf/lnmp/logs/redis:/var ...

  8. mysql 创建备份表

    mysql 中对已有表进行备份用到的语句 CREATE TABLE table_name_1  SELECT * FROM table_name_2; 这个语句是创建表1并且复制表2的结构和数据到表1 ...

  9. HTTPClient to use http/https protocol to send request

    使用了spring boot, gradle, commons-httpcomponent3. 目前httpclient 已经有了版本4. https://github.com/lvfe/httpCl ...

  10. typename的用法

    template <class T> void foo() { typename T::iterator * iter; } class ContainsAType{ public: cl ...