HDU 6315: Naive Operations
Naive Operations
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Others)
Total Submission(s): 1791 Accepted Submission(s): 772
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 $a_l,a_{l+1}...a_r$
2. query l r: query $\sum_{i=l}^r \lfloor a_i / b_i \rfloor$
For each test case, in the first line, two integers n,q, representing the length of a,b and the number of queries.
In the second line, n integers separated by spaces, representing permutation b.
In the following q lines, each line is either in the form 'add l r' or 'query l r', representing an operation.
$1 \leq n,q \leq 100000$, $1 \leq l \leq r \leq n$, there're no more than 5 test cases.
1 5 2 4 3
add 1 4
query 1 4
add 2 5
query 2 5
add 3 5
query 1 5
add 2 4
query 1 4
add 2 5
query 2 5
add 2 2
query 1 5
1
2
4
4
6
分析:线段树模板改一改,维护最大值最小值就好了。
- #include <iostream>
- #include <string>
- #include <cstdio>
- #include <cmath>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <deque>
- #include <map>
- #define range(i,a,b) for(auto i=a;i<=b;++i)
- #define LL long long
- #define itrange(i,a,b) for(auto i=a;i!=b;++i)
- #define rerange(i,a,b) for(auto i=a;i>=b;--i)
- #define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
- using namespace std;
- int b[int(1e5+)],n,q;
- template <class T>
- class segtree{
- private:
- T *add,*cnt,*minb,*maxa;
- void pushup(int rt){
- minb[rt]=min(minb[rt<<],minb[rt<<|]);
- cnt[rt]=cnt[rt<<]+cnt[rt<<|];
- maxa[rt]=max(maxa[rt<<],maxa[rt<<|]);
- }
- void pushdown(int rt){
- if(add[rt]){
- int v=add[rt];
- add[rt]=;
- maxa[rt<<]+=v;
- maxa[rt<<|]+=v;
- add[rt<<]+=v;
- add[rt<<|]+=v;
- }
- }
- public:
- explicit segtree(int len=int(1e5+)){
- add=new T[len<<];fill(add,);
- cnt=new T[len<<];fill(cnt,);
- minb=new T[len<<];fill(minb,);
- maxa=new T[len<<];fill(maxa,);
- }
- void build(int l,int r,int rt){
- add[rt]=;
- if(l==r){
- cnt[rt]=maxa[rt]=;
- minb[rt]=b[l];
- return;
- }
- int m=(l+r)>>;
- build(l,m,rt<<);
- build(m+,r,rt<<|);
- pushup(rt);
- }
- void update(int L,int R,T c,int l,int r,int rt){
- if(L<=l&&r<=R){
- maxa[rt]++;
- if(maxa[rt]<minb[rt]){
- ++add[rt];
- return;
- }
- if(l==r&&maxa[rt]>=minb[rt]){
- ++cnt[rt];
- minb[rt]+=b[l];
- return;
- }
- }
- pushdown(rt);
- int m=(l+r)>>;
- if(L<=m)update(L,R,,l,m,rt<<);
- if(m<R)update(L,R,,m+,r,rt<<|);
- pushup(rt);
- }
- T query(int L,int R,int l,int r,int rt){
- if(L<=l&&r<=R)return cnt[rt];
- int m=(l+r)>>;
- pushdown(rt);
- T ret=;
- if(L<=m)ret+=query(L,R,l,m,rt<<);
- if(m<R)ret+=query(L,R,m+,r,rt<<|);
- return ret;
- }
- };
- segtree<int>tree;
- void init(){}
- void solve(){
- while(cin>>n>>q){
- range(i,,n)scanf("%d",b+i);
- tree.build(,n,);
- char op[];int l,r;
- while(q--){
- scanf("%s%d%d",op,&l,&r);
- if(op[]=='a')tree.update(l,r,,,n,);
- else printf("%d\n",tree.query(l,r,,n,));
- }
- }
- }
- int main() {
- init();
- solve();
- return ;
- }
HDU 6315: Naive Operations的更多相关文章
- 杭电多校第二场 hdu 6315 Naive Operations 线段树变形
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- hdu 6315 Naive Operations (2018 Multi-University Training Contest 2 1007)
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树
hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线 ...
- 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(线段树+区间维护)多校题解
题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...
- 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 6315 Naive Operations(线段树+复杂度均摊)
发现每次区间加只能加1,最多全局加\(n\)次,这样的话,最后的答案是调和级数为\(nlogn\),我们每当答案加1的时候就单点加,最多加\(nlogn\)次,复杂度可以得当保证. 然后问题就是怎么判 ...
- HDU 6315 Naive Operations 【势能线段树】
<题目链接> 题目大意: 给出两个序列,a序列全部初始化为0,b序列为输入值.然后有两种操作,add x y就是把a数组[x,y]区间内全部+1,query x y是查询[x,y]区间内∑ ...
- HDU 6351 Naive Operations(线段树)
题目: http://acm.hdu.edu.cn/showproblem.php?pid=6315 Naive Operations Time Limit: 6000/3000 MS (Java/O ...
随机推荐
- [Leetcode] unique paths 独特路径
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
- 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索
第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...
- CodeForces743E. Vladik and cards 二分+状压dp
这个题我们可以想象成_---___-----__的一个水柱它具有一遍优一遍行的性质因此可以用来二分最小值len,而每次二分后我们都要验根,we可以把这个水柱想成我们在每个数段里取前一段的那个数后一段有 ...
- 微信小程序,设置所有标签样式
page, view, scroll-view, swiper, movable-area, cover-view, text, icon, rich-text, progress, button, ...
- CSS3中transform属性的用法
有时候网站也要愚弄一下访客,比如愚人节.下面我给大家推荐个效果,就是整个页面左右颠倒了.css3 很强大,简单的几行代码就可以帮我们实现这个效果. view source print? 01 &l ...
- tyvj1305 最大子序和(单调队列
题目地址:http://www.joyoi.cn/problem/tyvj-1305 最大子序和 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Loc ...
- Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致
先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...
- 利用java.lang.reflect.Constructor动态实例化对象
} } } } } Student t = co ...
- 学习正则表达式及c#应用
1.0正则表达式语法 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”).模式描述在搜索文本时要匹配的一个或多个字符串. 正则表达式示例 表达式 ...
- 将数据导入hive,再将hive表导入hbase
将数据到入hive的无分区表,再将无分区表导入hive的有分区表: --备份 create table tds_package_secinfobk as select * from tds_packa ...