BZOJ3323: [Scoi2013]多项式的运算
3323: [Scoi2013]多项式的运算
Time Limit: 12 Sec Memory Limit: 64 MB
Submit: 128 Solved: 33
[Submit][Status]
Description
Input
接下来n 行,每行一个操作,格式如下:
mul L R v 代表第一种操作
add L R v 代表第二种操作
mulx L R 代表第三种操作
query v 代表第四种操作
对于30% 的数据:N <= 5000,0 <= L <= R <= 5000,0 <= v <= 10^9
另有20% 的数据:N <= 10^5,0 <= L <= R <= 10^5,0 <= v <= 10^9,没有mulx 操作
剩下的50% 的数据:N <= 10^5,0 <= L <= R <= 10^5,0 <= v <= 10^9
Output
Sample Input
add 0 1 7
query 1
mul 0 1 7
query 2
mulx 0 1
query 3
Sample Output
147
588
Hint
操作一之后,多项式为F(x) = 7x + 7。
操作三之后,多项式为F(x) = 49x + 49。
操作五之后,多项式为F(x) = 49x^2 + 49x。
HINT
应上传者要求,此系列试题不公开,如有异议,本站将删除之。
Source
题解:
splay
比较麻烦的是第三种操作,我们将r与r+1的系数合并,然后在l处插入一个0,就完成了系数的平移。orz jcvb!
然后第四种操作暴力遍历树就可以了
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 1000000+100
#define maxm 100000+100
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define mod 20130426
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int q,rt,t1,t2,tot,s[maxn],c[maxn][],fa[maxn];
ll v[maxn],t[maxn][],ans,base;
inline void pushup(int x)
{
s[x]=s[c[x][]]+s[c[x][]]+;
}
inline void rotate(int x,int &k)
{
int y=fa[x],z=fa[y],l=c[y][]==x,r=l^;
if(y!=k)c[z][c[z][]==y]=x;else k=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
pushup(y);pushup(x);
}
inline void splay(int x,int &k)
{
while(x!=k)
{
int y=fa[x],z=fa[y];
if(y!=k)
{
if(c[z][]==y^c[y][]==x)rotate(x,k);else rotate(y,k);
}
rotate(x,k);
}
}
inline void update(int x,ll xx,ll yy)
{
if(!x)return;
(v[x]=v[x]*yy+xx)%=mod;
((t[x][]*=yy)+=xx)%=mod;
(t[x][]*=yy)%=mod;
}
inline void pushdown(int x)
{
if(!x)return;
if(!t[x][]&&t[x][]==)return;
update(c[x][],t[x][],t[x][]);
update(c[x][],t[x][],t[x][]);
t[x][]=;t[x][]=;
}
inline int find(int x,int k)
{
pushdown(x);
int l=c[x][],r=c[x][];
if(s[l]+==k)return x;
else if(s[l]>=k)return find(l,k);
else return find(r,k-s[l]-);
}
inline void split(int l,int r)
{
t1=find(rt,l);t2=find(rt,r);
splay(t1,rt);splay(t2,c[t1][]);
}
inline void calc(int x)
{
if(!x)return;
pushdown(x);
calc(c[x][]);
if(x!=)ans=(ans*base+v[x])%mod;
calc(c[x][]);
}
inline void build(int l,int r,int f)
{
if(l>r)return;
int x=(l+r)>>;
fa[x]=f;c[f][x>f]=x;
s[x]=;t[x][]=;t[x][]=;
if(l==r)return;
build(l,x-,x);build(x+,r,x);
pushup(x);
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
build(,maxm,);tot=maxm;rt=(+maxm)>>;
q=read();char ch[maxn];
while(q--)
{
scanf("%s",ch);
if(ch[]=='q')
{
ans=;base=read()%mod;
calc(rt);
cout<<ans<<endl;
}
else
{
int x=read()+,y=read()+;
if(ch[]=='x')
{
split(y,y+);
int z=c[t2][],zz=c[z][]+c[z][];
pushdown(t1);pushdown(t2);pushdown(z);
v[z]+=v[zz];s[z]=;
fa[zz]=c[z][]=c[z][]=;
pushup(t2);pushup(t1);
split(x,x+);
c[t2][]=++tot;s[tot]=;v[tot]=;fa[tot]=t2;t[tot][]=;
pushup(t2);pushup(t1);
}
else if(ch[]=='m')
{
split(x,y+);
ll xx=,yy=read()%mod;
update(c[t2][],xx,yy);
pushup(t2);pushup(t1);
}
else
{
split(x,y+);
ll xx=read()%mod,yy=;
update(c[t2][],xx,yy);
pushup(t2);pushup(t1);
}
}
}
return ;
}
BZOJ3323: [Scoi2013]多项式的运算的更多相关文章
- 2019.03.29 bzoj3323: [Scoi2013]多项式的运算(非旋treap)
传送门 题意:定义一个无穷项的多项式f(x)f(x)f(x),初始各项系数都为0,现在有几种操作 将xLx^LxL到xRx^RxR这些项的系数乘上某个定值v 将xLx^LxL到xRx^RxR这些项的系 ...
- SCOI2013 多项式的运算
---恢复内容开始--- 又是一道裸数据结构题. 之前受序列操作的蛋疼写法影响,只用一个tag,不知道怎么记,之后看了下别人的,终于领悟要用两个tag,一个add,一个mul,维护相当简单,想清楚就行 ...
- LUOGU3278 [SCOI2013]多项式的运算
一次AC.吼啊. BZOJ权限QAQ 区间加和乘打标记,区间乘x就是区间移动,平衡树解决即可. 查询直接遍历一遍然后算出来 // It is made by XZZ #include<cstdi ...
- luogu3278/bzoj3323 多项式的运算 (splay)
mulx的操作,其实就是给r+1的系数+=r的系数,然后删掉r,把l~r-1向右移一位,再插一个0到原来的位置 splay维护区间加和区间乘就好了 (一定要注意做事的顺序,一件事都做完了再去做别的,否 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- MATLAB符号运算 分类: 图像处理 2015-07-31 22:53 3人阅读 评论(0) 收藏
1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x; >> expand((x+3)^3) an ...
- MATLAB符号运算
1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x;>> expand((x+3)^3) ans ...
- 多项式相关&&生成函数相关&&一些题目(updating...)
文章目录 多项式的运算 多项式的加减法,数乘 多项式乘法 多项式求逆 多项式求导 多项式积分 多项式取对 多项式取exp 多项式开方 多项式的除法/取模 分治FFT 生成函数 相关题目 多项式的运算 ...
- java-四则运算二
1.实验目的:是否有乘除法,括号,多项式运算. 2.思路:利用简单的循环switch语句进行循环输出随机数 3.程序源代码: package jiajianchengchu; import java. ...
随机推荐
- Jquery基础整理
1.简单的JQuery (1) $(document).ready(function(){ $(document).ready(mydays); alert(“加载完毕,请检查!”); functi ...
- 数据库连接池php-cp介绍
php-cp(php-connect-pool)是用php扩展写的一个数据库连接池. 我们知道php开发速度快,适合创业快速迭代,但当流量大了之后,php大量的短连接给db层造成多余的消耗,而php处 ...
- iOS开发——TTS文本发音
iOS的文本转发音,从iOS7开始,iOS系统自带这个功能.能够实现中文.英文的发音.而且实现的起来非常方便.就像我看到有的博主说的三行代码搞定. (在iOS7之前(目前已不适配了),比如iOS6实现 ...
- Objective-C description的用法
description类似于.net/java ToString()方法的用途. 假设有一个CTPerson类, - (NSString *)description { return @"d ...
- ios8地图开发的报错
报错如下:Trying to start MapKit location updates without prompting for location authorization. Must call ...
- mysql笔记之主从切换
一. 正常切换 1)从服务器检查SHOW PROCESSLIST语句的输出,直到你看到Has read all relaylogwaiting for the slave I/O thread to ...
- 05_Excel操作_02_模拟Web环境的User列表导出
[思路解释] 在正式上到WebProject之前,准备模拟一下WebProject后台的导出流程. 主要都写在ExcelService层,在Excel的Service层,首先要获得UserList,即 ...
- Codevs 1800 假面舞会 2008年NOI全国竞赛
1800 假面舞会 2008年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一年一度的假面舞会又开始了,栋栋也 ...
- OpenJudge 1806:词典find()与end()
1806:词典 总时间限制: 3000ms 内存限制: 65536kB 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入 首先输入一 ...
- Java---Hibernate>>Can't create table './xxx/#sql-b2c_1a.frm' (errno: xxx)解决方法
通用方案:删除相关表,重新生成. 1.关联表之间数据引擎不一致导致: 修改相关表的引擎设定,保持一致. 2.关联表索引字段的引用类型不一样(如A表关联字段是int,B表索引是char): 修改相关表的 ...