题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5172

题意:给出n个数,m个询问,问你[l,r]区间内是否为1到r-l+1的全排列。 大小很容易我们通过记录前缀和很容易求出来,但是关键是去重。 考虑线段树做法,我们记录每个点的靠左最近的相同元素的位置,然后求 整个区间的最大值(即最大的前驱)如果小于l,即满足条件,输出YES。

好吧,其实这个题目我是搜的RMQ算法出来的,因为我想练一下RMQ算法,所以我就看了一下别人的博客,自己也写了一下,结果死活MLE。。。

好吧,我仔细看了一下,1000000的数据量用RMQ开一个二维数组1000000*20,显然会超内存。。。

结果我不得不老老实实的滚回去用线段树写了。。。orz....

RMQ的MLE代码:

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<cmath>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
#define inf 1<<30
#define sf(a) scanf("%d",&a);
#define CLEAR(a,b) memset(a,b,sizeof(a))
using namespace std;
/*TLE...显然超内存;
*/
const int N=1000005;
int n,m,a,b;
int num[N],pre[N];
int dp[N][21];
int sum[N];
void ST(int len)
{for(int i=1;i<=n;i++) dp[i][0]=num[i];for(int j=1;1<<j < n;j++){for(int i=1;i+(1<<j)-1<n;i++){dp[i][j]=max(dp[i][j-1],dp[i+1<<(j-1)][j-1]);}}
}
int rmq(int s,int v)
{int k=(int)(log(v-s+1)*1.0/log(2.0));return max(dp[s][k],dp[v-1<<k+1][k]);
}
int main()
{while(~scanf("%d%d",&n,&m)){CLEAR(pre,0);CLEAR(sum,0);for(int i=1;i<=n;i++){sf(a);sum[i]+=sum[i-1]+a;num[i]=pre[a];pre[a]=i;}ST(n);while(m--){sf(a);sf(b);double tmp=(b-a+2)*(b-a+1)*1.0/2.0;if(tmp!=sum[b]-sum[a-1]){//cout<<tmp<<' '<<sum[b]-sum[a-1]<<' ';printf("NO\n");continue;}else{if(rmq(a,b)<a) printf("YES\n");else printf("NO\n");}}}return 0;
}

线段树AC代码:

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<cmath>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
#define inf 1<<30
#define s(a) scanf("%d",&a)
#define CLEAR(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1000005;
int n,m,a,b;
int pre[N],sum[N];  //  sum存总和,pre定位该数字上一次出现的位置;
struct node
{int l,r;int pre;    //  用线段树维护最近一个重复的数字;
}node[N<<2];
void PushUp(int rt)
{node[rt].pre=max(node[rt<<1].pre,node[rt<<1|1].pre);
}
void build(int l,int r,int rt)
{node[rt].l=l;node[rt].r=r;node[rt].pre=0;if(l!=r){int mid=(l+r)>>1;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);}
}
void Insert(int v,int p,int rt)
{int ll=node[rt].l,rr=node[rt].r;if(ll==rr&&p==ll){node[rt].pre=pre[v];return;}int mid=(ll+rr)>>1;if(p<=mid) Insert(v,p,rt<<1);else Insert(v,p,rt<<1|1);PushUp(rt);
}
int query(int l,int r,int rt)
{int ll=node[rt].l,rr=node[rt].r;if(ll==l&&rr==r){return node[rt].pre;}int mid=(ll+rr)>>1;if(r<=mid) return query(l,r,rt<<1);else if(l>mid) return query(l,r,rt<<1|1);else return max(query(l,mid,rt<<1),query(mid+1,r,rt<<1|1));
}
int main()
{while(~s(n)){s(m);CLEAR(pre,0);CLEAR(sum,0);build(1,n,1);for(int i=1;i<=n;i++){s(a);sum[i]+=sum[i-1]+a;Insert(a,i,1);pre[a]=i;}while(m--){s(a);s(b);int tmp=(b-a+2)*(b-a+1)*1.0/2.0;    //  如果是全排列那么最后的和必然符合这个公式;if(sum[b]-sum[a-1]!=tmp){printf("NO\n");continue;}else{if(query(a,b,1)<a) printf("YES\n"); //  查询该区间最近一个重复的数字出现的位置,如果比a小,那就说明这个区间没有出现过重复的数字;else printf("NO\n");}}}return 0;
}

HDU-5172-GTY's gay friends-线段树单点更新相关推荐

  1. HDU 5172 GTY's gay friends 线段树

    GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. HDU 5172 GTY's gay friends 线段树+前缀和+全排列

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5172 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

  3. HDU - 1166敌兵布阵+HDU-1754 I Hate It (线段树单点更新——累加/最大值)

    线段树单点更新,模板题 HDU1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...

  4. HDUOJ----1166敌兵布阵(线段树单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  6. 【原创】tyvj1038 忠诚 计蒜客 管家的忠诚 线段树(单点更新,区间查询)...

    [原创]tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询) 最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不 ...

  7. BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]

    传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  8. HDU 5172 GTY's gay friends (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5172 题意: 给你一个n个数的数组,m次询问,询问在[L, R] 这个区间里面有没有 [1, R-L+ ...

  9. hdu 5172 GTY's gay friends(线段树最值)

    题意: GTY有n个朋友,站成一排,每个人有一个特征值ai. 有m个询问.每次询问给两个数L,R.问你[L,R](即aL...aR)是否是1..(R-L+1)的一个全排列. 是输出YES,否则输出NO ...

  10. HDU 5172 GTY's gay friends HASH随机算法

    传送门:点击打开链接 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

最新文章

  1. kafka:一文读懂消费者背后的那点猫腻
  2. 深度解读 MongoDB 4.4 新特性
  3. node.js学习笔记14—微型社交网站
  4. Pots POJ - 3414(bfs)
  5. “一边熬夜一边求不要猝死”,90后养生朋克指南,条条扎心!
  6. 【实习之T100开发(1),韩顺平Java视频教程百度云盘
  7. C++:wchar_t 和C++新增类型:char16_t char32_t
  8. 支持服务器和客户端杀毒软件,服务器上小心使用杀毒软件和软件防火墙
  9. github的crx快速下载
  10. MakeMKV for mac(MKV视频格式转换工具)
  11. 58同城运维开发-BASE北京
  12. C语言学习2:Hello World!详解
  13. 浏览器打不开某些网站是什么原因导致,试试用这些方法来解决
  14. 校园、同城二手交易信息小程序 毕业设计毕业论文 开题报告和效果图参考(基于微信小程序毕业设计题目选题课题)
  15. PXE 网络安装 windows 或 linux
  16. 如何使用OpenCV进行图像的边缘检测和边缘增强?
  17. geogebra mac版【多平台的动态数学教育软件】
  18. delphi 对金额double类型向上取整,保留小数位
  19. 最新免费空间排行榜 from bbs.crsky.com
  20. qq邮箱服务器连接不上,无法登录

热门文章

  1. 那些人尽可夫的男人啊——黄金圣斗士对同人女的真情告白2
  2. 自定义 View 之实现九宫格锁屏效果
  3. [开箱评测] Thinkpad T440p 开箱及使用心得
  4. 三岁小屁孩眼中的中国房价
  5. 2021四川高考成绩等位分查询,四川省2021高考理科最新成绩一分一段查询
  6. 每日一问 --什么是信源、信宿?
  7. Android设备通过USB共享网络给OpenWrt路由器
  8. 常见的数据校验方式(奇偶,累加,CRC校验)
  9. 【Crypto】BUGKU-抄错的字符
  10. spring 事务提交成功后,再去发送事件