小L正在组织acm暑假集训,但众所周知,暑假集训的萌新中有OI神犇,也有暑假才开始学算法的萌新,如果统一集训的难度,无法很好地让萌新们得到训练,所以小L想了一个办法,根据每次测试的情况,改变萌新们的集训难度。现在将萌新们编号为1到n,最初萌新们的集训难度为v0,测试后有两种操作,第一种是某一区间的萌新的集训难度同时提高,另一种是将某一段区间的萌新的集训难度变为同一个数,同时,Wells希望在某次调整难度之后,知道某一段区间的萌新的集训难度之和,由于小L比较鶸,他并不知道如何快速解决这个问题,你能帮帮他嘛?

Input

第一行三个数n,m,v0 表示有n名萌新和m次调整,初始时全部萌新的集训难度都为v0

第2~m+1行 每行三个数或四个数

0 x y v 表示把 [x,y]区间内的萌新的集训难度都增加v

1 x y v 表示把 [x,y]区间内的萌新的集训难度都变为v

2 x y表示询问[x,y]区间内萌新的集训难度之和

0<n,m<=10^5, |v|<=10^5

Output

每个询问一行,输出答案

Sample Input

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

Sample Output

1
2
4

Hint

题解:线段树基本操作,区间加上一个数,区间变为一个数,区间和;

 #include<cstdio>
