Time Limit: 10 Sec  Memory Limit: 128 MB

Description

你需要维护一个序列,支持以下4种操作。一,将区间(u,v)的数覆盖为C;二,
将区间(u,v)的数依次加上一个以C为首项、C为公差的等差数列;三,将数C插入
第i个位置;四,查询区间(u,v)的数的和。序列最初有n个数,一共会有Q次操
作。保证结果在longlong范围内。

Sample Input

5 5
1 2 3 4 5
1 5 5 0
4 4 5
4 5 5
2 1 5 1
4 1 5

Sample Output

4
0
25

HINT

n, Q <= 100,000.


我非常喜欢分块,所以我用分块过了这题

支持插入,区间加,修改的分块,用vector数组维护打打标记就行了
如果某块过大,暴力拆成两块就好辣(数据挺水好像用不上)
代码中块和数列的编号均从0开始

#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#define ri register int
using namespace std;
typedef long long ll;
ll read(){
char c=getchar(); ll x=; bool f=;
while(c<''||c>'') f=f&&(c!='-'),c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return f?x:-x;
}
#define N 60005
int n,Q,idm,B,sm[N];
ll s[N],w[N],d[N],k[N];
bool a[N],b[N];
vector <int> h; //从左到右块的编号
vector <ll> g[N];
inline ll G(int x){return g[x].size();}
inline int id(int x){return lower_bound(sm+,sm+idm+,x)-sm-;}//x属于哪个块
void down(int x){
if(a[x]) s[x]=G(x)*w[x],g[x].assign(G(x),w[x]),a[x]=w[x]=;
if(b[x]){
ll q=d[x],q2=k[x],t=; b[x]=k[x]=d[x]=s[x]=;
for(ri i=;i<G(x);++i) t+=q,g[x][i]+=t+q2,s[x]+=g[x][i];
}
}
void cover(int x,int y,ll v){
ri ix=id(x),iy=id(y),L=h[ix],R=h[iy],l=x-sm[ix]-,r=y-sm[iy]-;
if(L==R){
down(L);
for(ri i=l;i<=r;++i) s[L]+=(v-g[L][i]),g[L][i]=v;
return ;
}down(L),down(R);
for(ri i=l;i<G(L);++i) s[L]+=(v-g[L][i]),g[L][i]=v;
for(ri j=ix+,i;j<iy;++j) i=h[j],s[i]=v*G(i),b[i]=k[i]=d[i]=,w[i]=v,a[i]=;
for(ri i=;i<=r;++i) s[R]+=(v-g[R][i]),g[R][i]=v;
}
void add(int x,int y,ll v){
ri ix=id(x),iy=id(y),L=h[ix],R=h[iy],l=x-sm[ix]-,r=y-sm[iy]-; ll q=;
if(L==R){
down(L);
for(ri i=l;i<=r;++i) q+=v,s[L]+=q,g[L][i]+=q;
return ;
}down(L),down(R);
for(ri i=l;i<G(L);++i) q+=v,s[L]+=q,g[L][i]+=q;
for(ri j=ix+,i;j<iy;++j){
i=h[j];
if(a[i]){
s[i]=G(i)*w[i];
if(b[i]) s[i]+=(d[i]+d[i]*G(i))*G(i)/+k[i]*G(i);
}
s[i]+=(v+v*G(i))*G(i)/+q*G(i);
b[i]=; d[i]+=v; k[i]+=q; q+=v*G(i);
}
for(ri i=;i<=r;++i) q+=v,s[R]+=q,g[R][i]+=q;
}
void split(int x){
ri ix=id(x),L=h[ix];
h.insert(h.begin()+ix+,idm);
for(ri i=B;i<G(L);++i)
g[idm].push_back(g[L][i]),s[idm]+=g[L][i],s[L]-=g[L][i];
g[L].erase(g[L].begin()+B,g[L].end()); idm++;
}
void ins(int x,ll v){
ri ix=id(x),L=h[ix],l=x-sm[ix]-;
down(L); g[L].insert(g[L].begin()+l,v); s[L]+=v;
if(G(L)>B*) split(x);//暴力拆块
for(ri i=;i<idm;++i) sm[i+]=sm[i]+G(h[i]);
}
ll ask(int x,int y){
ri ix=id(x),iy=id(y),L=h[ix],R=h[iy],l=x-sm[ix]-,r=y-sm[iy]-; ll re=;
if(L==R){
down(L);
for(ri i=l;i<=r;++i) re+=g[L][i];
return re;
}down(L),down(R);
for(ri i=l;i<G(L);++i) re+=g[L][i];
for(ri j=ix+;j<iy;++j) re+=s[h[j]];
for(ri i=r;i>=;--i) re+=g[R][i];
return re;
}
int main(){
n=read(),Q=read(); ll q,x,y; sm[]=-; B=sqrt(n);
for(ri i=;i<n;++i) q=read(),g[i/B].push_back(q),s[i/B]+=q;
while(idm*B<=n) sm[idm+]=sm[idm]+G(idm),h.push_back(idm++);//sm[i]:第$i-1$块的右端点
while(Q--){
q=read(),x=read(),y=read();
if(q==) cover(x-,y-,read());
if(q==) add(x-,y-,read());
if(q==) ins(x-,y);
if(q==) printf("%lld\n",ask(x-,y-));
}return ;
}

