UVA - 11235 Frequent values 线段树 区间合并
来源:互联网 发布:淘宝男装货到付款 编辑:程序博客网 时间:2024/06/06 00:41
查Bug到凌晨系列,下次一定要写仔细呀。
传送门:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846
#include <cstdio>#include <cstring>#include <stack>#include <queue>#include <iostream>#include <algorithm>#include <map>#include <vector>using namespace std;const int MAXN = 100005;struct Node { int x,y; int maxlen; int llen,rlen;}t[MAXN<<2];int a[MAXN];void Push_Up(int rt) { //Update maxlen; t[rt].maxlen = max(t[rt<<1].maxlen,t[rt<<1|1].maxlen); if(a[t[rt<<1].y] == a[t[rt<<1|1].x])t[rt].maxlen = max(t[rt].maxlen,t[rt<<1].rlen+t[rt<<1|1].llen); //Update llen; t[rt].llen = t[rt<<1].llen; if(t[rt<<1].llen == t[rt<<1].y - t[rt<<1].x + 1 && a[t[rt<<1].y] == a[t[rt<<1|1].x]) t[rt].llen += t[rt<<1|1].llen; //Update rlen; t[rt].rlen = t[rt<<1|1].rlen; if(t[rt<<1|1].rlen == t[rt<<1|1].y - t[rt<<1|1].x + 1 && a[t[rt<<1].y] == a[t[rt<<1|1].x]) t[rt].rlen += t[rt<<1].rlen;}void Build(int x,int y,int rt) { t[rt].x = x; t[rt].y = y; if(x == y) { t[rt].maxlen = 1; t[rt].llen = 1; t[rt].rlen = 1; return ; } int mid = (x + y) >> 1; Build(x,mid,rt<<1); Build(mid+1,y,rt<<1|1); Push_Up(rt);}int p;//Last right ;int ans ;int tempright;int tempans;void Query(int x,int y,int rt,int Left,int Right) { if(x >= Left && y <= Right) { //Update tempans; //printf("x : %d y : %d\n",x,y); tempans = t[rt].maxlen; //printf("x : %d y : %d maxlen : %d Tempans : %d\n",t[rt].x,t[rt].y,t[rt].maxlen,tempans); //printf("tempright : %d\n",tempright); if(a[x] == a[p]) { //puts("Hello"); //printf("p : %d a[p] : %d\n",p,a[p]); //printf("x : %d\n",x); tempans = max(tempans,tempright+t[rt].llen); //printf("Tempans : %d\n",tempans); } //printf("Tempans : %d\n",tempans); //Update ans; ans = max(ans,tempans); //Update tempright; if(t[rt].rlen < y - x + 1) tempright = t[rt].rlen; else { if(a[x] == a[p]) { tempright += t[rt].rlen; } else tempright = t[rt].rlen; //Important !!!!!!! } //printf("tempright : %d\n",tempright); //Update p; p = y; return ; } int mid = (x + y) >> 1; if(mid >= Left ) Query(x,mid,rt<<1,Left,Right); if(mid < Right) Query(mid+1,y,rt<<1|1,Left,Right);}void print(int x,int y,int rt){ printf("Left : %d Right : %d maxlen : %d llen : %d rlen : %d\n",x,y,t[rt].maxlen,t[rt].llen,t[rt].rlen); if(x == y) return ; int mid = ( x + y ) >> 1; print(x,mid,rt<<1); print(mid+1,y,rt<<1|1);}void Deal_with() { int n,q; while(scanf("%d",&n),n) { memset(t,0,sizeof(t)); scanf("%d",&q); for(int i = 1 ; i <= n ; i++) { scanf("%d",a+i); // printf("%d ",a[i]); } //puts(""); Build(1,n,1); //print(1,n,1); int tempa,tempb; for(int i = 1 ; i <= q ; i++) { ans = 0; tempans = 0;tempright = 0; scanf("%d %d",&tempa,&tempb); //printf("%d %d\n",tempa,tempb); p = tempa; Query(1,n,1,tempa,tempb); printf("%d\n",ans); } }}int main(void) { //freopen("a.in","r",stdin); //freopen("out.txt","w",stdout); Deal_with();}
0 0
- UVA - 11235 Frequent values 线段树 区间合并
- uva11235 Frequent values(线段树区间合并)
- [UVA 11235]Frequent values[线段树区间查询]
- POJ 3368 Frequent values(线段树区间合并)
- POJ 3368 Frequent values(线段树区间合并)
- POJ 3368 Frequent values(RMQ/线段树区间合并)
- hdu-1806:Frequent values(线段树区间合并)
- UVa 11235 / POJ 3368 Frequent values (想法题&RMQ线段树维护最长区间长度)
- 区间众数:UVa 11235 - Frequent values
- UVa 11235 Frequent values / RMQ or 线段树
- UVa 11235 - Frequent values(线段树版)
- UVa 11235 - Frequent values
- uva--11235--Frequent values
- UVA 11235 Frequent values
- UVa 11235 Frequent Values
- UVa-11235 - Frequent values
- UVA 11235 - Frequent values
- UVa:11235 Frequent values
- JAVA基础-反射
- IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的
- Java本地文件操作
- Android udp编程笔记 1
- hdu 3181
- UVA - 11235 Frequent values 线段树 区间合并
- 博客开通
- 7、定义一个文件输入流,调用read(byte[] b) 方法将exercise.txt文件中的所有内容打印出来(byte数组的大小限制为5,不考虑中文编码问题)。
- 【关于字符串要补的题】
- 【后缀数组学习中】
- iOS获取视频所有图片
- 8.编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数
- 2015年7月13日--2015年7月19日,21小时,剩3630小时
- 10、取出一个字符串中字母出现的次数。如:字符串:"abcde%^kka27qoq" ,输出格式为: a(2)b(1)k(2)...