题意

题目链接

Sol

这题关键是注意到题目中的\(b\)是个排列

那么最终的答案最多是\(nlogn\)(调和级数)

设\(d_i\)表示\(i\)号节点还需要加\(d_i\)次才能产生\(1\)的贡献

用线段树维护每个节点里\(d_i\)的最小值,每次当\(d_i - 1= 0\)的时候往下递归即可

时间复杂度:\(O(nlog^2 n)\)

多组数据记得清空lazy标记啊qwq。。。。

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-')f =- 1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, b[MAXN];
#define ls k << 1
#define rs k << 1 | 1
struct Node {
int l, r, mn, sum, f;
}T[MAXN];
void update(int k) {
T[k].mn = min(T[ls].mn, T[rs].mn);
T[k].sum = T[ls].sum + T[rs].sum;
}
void add(int k, int val) {
T[k].mn -= val; T[k].f += val;
}
void pushdown(int k) {
if(!T[k].f) return ;
add(ls, T[k].f); add(rs, T[k].f);
T[k].f = 0;
}
void Build(int k, int ll, int rr) {
T[k].l = ll; T[k].r = rr; T[k].sum = 0; T[k].f = 0;
if(ll == rr) {T[k].mn = b[ll]; return ;}
int mid = ll + rr >> 1;
Build(ls, ll, mid); Build(rs, mid + 1, rr);
update(k);
}
void dec(int k) {
if(T[k].mn == 0) {
if(T[k].l == T[k].r) T[k].sum++, T[k].mn = b[T[k].l];
else pushdown(k), dec(ls), dec(rs), update(k);
}
}
void IntervalAdd(int k, int ll, int rr) {
if(ll <= T[k].l && T[k].r <= rr) {
add(k, 1);
if(T[k].mn == 0) dec(k);
return ;
}
pushdown(k);
int mid = T[k].l + T[k].r >> 1;
if(ll <= mid) IntervalAdd(ls, ll, rr);
if(rr > mid) IntervalAdd(rs, ll, rr);
update(k);
}
int Query(int k, int ll, int rr) {
if(ll <= T[k].l && T[k].r <= rr) return T[k].sum;
pushdown(k);
int mid = T[k].l + T[k].r >> 1;
if(rr <= mid) return Query(ls, ll, rr);
else if(ll > mid) return Query(rs, ll, rr);
else return Query(ls, ll, rr) + Query(rs, ll, rr);
}
main() {
while(scanf("%d %d", &N, &M) == 2) {
for(int i = 1; i <= N; i++) b[i] = read();
Build(1, 1, N);
while(M--) {
char s[6]; int l, r;
scanf("%s", s + 1); l = read(), r = read();
if(s[1] == 'a') IntervalAdd(1, l, r);
else printf("%d\n", Query(1, l, r));
}
}
}

HDU6315 Naive Operations(线段树 复杂度分析)的更多相关文章

  1. HDU 6315 Naive Operations(线段树+复杂度均摊)

    发现每次区间加只能加1,最多全局加\(n\)次,这样的话,最后的答案是调和级数为\(nlogn\),我们每当答案加1的时候就单点加,最多加\(nlogn\)次,复杂度可以得当保证. 然后问题就是怎么判 ...

  2. HDU6315 Naive Operations 线段树

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门  原题目描述在最下面. Solution ...

  3. hdu Naive Operations 线段树

    题目大意 题目链接Naive Operations 题目大意: 区间加1(在a数组中) 区间求ai/bi的和 ai初值全部为0,bi给出,且为n的排列,多组数据(<=5),n,q<=1e5 ...

  4. 杭电多校第二场 hdu 6315 Naive Operations 线段树变形

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  5. HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=6315 题意 a数组初始全为0,b数组为1-n的一个排列.q次操作,一种操作add给a[l...r]加1,另一种操 ...

  6. HDU 6315 Naive Operations(线段树区间整除区间)

    Problem DescriptionIn a galaxy far, far away, there are two integer sequence a and b of length n.b i ...

  7. HDU - 6315 Naive Operations (线段树+思维) 2018 Multi-University Training Contest 2

    题意:数量为N的序列a和b,a初始全为0,b为给定的1-N的排列.有两种操作:1.将a序列区间[L,R]中的数全部+1:2.查询区间[L,R]中的 ∑⌊ai/bi⌋(向下取整) 分析:对于一个位置i, ...

  8. HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树

    hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线 ...

  9. 2018HDU多校二 -F 题 Naive Operations(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6315 In a galaxy far, far away, there are two integer ...

随机推荐

  1. loj #6250. 「CodePlus 2017 11 月赛」找爸爸

    #6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...

  2. luogu2155 [SDOI2008]沙拉公主的困惑

    link 求出1到N的阶乘中与M的阶乘互质的数的个数,对R取模,多组询问,R<=10^9+10,T<=10000,1 < = N , M < = 10000000 1到\(M! ...

  3. HDU6301 Distinct Values (多校第一场1004) (贪心)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. centos操作---搭建环境 安装python

    1.安装python3.6.2 安装依赖 yum -y groupinstall "Development tools" yum -y install zlib-devel bzi ...

  5. StackOverflow

    stackoverflow栈溢出 stacker栈式存储器 signup注册  signin登陆 inbox收信信箱 verify 核实 otherwise另外的 noted说明  (就是说有明文指出 ...

  6. pytorch 加载mnist数据集报错not gzip file

    利用pytorch加载mnist数据集的代码如下 import torchvision import torchvision.transforms as transforms from torch.u ...

  7. LUNA16数据集(一)简介

    LUNA16,全称Lung Nodule Analysis 16,是16年推出的一个肺部结节检测数据集,旨在作为评估各种CAD(computer aid detection计算机辅助检测系统)的ban ...

  8. 【Cracking the Code Interview(5th edition)】二、链表(C++)

    链表结点类型定义: class Node { public: ; Node *next = nullptr; Node(int d) { data = d; } }; 快行指针(runner)技巧: ...

  9. Dictionary 检测key是否存在

    if(dict.ContainsKey(T key)) { //已存在key }

  10. vim与vi操作

    vim是vi发展而来的文本编辑器: vi是最原始的文本编辑器: vi/vim的使用: 有三种模式:命令模式.输入模式.底线命令模式 命令模式: 输入 i 会进入输入模式 输入: 会进入底线命令模式 输 ...