bzoj3188 [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. Dbzoj#3188. [Coci 2011]Upit

    写道数据结构练练手哈哈哈 // It is made by XZZ #include<cstdio> #include<algorithm> #include<cstdl ...

  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. 【莫队算法】【权值分块】bzoj2223 [Coci 2009]PATULJCI

    不带修改主席树裸题<=>莫队+权值分块裸题. 复杂度O(m*sqrt(n)). P.S.题目描述坑爹,第二个数是权值的范围. #include<cstdio> #include ...

  9. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

随机推荐

  1. js 获取滚动位置,滚动到指定位置,平滑滚动

    1.获取当前滚动条位置信息 var top = dom.scrollTop; // 获取y轴上的滚动位置 var left = dom.scrollLeft; // 获取x轴上的滚动位置 2.滚动到指 ...

  2. 判断img的src为空/点击时候两张图片来回替换

    if($('.icon-right img').src==null){ $('.span-gray').addClass('c8'); } <img> ///////////// < ...

  3. [转]SQLServer : EXEC和sp_executesql的区别

    MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql.通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...

  4. 七牛云对象存储kodo使用体验

    在这里,我使用了七牛云的对象存储Kodo,和阿里云的OSS,还有腾讯云的COS是同样的产品 oss相关术语 包依赖关系解决 unrecognized import path "golang. ...

  5. 【Java】SpringBoot整合RabbitMQ

    介绍 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,AMQP,即A ...

  6. linux ubantu php composer安装

    root@iZwz93telmwbh624e5zetqZ:~# php -v PHP 5.6.40-14+ubuntu16.04.1+deb.sury.org+1 (cli) Copyright (c ...

  7. git 部署服务

    git 知识 服务器知识 1.在本地完成代码的编写, 然后通过 git 管理版本. 在编码完成后 git push 到 git 云端(github 或者 码云 及其他). 2.在服务器端安装 git ...

  8. Oracle In子句

    Oracle In子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,您将学习如何使用Oracle IN运算符来确定值是否与列表或子查询中的任 ...

  9. Oracle传输数据到Sqlserver

    通过Sqlserver的SSIS工具实现数据传输

  10. [CSP-S模拟测试]:糊涂图(概率DP)

    题目传送门(内部题76) 输入格式 第一行输入三个空格隔开的整数$n,m,s$表示随机加一条边之前的糊涂图的点数,边数,以及起点的编号. 接下来$m$行,每行两个空格隔开的整数$a,b$表示从$a$到 ...