题目链接:点击查看

题目大意:给出一个长度为 n 的数列 a,再给出 m 次询问,每次询问假设如果设置 a[ pos ] = val 的话,那么此时序列中的最长上升子序列是多少,此时的上升子序列指的是:若选取 a[ 1 ] 后,找到下一个大于 a[ 1 ] 的位置记为 a[ pos ] ,依次类推

题目分析:考察区间合并的一道题目,因为这个题目对于最长上升子序列多加了一点限制,所以处理起来也并不是很复杂,假如现在有左区间和右区间需要合并,我们可以维护一下每个区间的最大值和贡献,不难看出,左区间一定是有贡献的,对于右区间来说还需要进一步讨论:

  1. 如果右区间的最大值小于左区间的最大值,那么右区间的贡献为 0
  2. 如果右区间的左子区间的最大值小于左区间的最大值,那么左子区间的贡献为 0 ,向右子区间递归
  3. 如果右区间的左子区间的最大值大于左区间的最大值,那么左子区间的贡献继续递归,此时右子区间的贡献已经不由左区间控制了,可以直接加上,根据 pushup 函数中的关系,移项可以得出右子区间对于整个区间的贡献

最后强调一下,上面第三种情况,右子区间对于整个区间的贡献,并不能单纯的以 cnt[ k<<1|1 ] 为答案,因为在 pushup 中的公式为:cnt[ k ] = cnt[ k<<1 ] + cal() ,此处的 cal 函数计算的才是右子区间对于整个区间的贡献,所以通过移项可以得出,此时右子区间的贡献为 cnt[ k ] - cnt[ k<<1 ]

时间复杂度是双 log 级别的,不过 n 只有 1e5 ,双 log 的复杂度也是顶得住的

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;int a[N];struct Node
{int l,r,mmax,cnt;
}tree[N<<2];int cal(int k,int h)
{if(tree[k].mmax<=h)return 0;if(tree[k].l==tree[k].r)return tree[k].mmax>h;int mid=tree[k].l+tree[k].r>>1;if(tree[k<<1].mmax<=h)return cal(k<<1|1,h);elsereturn cal(k<<1,h)+tree[k].cnt-tree[k<<1].cnt;
}void pushup(int k)
{tree[k].mmax=max(tree[k<<1].mmax,tree[k<<1|1].mmax);tree[k].cnt=tree[k<<1].cnt+cal(k<<1|1,tree[k<<1].mmax);
}void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;if(l==r){tree[k].mmax=a[l];tree[k].cnt=1;return;}int mid=l+r>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);pushup(k);
}void change(int k,int pos,int val)
{if(tree[k].l==tree[k].r){tree[k].mmax=val;return;}int mid=tree[k].l+tree[k].r>>1;if(pos<=mid)change(k<<1,pos,val);elsechange(k<<1|1,pos,val);pushup(k);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",a+i);build(1,1,n);while(m--){int pos,val;scanf("%d%d",&pos,&val);change(1,pos,val);printf("%d\n",tree[1].cnt);change(1,pos,a[pos]);}}return 0;
}

HDU - 6406 Taotao Picks Apples(线段树区间合并)相关推荐

  1. hdu 6406 Taotao Picks Apples 线段树

    hdu 6406 多校八第十题,设d1[ i ]为从a1开始到 ai 的最长递增子序列长度,设d2[ i ]为从ai开始到an的最长递增子序列长度,假设要把ap改为q,可以把序列分为1到p-1和p+1 ...

  2. HDU 6406 Taotao Picks Apples(前缀和+二分)

    HDU 6406 Taotao Picks Apples(前缀和+二分) Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131 ...

  3. hdu - 6406 Taotao Picks Apples(离线+离散+技巧)

    题目链接:Taotao Picks Apples 题目大意:有n个数,m个操作,每个操作x,q,将x位的数字改为q,输出改完数后数组的递增序列有多长(只能从第一个数开始找,并且必须依次找更大的数). ...

  4. 多校 hdu 6406 Taotao Picks Apples(线段树)

    设d1[ i ]为从a1开始到 ai 的最长递增子序列长度,设d2[ i ]为从ai开始到an的最长递增子序列长度,假设要把ap改为q,可以把序列分为1到p-1和p+1到n两段,可以用线段树找到1到p ...

  5. HDU 3397 Sequence operation(线段树区间合并)

    题意: 0 a b将区间[a,b]所有数全部变成0 1 a b将区间[a,b]所有数全部变成1 2 a b将区间[a,b]中所有数0 1互换,0变1,1变0 3 a b输出区间[a,b]中1的个数 4 ...

  6. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  7. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

  8. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  9. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

最新文章

  1. 还搞不懂 Java NIO?快来读读这篇文章!
  2. 差异基因分析:fold change(差异倍数), P-value(差异的显著性)
  3. 联想win10摁F2一直无法进入BIOS
  4. Flutter开发之搭建Flutter开发环境(三)
  5. ios 即时聊天轻松搞定
  6. 使用pycharm调试Python代码时F8快捷键失效
  7. ITK:Mersenne Twister随机数生成器
  8. v-bind单向绑定与v-model双向绑定
  9. 利用task和电平敏感的always快设计经比较后重组信号的组合逻辑
  10. 【C++深度剖析教程16】智能指针的分析
  11. 复数卷积 tensorflow_PyTorch 中的傅里叶卷积
  12. 静态成员 java_JAVA中的静态成员
  13. antd pro中如何使用mock数据以及调用接口
  14. centos---centos配置svn
  15. 手持设备点击响应速度,鼠标事件与touch事件的那些事
  16. [转].net cookie版购物车
  17. ZENG msgbox仿qq提示
  18. java面试的计算机网络_Java面试总结之计算机网络(二)
  19. 【剑指offer】Python、java,C++三种语言同时实现
  20. CRT使用(二)CRT软件修改超时时间

热门文章

  1. tomcat提高图片服务器性能,Tomcat性能调优(windows)
  2. java的部署目录在哪里_Java:Tomcat的部署实例之资源目录
  3. 分布式ID-美团(Leaf)
  4. Maven依赖项的适用范围scope
  5. 如何保存消费端的消费位置
  6. NIO和BIO如何影响应用程序的设计
  7. IDEA 集成Lombok 插件-配置注解处理器
  8. Quartz框架中的JobStore
  9. ServletAPI介绍
  10. Spring的@Configuration配置类-Full和Lite模式