poj-3368 Frequent values 线段树

来源:互联网 发布:淘宝买二手吉他靠谱吗 编辑:程序博客网 时间:2024/06/05 15:59

题目链接


#include "stdio.h"#include "math.h"#include "string.h"#include "algorithm"using namespace std;const int maxn = 100005;int n,m,x,y,ans;int num[maxn];struct node{int mmax,lmax,rmax;int ln,rn;}tree[maxn<<2];void PushUp( int rt ){tree[rt].ln = tree[rt<<1].ln;tree[rt].rn = tree[rt<<1|1].rn;tree[rt].mmax = max( tree[rt<<1].mmax,tree[rt<<1|1].mmax );tree[rt].lmax = tree[rt<<1].lmax;tree[rt].rmax = tree[rt<<1|1].rmax;if( tree[rt<<1].rn == tree[rt<<1|1].ln ){tree[rt].mmax = max( tree[rt].mmax,tree[rt<<1].rmax + tree[rt<<1|1].lmax );if( tree[rt<<1].ln == tree[rt<<1|1].ln )tree[rt].lmax = tree[rt<<1].lmax + tree[rt<<1|1].lmax;if( tree[rt<<1].rn == tree[rt<<1|1].rn )tree[rt].rmax = tree[rt<<1].rmax + tree[rt<<1|1].rmax;}}void BuildTree( int rt,int ld,int rd ){if( ld == rd ){tree[rt].mmax = tree[rt].lmax = tree[rt].rmax = 1;tree[rt].ln = tree[rt].rn =num[ld];return;}int mid = (ld+rd)>>1;BuildTree( rt<<1,ld,mid );BuildTree( rt<<1|1,mid+1,rd );PushUp( rt );}int query( int rt,int ld,int rd ){if( x <= ld && rd <= y ){return tree[rt].mmax;}if( x > rd || y < ld )return 0;int mid = ( ld+rd )>>1;int Max = max( query( rt<<1,ld,mid ),query( rt<<1|1,mid+1,rd ));if( tree[rt<<1].rn == tree[rt<<1|1].ln && x <= mid && y > mid ){Max = max( Max,min( tree[rt<<1].rmax,mid-x+1 ) + min( tree[rt<<1|1].lmax,y-mid) );}return Max;}int main(){//freopen("data.txt","r",stdin);while( scanf("%d",&n) != EOF,n ){scanf("%d",&m);for( int i = 1; i <= n; i ++ ){scanf("%d",&num[i]);}BuildTree( 1,1,n );for( int i = 1; i <= m; i ++ ){scanf("%d%d",&x,&y);ans = 0;printf("%d\n",query( 1,1,n ));}}return 0;}


0 0
原创粉丝点击