---恢复内容开始---

又是一道裸数据结构题。

之前受序列操作的蛋疼写法影响,只用一个tag,不知道怎么记,之后看了下别人的,终于领悟要用两个tag,一个add,一个mul,维护相当简单,想清楚就行。

简单说下解法。

add mul就是一般的将[L,R]split出来然后打tag.

mulx:我将[L,R+1]split出来,然后这一段split成l:[L,R-1],mid:[R,R],r[R+1,R+1],然后把mid的系数加到r上,把mid的系数赋为0,然后merge(mid,l,r);这里注意如果L==R将会出现问题,于是这里我特判了一下。

还是就是见乘就得加long long.....

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int Maxn=+,Mod=,MaxR=;
int _a[Maxn],cnt;
inline void fadd(int&a,int b){
a+=b;if(a>Mod)a-=Mod;
}
struct node{
int v,sz,add,mul;//itself isn't in it
node*ch[];
node(){
sz=v=add=;mul=;
}
inline void maintain(){
sz=ch[]->sz+ch[]->sz+;
}
inline int cmp(int k){
if(ch[]->sz+==k)return -;
return k>ch[]->sz+;
}
inline void AddTag(int Add,int Mul){
v=(long long)v*Mul%Mod;
fadd(v,Add);
mul=(long long)mul*Mul%Mod;//注意long long
add=(long long)add*Mul%Mod;//注意long long
fadd(add,Add);
}
inline void down(){
ch[]->AddTag(add,mul);
ch[]->AddTag(add,mul);
add=;mul=;
}
}da[Maxn],*root,*null;int tot;
inline void rotate(node*&o,int d){
node*t=o->ch[d];
o->ch[d]=t->ch[d^];
t->ch[d^]=o;
o->maintain();
(o=t)->maintain();
}
void splay(node*&o,int k){
o->down();
int d=o->cmp(k);
if(d==-)return;
if(d)k-=o->ch[]->sz+;
node*&p=o->ch[d];
p->down();
int d2=p->cmp(k);
if(d2!=-){
if(d2)k-=p->ch[]->sz+;
splay(p->ch[d2],k);
if(d2!=d)rotate(p,d2);
else rotate(o,d);
}
rotate(o,d);
}
void build(node*&o,int l,int r){
if(l>r){
o=null;
return;
}
int mid=(l+r)>>;
o=da+ ++tot;
build(o->ch[],l,mid-);
build(o->ch[],mid+,r);
o->maintain();
}
void print(node*o){
if(o==null)return;
o->down();
print(o->ch[]);
++cnt;
if(cnt>= && cnt<=MaxR+)_a[cnt-]=o->v;
// printf("%d\n",o->v);
print(o->ch[]);
}
inline int calc(int x,const int*a){
int ret=a[MaxR];
for(int i=MaxR;i>=;i--){
ret=(long long)ret*x%Mod;
fadd(ret,a[i]);
}
return ret;
}
inline void split(node*o,int k,node*&l,node*&r){
splay(o,k);
r=o->ch[];
(l=o)->ch[]=null;
l->maintain();
}
inline node*merge(node*l,node*r){
splay(l,l->sz);
l->ch[]=r;
l->maintain();
return l;
}
int get_tp(char *opt){
if(opt[]=='a')return ;
if(opt[]=='m')return opt[]?:;
return ;
}
int main(){
freopen("polynomial.in","r",stdin);
freopen("polynomial.out","w",stdout); int tp,L,R,V,n;
null=da;
null->ch[]=null->ch[]=null;
build(root,,MaxR+);
node*o,*l,*r,*mid;
char opt[]={};
for(scanf("%d\n",&n);n--;){
scanf("%s",opt);
tp=get_tp(opt);
if(tp<=){
scanf("%d%d%d",&L,&R,&V);V%=Mod;
split(root,L+,l,o);
split(o,R-L+,mid,r);
if(tp==)mid->AddTag(V,);
else mid->AddTag(,V);
root=merge(merge(l,mid),r);
}
else if(tp==){
scanf("%d%d",&L,&R);
split(root,L+,l,o);
split(o,R-L+,mid,r);
if(R==L){//这里必须特判
splay(mid,);
mid->down();
mid->ch[]->down();
fadd(mid->ch[]->v,mid->v);
mid->v=;
}else{
node*_o,*_l,*_r,*_mid;
split(mid,mid->sz-,_l,_o);
split(_o,,_mid,_r);
_mid->down();
_r->down();
fadd(_r->v,_mid->v);
_mid->v=;
mid=merge(merge(_mid,_l),_r);
}
root=merge(merge(l,mid),r);
}
else {
scanf("%d",&V);V%=Mod;
cnt=;
print(root);
printf("%d\n",calc(V,_a));
}
} return ;
}

