原题地址

Naive Operations

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Others)
Total Submission(s): 887    Accepted Submission(s): 336

Problem Description
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=l⌊ai/bi⌋
 
Input
There are multiple test cases, please read till the end of input file.
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≤n,q≤100000, 1≤l≤r≤n, there're no more than 5 test cases.
 
Output
Output the answer for each 'query', each one line.
 
 
Sample Input
5 12
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
 
Sample Output
1 1 2 4 4 6
 
题意:给两个长度为N 数组 A和B,B是1-N的某一种排序,A全为0;
两种操作:
1.给你l,r 把数组A[l]到A[r]全部加1
2.给你l,r求A[l]/B[l]一直加到A[r]/B[r]的和;
 
思路:
数据量十万所以复杂度只能在NlogN到Nsqrt(N)左右;
而且很自然想到线段树操作;
区间加法 线段树的基本操作;
但是没办法每次除法都要处理到叶子节点;
所以如何处理除法是关键;
在比赛中想了无数办法,因为各种中途脑子短路和智商不行而打不出来(太蠢
✔正确做法 利用线段树维护区间最小值,每次区间加1时最小值减去1,当区间最小值减为0时说明这个区间中有叶子节点的A[X]/B[X]多了1;然后递归下去找到这个节点加1,跟他关联的区间的值都加上1;
所以复杂度每次区间加法和查询为logn寻找最小值减为0的叶子节点复杂度为logn 所以总复杂度为(NlogN*logN)
 
代码:
#include<bits/stdc++.h>

using namespace std;

#define ls (id<<1)
#define rs ((id<<1)|1)
#define mid ((l+r)>>1)
typedef long long LL; const int maxn=+;
int n,q;
int b[maxn];
struct Node{ int mina;
int valb;
int zero_sum;
int id;
int lazy; }node[maxn<<];
void pushdown(int id,int l,int r){//往下更新
node[ls].lazy+=node[id].lazy;
node[rs].lazy+=node[id].lazy;
node[ls].mina-=node[id].lazy;
node[rs].mina-=node[id].lazy;
node[id].lazy=;
}
void pushup(int id,int l,int r){//往上更新
node[id].zero_sum=node[ls].zero_sum+node[rs].zero_sum;
node[id].mina=min(node[ls].mina,node[rs].mina);
}
void build(int l,int r,int id){
node[id].zero_sum=node[id].lazy=;
if(l==r){ node[id].valb=node[id].mina=b[l];
//cout<<"id=="<<id<<" l=="<<l<<" r=="<<r<<"node[id].mina="<<node[id].mina<<endl;
return;
}
build(l,mid,ls);
build(mid+,r,rs);
pushup(id,l,r);
}
void update(int l,int r,int id,int ql,int qr){
//cout<<"id=="<<id<<" l=="<<l<<" r=="<<r<<"node[id].mina="<<node[id].mina<<endl;
if(l>r)return;
if(node[id].mina>&&ql<=l&&qr>=r){///到时候修改一下!!有包含的区间并且不存在要为0的叶子节点;
node[id].lazy++;
node[id].mina--;
return;
}
if(l==r&&node[id].mina==){//正好整除的叶子节点
node[id].zero_sum++;
node[id].lazy=;
node[id].mina=node[id].valb;
return;
}
if(node[id].lazy)pushdown(id,l,r);
if(qr<=mid)update(l,mid,ls,ql,qr);
else if(ql>mid)update(mid+,r,rs,ql,qr);
else{
update(l,mid,ls,ql,qr);
update(mid+,r,rs,ql,qr);
}
pushup(id,l,r);
}
int query(int l,int r,int id,int ql,int qr){
// cout<<"id=="<<id<<" l=="<<l<<" r=="<<r<<"node[id].mina="<<node[id].mina<<endl;
if(l>r)return ;
if(ql<=l&&r<=qr)return node[id].zero_sum;//被需要查询包含的区间;
/*if (node[id].mina <= 0) {
update(1, 1, n, ql, qr);
}*/
if(qr<=mid)return query(l,mid,ls,ql,qr);
else if(ql>mid)return query(mid+,r,rs,ql,qr);
else{
return query(l,mid,ls,ql,qr)+query(mid+,r,rs,ql,qr);
}
}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>n>>q){
for(int i=;i<=n;i++)cin>>b[i];
build(,n,);
while(q--){
char s[];
int ll,rr;
cin>>s>>ll>>rr;
if(s[]=='a')update(,n,,ll,rr);
else
cout<<query(,n,,ll,rr)<<endl;
}
}
return ;
}

HDU-6315 Naive Operations//2018 Multi-University Training Contest 2___1007 (线段树,区间除法)的更多相关文章

  1. HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

    http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...

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

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

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

  4. HDU 6315: Naive Operations

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

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

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

  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 6315 Naive Operations(线段树+区间维护)多校题解

    题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...

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

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

随机推荐

  1. 《Cracking the Coding Interview》——第4章:树和图——题目4

    2014-03-19 03:40 题目:给定一棵二叉树,把每一层的节点串成一个链表,最终返回一个链表数组. 解法:前序遍历,遍历的同时向各个链表里添加节点.水平遍历好像还不如前序遍历来得方便. 代码: ...

  2. 《Cracking the Coding Interview》——第1章:数组和字符串——题目6

    2014-03-18 01:45 题目:给定一个NxN的矩阵,就地旋转90度.(没有样例又不说方向的话,随便往哪儿转.) 解法:如果N为奇数,除了中心点以外四等分.如果N为偶数,四等分.按照A-> ...

  3. soapUI的简单使用(webservice接口功能测试)

    1.soapUI支持什么样的测试? 功能测试.性能测试.负载.回归测试等,它不仅仅可以测试基于 SOAP 的 Web 服务,也可以测试 REST 风格的 Web 服务. 1.SoapUI安装注意事项 ...

  4. NOIP2018 集训(三)

    A题 Tree 问题描述 给定一颗 \(n\) 个点的树,树边带权,试求一个排列 \(P\) ,使下式的值最大 \[\sum_{i=1}^{n-1} maxflow(P_i, P_{i+1}) \] ...

  5. sqlserver 列出表字段和字段说明

    --表描述SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties dsLEFT JOIN sysobjects tbs ON ds.ma ...

  6. Opencv3.1.0安装包

    这个资源是Opencv3.1.0安装包,包括Windows软件包,Android软件包,IOS软件包,还有opencv的源代码:需要的下载吧. 点击下载

  7. JavaWeb笔记(四)Cookie&Session

    Cookie 客户端会话技术,客户端保存,用于存储少量不太敏感的数据,在不登陆的情况下完成服务器对客户端的身份识别 简单使用步骤 创建Cookie对象,绑定数据 new Cookie(String n ...

  8. node + express + iis + iisnode + urlrewrite搭建站点

    前提条件:安装iis的电脑 准备条件: 1.下载iisnode 地址https://github.com/tjanczuk/iisnode/wiki/iisnode-releases  安装 2.下载 ...

  9. iPhone新建项目不能全屏

    上个周做项目的时候,发现新建了一个项目不能全屏.伤透了我的脑筋,然后又请教了团队里其他两个大牛帮我搞定了这个问题. 虽然是搞定了,但也看的出大牛也是云里雾里.歪打正着解决的. 今天又想新做个项目,这个 ...

  10. C++ 虚函数的内存分配

    1.无继承的普通类:   在有虚函数的情况下类会为其增加一个隐藏的成员,虚函数表指针,指向一个虚函数表,虚函数表里面就是类的各个虚函数的地址了.那么,虚函数表指针是以什么模型加入到类里面的,虚函数表里 ...