写道数据结构练练手哈哈哈

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#define il inline
#define rg register
#define vd void
#define sta static
#define pr pair<int,int>
typedef long long ll;
using namespace std;
il char gc(){
const int B=10000000;static char b[B+1],*p=b+B;
if(p==b+B)b[fread(b,1,B,stdin)]=0,p=b;
return *p?*p++:0;
}
il int gi(){
rg int x=0;rg bool flg=0;rg char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')flg=1;ch=gc();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=gc();
return flg?-x:x;
}
const int maxn=100001<<1;
int rt,ls[maxn],rs[maxn],ran[maxn],siz[maxn],n,m;
ll sum[maxn],w[maxn],tga[maxn],tgb[maxn],tgc[maxn];
bool tgd[maxn];
il vd Set(int&x,ll y){if(x)w[x]=y,sum[x]=siz[x]*y,tgd[x]=1,tgc[x]=y,tga[x]=tgb[x]=0;}
il vd Adda(int&x,ll y){if(x)w[x]+=y*(siz[ls[x]]+1),sum[x]+=y*(1+siz[x])*siz[x]/2,tga[x]+=y;}
il vd Addb(int&x,ll y){if(x)w[x]+=y,sum[x]+=siz[x]*y,tgb[x]+=y;}
il vd down(int&x){
if(!x)return;
if(tgd[x])tgd[x]=0,Set(ls[x],tgc[x]),Set(rs[x],tgc[x]);
if(tga[x])Adda(ls[x],tga[x]),Adda(rs[x],tga[x]),Addb(rs[x],tga[x]*(siz[ls[x]]+1)),tga[x]=0;
if(tgb[x])Addb(ls[x],tgb[x]),Addb(rs[x],tgb[x]),tgb[x]=0;
}
il vd upd(int&x){
if(!x)return;
down(ls[x]),down(rs[x]);
siz[x]=siz[ls[x]]+siz[rs[x]]+1,sum[x]=sum[ls[x]]+sum[rs[x]]+w[x];
}
il int merge(int x,int y){
if(x==0||y==0)return x|y;
if(ran[x]<ran[y]){down(x),rs[x]=merge(rs[x],y),upd(x);return x;}
else {down(y),ls[y]=merge(x,ls[y]),upd(y);return y;}
}
il pr split(int&x,int k){
if(!x)return make_pair(0,0);
down(x);
pr y=make_pair(ls[x],rs[x]);
if(k==siz[ls[x]]){ls[x]=0,upd(x),y.second=x;return y;}
if(k==siz[ls[x]]+1){rs[x]=0,upd(x),y.first=x;return y;}
if(k<siz[ls[x]]){y=split(ls[x],k);ls[x]=y.second,upd(x),y.second=x;return y;}
else {y=split(rs[x],k-siz[ls[x]]-1);rs[x]=y.first,upd(x),y.first=x;return y;}
}
int main(){
#ifdef xzz
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=gi(),m=gi();
srand(2);ran[0]=rand();
for(rg int i=1;i<=n;++i)ran[i]=(ran[i-1]*19260817ll)&2147483647,w[i]=sum[i]=gi(),siz[i]=1,rt=merge(rt,i);
int l,r,k,opt;
pr a,b;
while(m--){
opt=gi();
if(opt==1){
l=gi(),r=gi(),k=gi();
a=split(rt,l-1),b=split(a.second,r-l+1);
Set(b.first,k);
rt=merge(a.first,merge(b.first,b.second));
}else if(opt==2){
l=gi(),r=gi(),k=gi();
a=split(rt,l-1),b=split(a.second,r-l+1);
Adda(b.first,k);
rt=merge(a.first,merge(b.first,b.second));
}else if(opt==3){
l=gi();a=split(rt,l-1);
++n;ran[n]=(ran[n-1]*19260817ll)&2147483647;
w[n]=sum[n]=gi(),siz[n]=1;
rt=merge(a.first,merge(n,a.second));
}else{
l=gi(),r=gi();
a=split(rt,l-1),b=split(a.second,r-l+1);
printf("%lld\n",sum[b.first]);
rt=merge(a.first,merge(b.first,b.second));
}
}
return 0;
}

