【链接】 我是链接,点我呀:)

【题意】

给你两个数组a,b;
b数组是1..n的一个排列。
现在给你两种操作:
add l,r将a[l..r]都加上1
query l,r 询问$∑^r_l\frac{ai}{bi} $
其中a[i]/b[i]是下取整。
n

【题解】

很优秀的题
我们可以在线段树1中维护所有a[i]/b[i]的值
想一下何时我们才要让线段树1中的值改变?
必然是我们一直加a的值,让a[i]的值超过了b[i]
设让线段树中的值改变操作为操作x
那么操作x最多湖执行多少次呢?
a最多变成10^5
那么就是
∑10^5/b[i] ,又b是一个排列
那么原式即$10^5*(1/1+1/2+1/3+...+1/n)$
其中右边那个式子是logn级别的。
那么总共要进行的操作x的次数就约等于n*logn
那么我们可以这么做。
另外开一个线段树2.
这个线段树一开始每个位置上的值为b[i]
我们可以维护一下区间最小值。
然后每次add(l,r)对应地把线段树2中相应位置递减1.
直到发现某个位置变成0了(最小值变成0就说明有些位置变成0了
那么就把线段树1中对应的a[i]/b[i]的值递增1.
然后再把那个位置重置为对应的b[i]就可以了。
根据上面的分析,这个递增操作次数最多n*logn次。
query操作直接就是线段树1的区间求和问题了。很轻松就能解决。

【代码】

#include <bits/stdc++.h>
#define LL long long
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define rep1(i,a,b) for (int i = a;i<= b;i++)
using namespace std; const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int N = 1e5; int a[N+10],b[N+10],mi[N*4+10],tag[N*4+10],sum2[N*4+10];
int n,q;
char s[8]; void _updata2(int l,int r,int rt,int pos){
if (l==r){
sum2[rt]++;
return;
}
int mid = (l+r)>>1;
if (pos<=mid) _updata2(lson,pos);
else _updata2(rson,pos);
sum2[rt] = sum2[rt<<1]+sum2[rt<<1|1];
} void push_down(int rt){
if (tag[rt]>0){
tag[rt<<1]+=tag[rt];tag[rt<<1|1]+=tag[rt];
mi[rt<<1]-=tag[rt];mi[rt<<1|1]-=tag[rt];
tag[rt] = 0;
}
} void _find0(int l,int r,int rt){
if (l==r){
_updata2(1,n,1,l);
mi[rt] = b[l];
return;
}
push_down(rt);
int mid = (l+r)>>1;
if (mi[rt<<1]==0) _find0(lson);
if (mi[rt<<1|1]==0)_find0(rson);
mi[rt]= min(mi[rt<<1],mi[rt<<1|1]);
} void _updata1(int l,int r,int rt,int L,int R){
if (L<=l && r<=R){
mi[rt]--;
tag[rt]++;
if (mi[rt]==0){
_find0(l,r,rt);
}
return;
}
push_down(rt);
int mid = (l+r)>>1;
if (L<=mid) _updata1(lson,L,R);
if (mid<R) _updata1(rson,L,R);
mi[rt] = min(mi[rt<<1],mi[rt<<1|1]);
} long long get_ans2(int l,int r,int rt,int L,int R){
if (L<=l && r <= R) return sum2[rt];
int mid = (l+r)>>1;
long long temp1 = 0,temp2 = 0;
if (L<=mid) temp1 = get_ans2(lson,L,R);
if (mid<R) temp2 = get_ans2(rson,L,R);
return temp1+temp2;
} void build1(int l,int r,int rt){
tag[rt] = 0;
int mid = (l+r)>>1;
if (l==r){
mi[rt] = b[l];
return;
}
if (l<=mid) build1(lson);
if (mid<r) build1(rson);
mi[rt] = min(mi[rt<<1],mi[rt<<1|1]);
} int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
while (cin >> n >> q)
{
memset(a,0,sizeof a);
memset(sum2,0,sizeof sum2);
rep1(i,1,n) cin >> b[i];
build1(1,n,1);
while (q--)
{
int ll,rr;
cin >> s >> ll >> rr;
if (s[0]=='a')
_updata1(1,n,1,ll,rr);
else
cout<<get_ans2(1,n,1,ll,rr)<<endl; }
}
return 0;
}

【2018 Multi-University Training Contest 2 1007】Naive Operations的更多相关文章

  1. 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump

    多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...

  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 4941 2014 Multi-University Training Contest 7 1007

    Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  4. HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)

    6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...

  5. HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)

    6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...

  6. 【2017 Multi-University Training Contest - Team 2】TrickGCD

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6053 [Description] 给你一个b数组,让你求一个a数组: 要求,该数组的每一位都小于等 ...

  7. 【2017 Multi-University Training Contest - Team 2】Maximum Sequence

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...

  8. 【2017 Multi-University Training Contest - Team 2】 Regular polygon

    [Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...

  9. 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?

    [Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...

随机推荐

  1. Android学习总结(3)——Handler深入详解

    什么是Handler Handler是Android消息机制的上层接口,它为我们封装了许多底层的细节,让我们能够很方便的使用底层的消息机制.Handler的最常见应用场景之一便是通过Handler在子 ...

  2. MAVEN项目的搭建

    MAVEN能为我们做什么? 1.Jar的声明式依赖性管理 2.项目的自动构建 搭建流程 环境配置 http://maven.apache.org/download.html 下载最新版本Maven 3 ...

  3. 0113针对大数据量SUM的优化-思路

    转自博客:http://bbs.csdn.net/topics/390426801?page=1 优化思路:无论如何你的结果都是要扫描全有表记录,而在456010记录中,的UserName的分布导致这 ...

  4. centos: git clone提示Permission denied publickey 问题

    问题: Initialized empty Git repository in /data1/mouxuan/fastsocket-private/.git/ Permission denied (p ...

  5. wordpress迁移以及遇到的一些问题[mysql备份导入导出][固定链接404]

    总的问题有两个,一是apache的配置,二是mysql的导出和导入.以及迁移后遇到的一些问题解决过程和方法. A机器为老server.B为新server,A机器使用Appserv,B使用wmap,在配 ...

  6. python2.7编码与解码

    常见的编码 ASCII: 美国人发明的,只编码英文字母和符号,1个字节. GB2312: 中国人发明的,增加了中文汉字和符号,2个字节. Unicode: 为了把所有语言都统一到一套编码里,一般是2个 ...

  7. POJ 1236--Network of Schools【scc缩点构图 &amp;&amp; 求scc入度为0的个数 &amp;&amp; 求最少加几条边使图变成强联通】

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13325   Accepted: 53 ...

  8. BZOJ:3441 乌鸦喝水

    bzoj:3441 乌鸦喝水 题目传送门 Description 一只乌鸦在自娱自乐,它在面前放了n个有魔力的水缸,水缸里装有无限的水. 他准备从第1个水缸飞到第n个水缸,共m次.在飞过一个水缸的过程 ...

  9. springboot的常见配置

    1.Springboot热部署 热部署的意思就是当任何类发生改变时,通过JVM类加载的方式加载到虚拟机上,这样就不需要我们重启Application类了 做法: 1)添加一个依赖到pom.xml上: ...

  10. Core篇——初探依赖注入

    目录 1.DI&&IOC简单介绍 2.UML类图中六种关联关系 3..net core 中DI的使用 4..net core DI初始化源码初窥 DI&&IOC简单介绍 ...