博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-6315:Naive Operations(线段树+思维)
阅读量:5907 次
发布时间:2019-06-19

本文共 2332 字,大约阅读时间需要 7 分钟。

链接:

题意:

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

b is a static permutation of 1 to n. Initially a is filled with zeroes.
There are two kind of operations:
1. add l r: add one for al,al+1...ar
2. query l r: query ri=lai/bi

题解:每次更新时,直接将 b 数组的对应区间都减一,如果发现有零,就将对应位置的答案加一并重置回原b数组对应的数。

#include 
using namespace std;const double EPS = 1e-6;const int INF = 0x3f3f3f3f;const int mod = 1e9 + 7;const int maxn = 1e5 + 10;int n, m, x, y;int a[maxn];char q[maxn];struct Node{
int mi, sum, add;} T[maxn<<2];void Build(int l, int r, int rt){ if(l == r){ T[rt].mi = a[l]; T[rt].sum = 0; T[rt].add = 0; return ; } int mid = (l + r) >> 1; Build(l, mid, rt<<1); Build(mid + 1, r, rt<<1|1); T[rt].mi = min(T[rt<<1].mi, T[rt<<1|1].mi); T[rt].sum = T[rt<<1].sum + T[rt<<1|1].sum; T[rt].add = T[rt<<1].add + T[rt<<1|1].add;}void Pushdown(int rt, int l, int r){ if(!T[rt].add) return; int mid = (l + r) >> 1; T[rt<<1].mi += T[rt].add; T[rt<<1|1].mi += T[rt].add; T[rt<<1].add += T[rt].add; T[rt<<1|1].add += T[rt].add; T[rt].add = 0;}void Update(int L, int R, int l, int r, int rt, bool ok){ if(L <= l && r <= R){ if(ok){ T[rt].add--; T[rt].mi--; } if(T[rt].mi > 0) return; if(l == r){ if(T[rt].mi == 0) T[rt].sum++, T[rt].mi = a[l]; return; } ok = false; } Pushdown(rt, l, r); int mid = (l + r) >> 1; if(L <= mid) Update(L, R, l, mid, rt<<1, ok); if(R > mid) Update(L, R, mid + 1, r, rt<<1|1, ok); T[rt].mi = min(T[rt<<1].mi, T[rt<<1|1].mi); T[rt].sum = T[rt<<1].sum + T[rt<<1|1].sum;}int Query(int L, int R, int l, int r, int rt){ if(L <= l && r <= R) return T[rt].sum; int ans = 0, mid = (l + r) >> 1; if(L <= mid) ans += Query(L, R, l, mid, rt<<1); if(R > mid) ans += Query(L, R, mid + 1, r, rt<<1|1); return ans;}int main(){ while(scanf("%d%d", &n, &m) != EOF){ for(int i = 1; i <= n; i++) scanf("%d", &a[i]); Build(1, n, 1); while(m--){ scanf("%s%d%d", q, &x, &y); if(q[0] == 'a') Update(x, y, 1, n, 1, true); else printf("%d\n", Query(x, y, 1, n, 1)); } } return 0;}

 

转载于:https://www.cnblogs.com/chenquanwei/p/9374234.html

你可能感兴趣的文章
Thread 中的run()
查看>>
MongoDB(课时5 数据查询)
查看>>
python实现 --工资管理系统
查看>>
构建高性能数据库缓存之redis主从复制
查看>>
第三周作业
查看>>
找点面试题目
查看>>
圆柱、圆锥的侧面积和球的表面积公式推导(不用积分)
查看>>
滑雪在日本 之 新泻篇 5
查看>>
【DataStructure In Python】Python实现各种排序算法
查看>>
【HDOJ】3061 Battle
查看>>
学习,一定要坚持
查看>>
分布式理论(四)—— 一致性协议之 3PC
查看>>
作业二
查看>>
Octopus系列之js公共函数
查看>>
tensorflow实现的一个最基本cnn
查看>>
leetcode 10 正则表达式匹配
查看>>
知乎收藏夹
查看>>
POJ 1161 Help Jimmy
查看>>
JS获取昨天/今天/今年第一天的方法
查看>>
js中url传值中文乱码的解决方法
查看>>