Dbzoj#3188. [Coci 2011]Upit的更多相关文章

  1. BZOJ3188: [Coci 2011]Upit

    3188: [Coci 2011]Upit Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 24[Submit][Status] ...

  2. bzoj3188 [Coci 2011]Upit(分块)

    Time Limit: 10 Sec  Memory Limit: 128 MB Description 你需要维护一个序列,支持以下4种操作.一,将区间(u,v)的数覆盖为C:二,将区间(u,v)的 ...

  3. [SinGuLaRiTy] COCI 2011~2012 #2

    [SinGuLaRiTy-1008] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 测试题目 对于所有的题目:Time Limit:1s   ...

  4. 【BZOJ 3188】【Coci 2011】Upit Splay模板题

    转啊转终于转出来了,然而我的模板跟陈竞潇学长的模板一模一样,还是太弱啊,第一次用指针. #include<cstdio> #include<cstring> #include& ...

  5. bzoj AC倒序

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

  6. 【vijos】1791 骑士的旅行(特殊的技巧)

    https://vijos.org/p/1791 暴力的话只想到bfs,然后估计是状态超了才得20分. 噗,为啥暴力就不能想得简单点QAQ.....这种思想很好啊. 这一题我看了题解后不得不说我竟然没 ...

  7. TOJ4505: KOSARE

    TOJ4505: KOSARE  Time Limit(Common/Java):10000MS/30000MS     Memory Limit:65536KByteTotal Submit: 11 ...

  8. [C#项目开源] MongoDB 可视化管理工具 (2011年10月-至今)

    正文 该项目从2011年10月开始开发,知道现在已经有整整5年了.MongoDB也从一开始的大红大紫到现在趋于平淡. MongoCola这个工具在一开始定位的时候只是一个Windows版本的工具,期间 ...

  9. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

随机推荐

  1. python文本文件处理和用户输入

    #用户输入 a = input('please input: ') #这个输入什么即是什么,比如输入1,则a变量=1,输入'abc',则a变量 = 'abc',输入abc则报错,因为会把abc当做一个 ...

  2. [翻译] ALMoviePlayerController

    ALMoviePlayerController ALMoviePlayerController is a drop-in replacement for MPMoviePlayerController ...

  3. Linux 环境部署记录(三) - Jenkins安装与配置

    Jenkins安装 为了兼容生产环境的jdk1.7版本,从官网得知,Jenkins必须是1.6之前的版本,因此下载jenkins-1.596.3-1.1.noarch.rpm到本地进行安装: #移动到 ...

  4. Matlab绘图——对称曲线绘制(转)

    转自 http://blog.csdn.net/lyqmath/article/details/6004885 目的:对曲线数据做对称绘制 思想:根据两曲线按a对称,则x1 + x2 = 2a的原则 ...

  5. mysql的表和约束操作

    在创建表是默认为加上数据引擎和字符集,如创建一个student表,代码如下: create table students(id int unsigned zerofill auto_increment ...

  6. 01-urllib库添加headers的一般方法

    2018-08-23 13:07:57 对于请求一些网站,我们需要加上请求头才可以完成网页的抓取,不然会得到一些错误,无法返回抓取的网页.下面,介绍两种添加请求头的方法. 方法一:借助build_op ...

  7. vue项目用nodejs实现模拟数据方法

    1)在项目根目录(如demo)中创建一个文件夹,如base,将项目中所有的前端文件全部放到base文件夹中,此时项目demo下只有一个文件夹base 2)通过cmd进入命令窗口,直接执行npm ins ...

  8. Day17 多线程编程

    基本概念 进程:内存中正则运行的一个应用程序.一个进程包含多个线程. 线程:进程中的一个执行流程. 多线程:有两个或两个以上的并发执行流程. 线程的声明周期 说明: 1. 新建状态(New)      ...

  9. [luogu3941] 入阵曲

    题面 ​ 话说题目前面的那首诗还挺有意境的啊哈哈. ​ 可能今天要把中文的标点都换成英文的了, 先熟悉一下吧... ​ 好了, 进入正题, 求一个矩阵内有多少个子矩阵满足这个子矩阵的和模k为零.看到矩 ...

  10. 在linux中禁用一块硬盘

    笔记本采用固态加机械的硬盘组合使用中完全用不到机械部分 但它总是在启动后运行并发出响声 1 启动后的禁用 无需重启 (sdx是你的磁盘  udev的更新可能会导致磁盘重新出现 在向系统添加/删除磁盘也 ...