题目链接: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. 导航菜单:jQuery粘性滚动导航栏效果
  2. 数据库SQL语句学习笔记(4)-过滤数据
  3. SAP Cloud SDK for JavaScript 的搭建和使用方法介绍
  4. mysql 用户授权_mysql添加、删除用户和授权用户
  5. linux内核 sin头文件,Linux内核中中断request_irq详解--中断共享问题解决
  6. 20张图,带你搞懂高并发中的线程与线程池!
  7. android 兼容性定义,谷歌释出 Android 7.0 兼容性定义文件,史上最严
  8. Samba 共享目录启动mysql
  9. 【Codeforces 977F】Consecutive Subsequence
  10. spring-第三篇之ApplicationContext的事件机制
  11. 【OpenCV 例程200篇】201. 图像的颜色空间转换
  12. EXCEL插件《二维码标签工具》
  13. 网赚项目之站群第一课如何利用站群快速赚钱
  14. 我的2018OKR年终回顾与2019OKR初步规划
  15. Mac下安装git极简教程
  16. (35)zabbix Event acknowledgment事件确认
  17. (demo)springboot接口suger_整合_hbase+phoenix
  18. Deep Spatio-Temporal Representation for Detection of Road Accidents Using Stacked Autoencoder
  19. Nature子刊:AI技术从零开始设计具有生物活性的蛋白质
  20. 【遥感卫星】Landsat 卫星

热门文章

  1. UVA 1471 Defense Lines (STL + 二分)
  2. Samsara v2.0 打造ERP数据流脚本编程 —— 脚本规范
  3. UVa Problem 10254 The Priest Mathematician (牧师数学家)
  4. egg-sequelize使用教程
  5. 将B站上下载的两个m4s文件合成为mp4文件
  6. C++ 基础概念(二)
  7. rails strip
  8. 创建一个rails入门项目并运行
  9. 苹果手机电越充越少怎么回事_羞羞电量插件app免费下载-羞羞手机电量插件v1.0 安卓版...
  10. 多读书,更要多多悦读