SCOI2013 多项式的运算的更多相关文章

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

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

  2. 2019.03.29 bzoj3323: [Scoi2013]多项式的运算(非旋treap)

    传送门 题意:定义一个无穷项的多项式f(x)f(x)f(x),初始各项系数都为0,现在有几种操作 将xLx^LxL到xRx^RxR这些项的系数乘上某个定值v 将xLx^LxL到xRx^RxR这些项的系 ...

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

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

  4. luogu3278/bzoj3323 多项式的运算 (splay)

    mulx的操作,其实就是给r+1的系数+=r的系数,然后删掉r,把l~r-1向右移一位,再插一个0到原来的位置 splay维护区间加和区间乘就好了 (一定要注意做事的顺序,一件事都做完了再去做别的,否 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. MATLAB符号运算 分类: 图像处理 2015-07-31 22:53 3人阅读 评论(0) 收藏

    1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x; >> expand((x+3)^3) an ...

  7. MATLAB符号运算

    1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x;>> expand((x+3)^3) ans ...

  8. 多项式相关&&生成函数相关&&一些题目(updating...)

    文章目录 多项式的运算 多项式的加减法,数乘 多项式乘法 多项式求逆 多项式求导 多项式积分 多项式取对 多项式取exp 多项式开方 多项式的除法/取模 分治FFT 生成函数 相关题目 多项式的运算 ...

  9. java-四则运算二

    1.实验目的:是否有乘除法,括号,多项式运算. 2.思路:利用简单的循环switch语句进行循环输出随机数 3.程序源代码: package jiajianchengchu; import java. ...

随机推荐

  1. ITEXTSHARP学习整理

    学习的版本iTextSharp.5.5.5. 关于获取PDF中的图片资源 /// <summary> /// 将PDF中的图片资源转换成二进制 /// </summary> / ...

  2. Direct 2D实现界面库 (1)

    大学时尝试过很多次写一个UI库, 初次使用 GDI 绘图, 当时水平很低, GDI功能太弱, 以失败而告终. 之后使用 GDI+ 绘图, 当时水平依旧很低, GDI功能很强, 但效率实在太慢, 以失败 ...

  3. .getBoundingClientRect()

    .getBoundingClientRect() 该方法获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置,他返回的是一个对象,即Object,该对象有4个属性:top,left,right, ...

  4. 解决IE6不支持position:fixed;的问题

    在网页设计中,时常要用到把某个元素始终定位在屏幕上,即使滚动浏览器窗口也不会发生变化. 一般我们会使用position:fixed来进行绝对固定,但IE6并不支持position:fixed属性,所以 ...

  5. 假金币问题-PKUacm1029-ACM

    假金币 “Gold Bar”银行收到可靠消息:在前次的N 个金币中有一枚重量不同的假金币(其他金币的重量都相同).经济危机之后他们只有一台天平可用.用这台天平,可以称量出左边托盘中的物体是轻于.重于或 ...

  6. 局部变量存储区域静态变量存储区域static变量存储区域

    局部变量存储区域静态变量存储区域static变量存储区域 常见的存储区域可分为: 1.栈 由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 2.堆 ...

  7. PHP Cookie学习

    <?php /* Cookie在计算机中保存的格式 用户名@网站地址[数字].txt Cookie在文件夹下,每个Cookie文件都是一个简单而又普通的文件件而不是程序,Cookie中的内容大多 ...

  8. Asp.Net Mvc - 在OnResultExecut* 拦截Action返回的HTML

    在Asp.Net MVC项目中通过重写ActionFilterAttribute中的方法,我们就可以在轻松的在Action方法执行前后做一些特殊的操作如:[身份认证.日志记录.内容截取等]. 但是我们 ...

  9. SharePoint 获取Lookup 字段的值

    获取某个List里的Lookup字段的值是很普遍的事,那么我们将它封装起来 获取Lookup字段值的方法: /// <summary> /// To get lookup field Id ...

  10. 访问Github过慢解决

    在这个地址查找响应最快的地址:http://tool.chinaz.com/dns?type=1&host=assets-cdn.github.com&ip= 查找:assets-cd ...