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. 消息中间件之 RocketMQ

    参考文档: http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/ http://rocketmq.apache.org ...

  2. 【leetcode】1156. Swap For Longest Repeated Character Substring

    题目如下: Given a string text, we are allowed to swap two of the characters in the string. Find the leng ...

  3. php shuffle()函数 语法

    php shuffle()函数 语法 作用:把数组中的元素按随机顺序重新排序:富瑞华 语法:shuffle(array) 参数: 参数 描述 array 必需.规定要使用的数组. 说明:若成功则返回 ...

  4. 大数据与mysql

    mysql优化:……

  5. Windows 搭建Hadoop 2.7.3开发环境

    1.安装配置Java环境 1.1.安装Windows版本的jkd应用程序 当前的系统环境是64位Windows 7,因此下载64位JDK,下载地址:http://download.oracle.com ...

  6. 关于跨域踩的坑,浏览器 status code为200,但实际上是跨域了

    背景 后端使用Nginx并更改本地host文件,起本地服务.将aaa.bbbb.com代理至本地IP地址(10.26.36.156).使用$.ajax调用后端restful接口,要求content-t ...

  7. 关于 Visual stdio 编译报错:error MSB6006: “CL.exe”已退出

    网上查看,原因有多种. 1,我自己遇到的是这样的: 环境:VS2019,编译项目 image-master,中间自己重整了原来的目录,移动了很多文件.编译报错:error MSB6006: “CL.e ...

  8. (转)IDataGridViewEditingControl 接口 作用

    本文转载自:http://blog.csdn.net/zx13525079024/article/details/4814575 IDataGridViewEditingControl 接口 定义承载 ...

  9. 快速入门分布式消息队列之 RabbitMQ(1)

    目录 目录 前言 简介 安装 RabbitMQ 基本对象概念 Message 消息 Producer 生产者 Consumer 消费者 Queue 队列 Exchange 交换机 Binding 绑定 ...

  10. 山西汽车销量(hive)

    1.创建数据库create database db_cart; 2.使用数据库use db_cart; 3.创建表create table t_cart(province STRING,month I ...