HDU6315 Naive Operations(线段树 复杂度分析)
题意

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(线段树 复杂度分析)的更多相关文章
- HDU 6315 Naive Operations(线段树+复杂度均摊)
发现每次区间加只能加1,最多全局加\(n\)次,这样的话,最后的答案是调和级数为\(nlogn\),我们每当答案加1的时候就单点加,最多加\(nlogn\)次,复杂度可以得当保证. 然后问题就是怎么判 ...
- HDU6315 Naive Operations 线段树
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门 原题目描述在最下面. Solution ...
- hdu Naive Operations 线段树
题目大意 题目链接Naive Operations 题目大意: 区间加1(在a数组中) 区间求ai/bi的和 ai初值全部为0,bi给出,且为n的排列,多组数据(<=5),n,q<=1e5 ...
- 杭电多校第二场 hdu 6315 Naive Operations 线段树变形
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- 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,另一种操 ...
- HDU 6315 Naive Operations(线段树区间整除区间)
Problem DescriptionIn a galaxy far, far away, there are two integer sequence a and b of length n.b i ...
- 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, ...
- HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树
hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线 ...
- 2018HDU多校二 -F 题 Naive Operations(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6315 In a galaxy far, far away, there are two integer ...
随机推荐
- loj #6250. 「CodePlus 2017 11 月赛」找爸爸
#6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...
- luogu2155 [SDOI2008]沙拉公主的困惑
link 求出1到N的阶乘中与M的阶乘互质的数的个数,对R取模,多组询问,R<=10^9+10,T<=10000,1 < = N , M < = 10000000 1到\(M! ...
- HDU6301 Distinct Values (多校第一场1004) (贪心)
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- centos操作---搭建环境 安装python
1.安装python3.6.2 安装依赖 yum -y groupinstall "Development tools" yum -y install zlib-devel bzi ...
- StackOverflow
stackoverflow栈溢出 stacker栈式存储器 signup注册 signin登陆 inbox收信信箱 verify 核实 otherwise另外的 noted说明 (就是说有明文指出 ...
- pytorch 加载mnist数据集报错not gzip file
利用pytorch加载mnist数据集的代码如下 import torchvision import torchvision.transforms as transforms from torch.u ...
- LUNA16数据集(一)简介
LUNA16,全称Lung Nodule Analysis 16,是16年推出的一个肺部结节检测数据集,旨在作为评估各种CAD(computer aid detection计算机辅助检测系统)的ban ...
- 【Cracking the Code Interview(5th edition)】二、链表(C++)
链表结点类型定义: class Node { public: ; Node *next = nullptr; Node(int d) { data = d; } }; 快行指针(runner)技巧: ...
- Dictionary 检测key是否存在
if(dict.ContainsKey(T key)) { //已存在key }
- vim与vi操作
vim是vi发展而来的文本编辑器: vi是最原始的文本编辑器: vi/vim的使用: 有三种模式:命令模式.输入模式.底线命令模式 命令模式: 输入 i 会进入输入模式 输入: 会进入底线命令模式 输 ...