#include<algorithm>
#define N 100001
using namespace std;
int n,m,x,y;
long long z,val,ans;
struct node
{
int l,r,siz;
long long set,add,sum;
bool v;
} tree[N<<]; void build(int k,int l,int r)
{
tree[k].l=l; tree[k].r=r; tree[k].siz=r-l+;
if(l==r)
{
tree[k].sum=val;
return ;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
tree[k].sum=tree[k<<].sum+tree[k<<|].sum;
} void pushup(int k)
{
tree[k].sum=tree[k<<].sum+tree[k<<|].sum;
} void pushdown_set(int k)
{
tree[k<<].add=tree[k<<|].add=;
tree[k<<].set=tree[k<<|].set=tree[k].set;
tree[k<<].v=tree[k<<|].v=true;
tree[k<<].sum=tree[k<<].siz*tree[k].set;
tree[k<<|].sum=tree[k<<|].siz*tree[k].set;
tree[k].v=false; tree[k].set=;
} void pushdown_add(int k)
{
tree[k<<].sum+=tree[k<<].siz*tree[k].add;
tree[k<<|].sum+=tree[k<<|].siz*tree[k].add;
tree[k<<].add+=tree[k].add;
tree[k<<|].add+=tree[k].add;
tree[k].add=;
} void Set(int k,int l,int r,long long z)//区间修改为某个值
{
if(tree[k].l>=l&&tree[k].r<=r)
{
tree[k].set=z; tree[k].v=true;
tree[k].sum=z*tree[k].siz;
tree[k].add=;
return;
}
if(tree[k].v) pushdown_set(k);
if(tree[k].add) pushdown_add(k);
int mid=tree[k].l+tree[k].r>>;
if(l<=mid) Set(k<<,l,r,z);
if(r>mid) Set(k<<|,l,r,z);
pushup(k);
} void Add(int k,int l,int r,long long z)//区间加上某个值
{
if(tree[k].l>=l&&tree[k].r<=r)
{
tree[k].add+=z;
tree[k].sum+=z*tree[k].siz;
return;
}
if(tree[k].v) pushdown_set(k);
if(tree[k].add) pushdown_add(k);
int mid=tree[k].l+tree[k].r>>;
if(l<=mid) Add(k<<,l,r,z);
if(r>mid) Add(k<<|,l,r,z);
pushup(k);
} void query(int k,int l,int r)
{
if(tree[k].l>=l&&tree[k].r<=r)
{
ans+=tree[k].sum;
return;
}
if(tree[k].v) pushdown_set(k);
if(tree[k].add) pushdown_add(k);
int mid=tree[k].l+tree[k].r>>;
if(l<=mid) query(k<<,l,r);
if(r>mid) query(k<<|,l,r);
}
int main()
{
scanf("%d%d%lld",&n,&m,&val);
build(,,n);
while(m--)
{
int temp;
scanf("%d",&temp);
if(temp==)
{
scanf("%d%d%lld",&x,&y,&z);
Add(,x,y,z);
}
else if(temp==)
{
scanf("%d%d%lld",&x,&y,&z);
Set(,x,y,z);
}
else
{
scanf("%d%d",&x,&y);
ans=;
query(,x,y);
printf("%lld\n",ans);
} }
}

参考代码:

CSU OJ2151 集训难度的更多相关文章

  1. CSU 2151 集训难度【多标记线段树】

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2151 Input 第一行三个数n,m,v0 表示有n名萌新和m次调整,初始时全部萌新的集训难度 ...

  2. 关于ACM,关于CSU

    原文地址:http://tieba.baidu.com/p/2432943599 前言: 即将进入研二,ACM的事情也渐渐远去,记忆终将模糊,但那段奋斗永远让人热血沸腾.开个贴讲讲ACM与中南的故事, ...

  3. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  4. 2017-12 CDQZ集训(已完结)

    从联赛活了下来(虽然分数倒一……),接下来要去CDQZ集训啦…… DAY -2 2017-12-16 被老师安排负责一部分同学的住宿以及安排…… 抓紧时间继续学习,LCT真好玩啊真好玩…… 晚上放假了 ...

  5. 2017/10 冲刺NOIP集训记录:暁の水平线に胜利を刻むのです!

    前几次集训都没有记录每天的点滴……感觉缺失了很多反思的机会. 这次就从今天开始吧!不能懈怠,稳步前进! 2017/10/1 今天上午进行了集训的第一次考试…… 但是这次考试似乎是近几次我考得最渣的一次 ...

  6. HN2018省队集训

    HN2018省队集训 Day1 今天的题目来自于雅礼的高二学长\(dy0607\). 压缩包下载 密码: 27n7 流水账 震惊!穿着该校校服竟然在四大名校畅通无阻?霸主地位已定? \(7:10\)从 ...

  7. CSU 1974

    Description 对于csuxushu来说,能够在CSU(California State University)组织2017年的ACM暑期集训让他感到十分荣幸. csuxushu是一名充满梦想 ...

  8. NOIP后省选集训前文化课划水记

    划水划了一个多月,文化课没啥长进还他妈累死了...--ghj1222 11.11(NOIP Day2) 师傅开车开得很快,晚上8:00多就到了二狱 晚上听毒瘤班主任swh讲了半节语文,我:黑人问号.j ...

  9. CSU 1809 Parenthesis(RMQ-ST+思考)

    1809: Parenthesis Submit Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n ...

随机推荐

  1. 模拟实现IoC容器

    Spring的IoC核心就是控制反转,将对实现对象的操作控制器交出来,由IoC容器来管理,从配置文件中获取配置信息,Java对XML文档提供了完美的支持,dom4j功能强大,而下面我就用JDOM这一开 ...

  2. Linux(ubuntu)下切换root用户

    输入命令su root切换用户,会提示输入root密码,如果不记得或者是没设置过,那么可以输入sudo passwd root来设置密码,会让你输入两次密码确认.输入完即可使用su root命令切换r ...

  3. CSS(8)---通俗讲解定位(position)

    CSS(8)---通俗讲解定位(position) CSS有三种基本的定位机制: 普通流.浮动.定位.前面两个之前已经讲过,详见博客: 1.CSS(5)---通俗讲解盒子模型 2.CSS(6)---通 ...

  4. Django笔记-连载(记录2018-12-16)

    1.django从1.9开始ForeignKey中的on_delete参数是必须的. hbook = models.ForeignKey('BookInfo')这句代码就让BookInfo类和Hero ...

  5. ZeroC ICE的远程调用框架 代理引用地址

    在官方文档中称为Binding,协议-地址对的绑定.在Proxy模式中,一般地有三个参与者,Proxy,Subject以及RealSubject.Subject定义了Proxy(代理)和RealSub ...

  6. javescript 的 对象

    一,定义:对象是JavaScript的一个基本数据类型,是一种复合值,它将很多值(原始值或者其他对象)聚合在一起,可通过名字(name/作为属性名)访问这些值.即属性的无序集合. 关键是name属性名 ...

  7. ubuntu 16.04 和 windows 10系统安装mysql 允许远程访问 | mysql user guide on ubuntu 16.04 and windows 10

    本文首发于个人博客https://kezunlin.me/post/36e618e7/,欢迎阅读! mysql user guide on ubuntu 16.04 and windows 10 Pa ...

  8. tomcat启动窗口出现乱码

    tomcat启动窗口出现乱码     或者 idea运行服务器tomcat出现乱码 在tomcat的启动窗口打印的启动信息中包含了大量的中文乱码, 虽然这些对tomcat本身的使用没有任何影响,但却非 ...

  9. PL真有意思(八):其它程序设计模型

    前言 在之前几篇我们讨论的语法.语义.命名.类型和抽象适用于所有语言.然而我们的注意力都主要集中在命令式语言上,现在这篇来看看其它范式的语言.函数式和逻辑式语言是最主要的非命令式语言. 函数式语言 命 ...

  10. CSS中如果实现元素浮动,看这篇文章就足够了

    浮动基本介绍 在标准文档流中元素分为2种,块级元素和行内元素,如果想让一些元素既要有块级元素的特点也同时保留行内元素特点,只能让这些元素脱离标准文档流即可. 浮动可以让元素脱离标准文档流,可以实现让多 ...