poj 3368 线段树(转换)
来源:互联网 发布:swatch黑白时分淘宝 编辑:程序博客网 时间:2024/06/06 07:17
#include<stdio.h>#define MAX 100000+16#define max(x,y) ((x>y)?(x):(y))#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int t[MAX<<2],right[MAX],left[MAX],sym[MAX],ii;void build(int l,int r,int rt){int m;if(l==r){t[rt]=right[l]-left[l]+1;return ;}m=(l+r)>>1;build(lson);build(rson);t[rt]=max(t[rt<<1],t[rt<<1|1]);}int query(int a,int b,int l,int r,int rt){int m,res1,res2;if(a<=l&&r<=b)return t[rt];if(a>r||b<l)return 0;m=(l+r)>>1;res1=query(a,b,lson);res2=query(a,b,rson);return max(res1,res2);}int n,q;int main(){int val,cnt,i,x,a,b,la,rb;while(~scanf("%d",&n)&&n){scanf("%d",&q);val=-MAX;cnt=0;for(i=1;i<=n;i++){scanf("%d",&x);if(x!=val){val=x;cnt++;left[cnt]=right[cnt]=i;}elseright[cnt]++;sym[i]=cnt;}build(1,cnt,1);while(q--){ scanf("%d%d",&a,&b); la=sym[a];rb=sym[b]; if(la==rb) printf("%d\n",b-a+1); else if(la+1==rb) printf("%d\n",max(right[la]-a+1,b-left[rb]+1)); else printf("%d\n",max(max(right[la]-a+1,b-left[rb]+1),query(la+1,rb-1,1,cnt,1))); }}}
0 0
- poj 3368 线段树(转换)
- POJ 3368 线段树
- poj 3368 又一线段树
- poj 3368 (线段树pascal)
- POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)
- poj 3368 Frequent values //线段树
- poj 3368 --Frequent values 线段树
- poj 3368 离散化+线段树
- POJ 3368 Frequent values RMQ / 线段树
- poj 3368 Frequent values(线段树)
- POJ 3368 Frequent values 线段树
- poj 3368 Frequent values#线段树
- POJ 3368 Frequent values 线段树
- POJ 3368 Frequent values(线段树)
- poj-3368 Frequent values 线段树
- poj 3368 Frequent values(线段树)
- poj 3368 离散化+线段树+二分
- POJ 3368 Frequent values(线段树)
- [李景山php]每天laravel[007]-laravel 中级任务翻译---目录
- 拼命三郎模式
- c语言指针问题小结
- 在Dede中使用SQL
- php串口通信
- poj 3368 线段树(转换)
- 【笔记】发送邮件工具类的使用
- BZOJ3809 Gty的二逼妹子序列
- Linux 下 find 查找命令详解 && 黏滞位
- LeetCode002 Add Two Numbers
- NB-IoT通信模组/模块
- 工具之滚动截图
- leetcode解题之485. Max Consecutive Ones Java版 (二进制连续最长1的个数)
- 剑指Offer5:从尾到头打印链表