hdu6315( 2018 Multi-University Training Contest 2)
http://acm.hdu.edu.cn/showproblem.php?pid=6315
/*hdu 1007
首先我们在建立线段树之前应该思考的是线段树的节点维护一个什么值,
在比赛过程中,我想到了维护a[i]的值但是时间复杂度太高,又想到维护a[i]/b[i]但是取下整,
这样的话无法更新∑的值。
在题解中,维护了b[i]的值,因为a[i]最初是0,所以在update过程中当a[i]>=b[i]时,a[i]/b[i]才>=1;
才会对sum有贡献,所以不妨维护b[i]的值,对每次区间更新,将区间中的b[i]减1,当b[i]减到0时,更新sum的值+1,然后b[i]更新回初始的b[i]的值
整个更新过程中需要维护lazy标志、numzero当前子树中0的个数(即sum+1的次数)、minx当前子树中最小的b[i]值、valb当前节点初始的b[i]值
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int MAXN=201000;
struct
{
int minx,valb,numzero;
int lazy;
}sum[MAXN<<2];
int b[MAXN];
void push_up(int rt)
{
sum[rt].numzero=sum[rt<<1].numzero+sum[rt<<1|1].numzero;
sum[rt].minx=min(sum[rt<<1].minx,sum[rt<<1|1].minx);
}
void push_down(int rt,int l,int r)
{
sum[rt<<1].lazy+=sum[rt].lazy;
sum[rt<<1|1].lazy+=sum[rt].lazy;
sum[rt<<1].minx-=sum[rt].lazy;
sum[rt<<1|1].minx-=sum[rt].lazy;
sum[rt].lazy=0;
}
void build(int l,int r,int rt=1)
{
sum[rt].lazy=0;
sum[rt].numzero=0;
if(l==r)
{
sum[rt].lazy=0;
sum[rt].minx=b[l];
sum[rt].numzero=0;
sum[rt].valb=b[l];
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
push_up(rt);
}
/*update操作
*/
void update(int L,int R,int l,int r,int rt=1)
{
if(L<=l&&r<=R&&sum[rt].minx>1)
{
sum[rt].lazy++;
sum[rt].minx--;
return;
}
if(l==r&&sum[rt].minx==1)
{
sum[rt].numzero++;
sum[rt].lazy=0;
sum[rt].minx=sum[rt].valb;
return;
}
if(sum[rt].lazy>0)
push_down(rt,l,r);
int m=(l+r)>>1;
if(L<=m)update(L,R,lson);
if(m<R)update(L,R,rson);
push_up(rt);
}
/*query操作
求和操作,就是求子树中numzero和
*/
int query(int L,int R,int l,int r,int rt=1)
{
if(L<=l&&r<=R)
{
return sum[rt].numzero;
}
if(sum[rt].lazy>0)push_down(rt,l,r);
int m=(l+r)>>1;
int ret=0;
if(L<=m)ret+=query(L,R,lson);
if(R>m)ret+=query(L,R,rson);
return ret;
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n,m;
while(cin>>n>>m)
{
memset(b,0,sizeof(b));
char ch[10];
int L,R;
for(int i=1;i<=n;i++)
scanf("%d",b+i);
build(1,n,1);
while(m--)
{
scanf("%s",ch);
scanf("%d%d",&L,&R);
if(ch[0]=='a')
{
update(L,R,1,n,1);
}
else if(ch[0]=='q')
{
printf("%d\n",query(L,R,1,n,1));
}
}
}
return 0;
}
hdu6315( 2018 Multi-University Training Contest 2)的更多相关文章
- ( 2018 Multi-University Training Contest 2)
2018 Multi-University Training Contest 2) HDU 6311 Cover HDU 6312 Game HDU 6313 Hack It HDU 6314 Mat ...
- HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- HDU 5726 GCD (2016 Multi-University Training Contest 1)
Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description Give y ...
- HDU 4897 Little Devil I(树链剖分)(2014 Multi-University Training Contest 4)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4897 Problem Description There is an old country and ...
- HDU 4906 Our happy ending(2014 Multi-University Training Contest 4)
题意:构造出n个数 这n个数取值范围0-L,这n个数中存在取一些数之和等于k,则这样称为一种方法.给定n,k,L,求方案数. 思路:装压 每位 第1为表示这种方案能不能构成1(1表示能0表示不能) ...
- (2018 Multi-University Training Contest 3)Problem D. Euler Function
//题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6322 //题目大意:给定 k,求第 k 小的数 n,满足 φ(n) 是合数.显然 φ(1) = 1 ...
- hdu6314( 2018 Multi-University Training Contest 2)
bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6314 ----. 又是一个数学题! 这个题使用容斥原理解决的,现场看dls推公式. 我也 ...
- hdu6313( 2018 Multi-University Training Contest 2)
bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6313 参考dls的讲解: 以5*5的矩阵为例: 后一列分别对前一列+0+1+2+3+4操 ...
- hdu6311( 2018 Multi-University Training Contest 2)
bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6311 从dls思路中,我整理一下自己的思路: 1.首先也是建图 2.建图结束后,一个df ...
随机推荐
- eval函数用法
JavaScript 全局对象 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字 ...
- HDU3723 Delta Wave —— 卡特兰数
题目链接:https://vjudge.net/problem/HDU-3723 Delta Wave Time Limit: 6000/3000 MS (Java/Others) Memory ...
- 为什么在启动linux后进入终端提示sh-3.2#
这是Linux系统环境变量设置问题,用户登陆后确保是root权限,可以用如下这两条命令解决:-bash-3.2# cp /etc/skel/.{bash_profile,bashrc} ~-bash- ...
- Can't locate Log/Dispatch.pm in @INC /Makefile out-of-date with respect to Makefile.PL
mha check的时候报错问题解决: # masterha_check_ssh --conf=/data/mha/app1.cnf Can't locate Log/Dispatch.pm in ...
- codevs 2456栅栏
传送门 2456 栅栏 2006年省队选拔赛四川 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Maste 题目描述 Description 农夫约翰打算建立一个栅 ...
- Update 出现在的问题
报错提示:之前的操作没有完成,运行deanup被打断,请先执行Cleanup方法. 正常右键点击Cleanup,如果只让默认值勾选,可能还是会报这个错.所以正确操作如下: 全部选中再点击OK,这样就可 ...
- C++对C的增强
一.namespace命名空间 1.C++命名空间基本常识所谓namespace,是指标识符的各种可见范围.c++标准程序库中的所有标识符都被定义与一个名为std的namespace中. 1.1:&l ...
- bzoj 3481 DZY Loves Math III——反演+rho分解质因数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3481 推推式子发现:令Q=gcd(P,Q),ans=Σ(d|Q) d*phi(P/d).把 ...
- web数据存储
数据的存储必然是任何网站必须经历的事,我们可以将数据存放在不同地方,数据库.文件.内存.程序本身.cookie,session中都可以,但是只要需要持久化保留的数据,那么最终肯定还是落在磁盘之上的,我 ...
- String类无子类
1. 关于final修饰符 参考文章: 浅析Java中的final关键字 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量 ...