hdu 6406 Taotao Picks Apples (2018 Multi-University Training Contest 8 1010)(二分,前缀和)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6406
思路:
暴力,预处理三个前缀和:【1,n】桃子会被摘掉,1到当前点的最大值,1到当前点被摘掉的桃子的数量,然后我们枚举修改p点造成的所有影响,:
1,假如新输入的点比原先的点的值更大,那么我们对修改后p这个点的值和【1,p-1】的最大值关系进行分析,也就是分析前半段的影响:(1)如果p点大于1-p-1的最大值的时候我们直接利用前缀和O(1)得到【1,p-1】有多少个桃子被摘掉,然后加上当前这个。(2)如果p点小于等于【1,p-1】的最大值时,对前半段和后半段都不会造成影响,直接输出预处理的到的【1,n】的值就好了;然后我们分析后半段的影响:(1)如果p点大于【1,p-1】的最大值,那么后半段中只有被摘掉的桃子会受到影响,我们直接二分找到【p+1,n】中被摘掉的桃子的值大于被修改后的值c的下标,减一下,就得出了,后半段会被摘掉的桃子中有几个在p点被修改后依旧需要摘掉,将后半段的值与前半段的值加起来就好了。(2)如果p点小于等于【1,p-1】的最大值,那么后半段不造成影响,
2.假如新输入的点小于等于原先的点值,依旧对修改后p这个点的值和【1,p-1】的最大值进行分析:先分析前半段的影响:(1)如果p点大于1-p-1的最大值的时候我们直接利用前缀和O(1)得到【1,p-1】有多少个桃子被摘掉,然后加上当前这个。(2)如果p点小于等于【1,p-1】的最大值,那么这个点依旧对前半段不造成影响,前半段的值等于【1,p-1】中被摘掉的桃子的数量,
接下来就是最难得后半段的讨论:
之前处理这里思路被卡了很久:(1)如果p点大于1-p-1的最大值
因为当前点变小了,对后面点造成的影响就是会摘掉一些原先不会被摘的桃子,那么怎么确定这些桃子的具体是那些呢? 实际上我们可以推出,这些多摘的桃子都是在1到当前坐标中只小于p的数,因为这些数是当p变小了才多出来的,那么他们在1到当前点肯定是只小于p点,那么我们把它加到前一维为p的vecvector数组里,至于怎么找到这些值,我们只要多维护一个第二大值就可以了,这些第二大值就是有可能会多摘的桃子。当p点为原先会被摘的桃子时我们对存在v[p]里的值进行二分找到比p值修改后大的那些值,也就是后半段新增的值,再加上原先就要摘得值。
(2) 如果小于等于的话,依旧不造成影响,直接去前缀和就好了
3,假设输入的点和原来的点值一样,直接前缀和取
这样一共是五种主要情况: 两种用二分O(logn),另外三种直接前缀和O(1),稍微计算便可知不会超时。最后跑了405ms,题目给了2000mS,算跑的很快的了, 就是实现有点复杂,应该还有更好的解法,不过比赛的时候没想那么多,直接暴力莽过去了,还好过了要不改代码要改到吐。。QAQ
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5+;
struct node{
int id,val;
};
vector<int>v[M];
int a[M],ans[M],maxx[M],b[M],arr[M]; int main()
{
int t,n,q,p,c;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&q);
for(int i = ;i <= n;i ++){
scanf("%d",&a[i]);
}
node mx,mx1;
mx.val = ; mx1.val = ,mx.id = ,mx1.id = ;
int cnt = ,num = ;
maxx[] = ;
for(int i = ;i <= n;i ++){
if(mx.val < a[i]){
mx1.val = mx.val; mx1.id = mx.id;
mx.val = a[i]; mx.id = i; b[cnt++] = a[i];
num++;
}
else if(mx1.val < a[i]){
mx1.val = a[i]; mx1.id = i;
v[mx.id].push_back(a[i]);
}
maxx[i] = mx.val; ans[i] = num;
}
while(q--){
scanf("%d%d",&p,&c);
int sum = ;
if(c > a[p]){
if(c > maxx[p-]){
sum ++; sum += ans[p-];
int kk = upper_bound(b,b+cnt,c) - b;
if(kk != cnt) sum += cnt-kk;
}
else
sum = ans[n];
}
else if(c == a[p]) sum = ans[n];
else{
if(c > maxx[p-]) sum++,sum += ans[p-];
else sum += ans[p-];
if(a[p] == maxx[p]){
int kk = upper_bound(v[p].begin(),v[p].end(),c)-v[p].begin();
sum += v[p].size() - kk;
int kk1 = upper_bound(b,b+cnt,a[p]) - b;
if(kk1 != cnt) sum += cnt-kk1;
}
else
sum = ans[n];
}
printf("%d\n",sum);
}
for(int i = ;i <= n;i ++){
maxx[i] = ; ans[i] = ; v[i].clear();
}
for(int i = ;i <= cnt;i ++) b[i] = ;
}
return ;
}
hdu 6406 Taotao Picks Apples (2018 Multi-University Training Contest 8 1010)(二分,前缀和)的更多相关文章
- hdu 6406 Taotao Picks Apples 线段树 单点更新
Taotao Picks Apples Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- [乱搞]hdu 6406 Taotao picks apples 笛卡尔树+倍增
题目链接 Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n app ...
- hdu 6406 Taotao Picks Apples (线段树)
Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n apples o ...
- HDU 6406 Taotao Picks Apples & FJUT3592 做完其他题后才能做的题(线段树)题解
题意(FJUT翻译HDU): 钱陶陶家门前有一棵苹果树. 秋天来了,树上的n个苹果成熟了,淘淘会去采摘这些苹果. 到园子里摘苹果时,淘淘将这些苹果从第一个苹果扫到最后一个. 如果当前的苹果是第一个苹果 ...
- HDU 6406 Taotao Picks Apples 线段树维护
题意:给个T,T组数据: 每组给个n,m:n个数,m个操作: (对序列的操作是,一开始假设你手上东西是-INF,到i=1时拿起1,之后遍历,遇到比手头上的数量大的数时替换(拿到手的算拿走),问最后拿走 ...
- HDU - 6406 Taotao Picks Apples (RMQ+dp+二分)
题意:N个高度为hi的果子,摘果子的个数是从位置1开始从左到右的严格递增子序列的个数.有M次操作,每次操作对初始序列修改位置p的果子高度为q.每次操作后输出修改后能摘到得数目. 分析:将序列分为左.右 ...
- 【杂题总汇】HDU-6406 Taotao Picks Apples
[HDU 6406]Taotao Picks Apples 多校赛的时候多写了一行代码就WA了……找了正解对拍,在比赛结束后17分钟AC了
- hdu6406 Taotao Picks Apples(线段树)
Taotao Picks Apples 题目传送门 解题思路 建立一颗线段树,维护当前区间内的最大值maxx和可摘取的苹果数num.最大值很容易维护,主要是可摘取的苹果数怎么合并.合并左右孩子时,左孩 ...
- HDU 6141 - I am your Father! | 2017 Multi-University Training Contest 8
思路来自 FXXL 最小树形图模板用kuangbin的 /* HDU 6141 - I am your Father! [ 最小树形图 ] | 2017 Multi-University Traini ...
随机推荐
- 基于TerraExplorer Pro 6.1 实现对Shape中Feature对象拾取查询
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Luogu4137 Rmq problem/mex 主席树
传送门 用主席树水莫队题…… 我们对于前缀和建立主席树,对于主席树中的每一个叶子节点表示它对应的数字最后出现的位置的编号,非叶子节点求左右节点的最小值,那么对于每一次询问$l,r$就是在第$r$棵主席 ...
- EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET
十年河东,十年河西,莫欺少年穷. EF就如同那个少年,ADO.NET则是一位壮年.毕竟ADO.NET出生在EF之前,而EF所走的路属于应用ADO.NET. 也就是说:你所写的LINQ查询,最后还是要转 ...
- 省市区三级联动,JS实现
文件下载地址:http://files.cnblogs.com/files/chenwolong/jsAddress.rar 示例截图: 在这里自己记录一个方法: function cmbAddOpt ...
- [Spark][Python]spark 从 avro 文件获取 Dataframe 的例子
[Spark][Python]spark 从 avro 文件获取 Dataframe 的例子 从如下地址获取文件: https://github.com/databricks/spark-avro/r ...
- $\mathfrak {reputation}$
\(\mathfrak {reputation}\) 举世盛名 身败名裂
- cmd命令入门
第一类: 介绍原生的DOS 首先在cmd命令输入help,看到如下图的结果,这里展示的原生的DOS命令. 这里列出了一些命令,可以自己试试的玩.一般看到一个命令后,如果没有说明文档,你就尝试的在其命令 ...
- 时间复杂度O(n^2)和O(nlog n)差距有多大?
0. 时间复杂度 接触到算法的小伙伴们都会知道时间复杂度(Time Complexity)的概念,这里先放出(渐进)时间复杂度的定义: 假设问题规模是\(n\),算法中基本操作重复执行的次数是\(n\ ...
- linux下文件加密方法总结
为了安全考虑,通常会对一些重要文件进行加密备份或加密保存,下面对linux下的文件加密方法做一简单总结: 方法一:gzexe加密这种加密方式不是非常保险的方法,但是能够满足一般的加密用途,可以隐蔽脚本 ...
- B树、B-树、B+树、B*树相关
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...