bryce1010模板

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)的更多相关文章

  1. ( 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 ...

  2. 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 ...

  3. HDU 5726 GCD (2016 Multi-University Training Contest 1)

      Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description Give y ...

  4. 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 ...

  5. HDU 4906 Our happy ending(2014 Multi-University Training Contest 4)

    题意:构造出n个数 这n个数取值范围0-L,这n个数中存在取一些数之和等于k,则这样称为一种方法.给定n,k,L,求方案数. 思路:装压 每位 第1为表示这种方案能不能构成1(1表示能0表示不能)   ...

  6. (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 ...

  7. hdu6314( 2018 Multi-University Training Contest 2)

    bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6314 ----. 又是一个数学题! 这个题使用容斥原理解决的,现场看dls推公式. 我也 ...

  8. 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操 ...

  9. hdu6311( 2018 Multi-University Training Contest 2)

    bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6311 从dls思路中,我整理一下自己的思路: 1.首先也是建图 2.建图结束后,一个df ...

随机推荐

  1. 【USACO OPEN 10】hop

    奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1..N. 就像任何一个好游戏一样,这样的跳格子游戏也 ...

  2. HDU5950 Recursive sequence —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-5950 Recursive sequence Time Limit: 2000/1000 MS (Java/Others)   ...

  3. Codeforces Beta Round #56 A. Where Are My Flakes? —— 贪心

    题目链接:http://codeforces.com/problemset/problem/60/A A. Where Are My Flakes? time limit per test 2 sec ...

  4. java hql case when 的用法

    if(null == sorter){ hql.append(" order by m.mDate desc,case when m.mealTime = 'morning' then '1 ...

  5. 通过dom4j写.xml文件

    步骤: 1.左键选中src,点击红圈2: 2.新建类: 3.开始写代码: package com.bjsxt.xml; import java.io.File; import java.io.File ...

  6. Jquery Plugin模版

    1. [代码][JavaScript]代码 01// remember to change every instance of "pluginName" to the name o ...

  7. html5--5-16 综合实例绘制饼图

    html5--5-16 综合实例绘制饼图 实例 <!doctype html> <html> <head> <meta charset="utf-8 ...

  8. python学习笔记:第一天

    1.经典程序测试:hello world 入门编程语言第一件事,先写hello world. #!/usr/bin/env python# -*- coding: UTF-8 -*- print(&q ...

  9. css绘制三角形

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 51Nod - 1295:XOR key (可持久化Trie求区间最大异或)

    给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求ALL 至 ARR 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值 ...