1012: [JSOI2008]最大数maxnumber

题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1012

简单的线段树。
先离线确定最后数列的长度,再一个个按顺序操作。
注意OJ上用cin cout会re,要用scanf和printf。
#include <iostream>
#include 
<cstdlib>
#include 
<cstring>
#include 
<cmath>
#include 
<cstdio>
using namespace std;
const int MaxM=200500;

int m,d,n=0,now=0,a[MaxM][2];
int t[4*MaxM];

void add(int i,int l,int r,int x,int v)
{
    if (l==r)
    
{
        t[i]
=v;
        
return;
    }

    
int m=(l+r)>>1;
    
if (x<=m)
    
{
        add(
2*i,l,m,x,v);
    }

    
else
    
{
        add(
2*i+1,m+1,r,x,v);
    }

    t[i]
=max(t[2*i],t[2*i+1]);
}


int getmax(int i,int l,int r,int vl,int vr)
{
    if (l==vl && r==vr)
    
{
        
return t[i];
    }

    
int m=(l+r)>>1;
    
if (vr<=m)
    
{
        
return getmax(2*i,l,m,vl,vr);
    }

    
if (vl>=m+1)
    
{
        
return getmax(2*i+1,m+1,r,vl,vr);
    }

    
return max(getmax(2*i,l,m,vl,m),getmax(2*i+1,m+1,r,m+1,vr));
}


void init()
{
    scanf(
"%d%d ",&m,&d);
    memset(t,
0,sizeof(t));
    
for (int i=0;i<m;i++)
    
{
        
char x;
        scanf(
" %c ",&x);
        
if (x=='A')
        
{
            a[i][
0]=1;
            n
++;
        }

        
else
        
{
            a[i][
0]=0;
        }

        scanf(
"%d",&a[i][1]);
    }

}


int main()
{
    init();
    
int tt=0;
    
for (int i=0;i<m;i++)
    
{
        
if (a[i][0]==0)
        
{
            tt
=getmax(1,1,n,now-a[i][1]+1,now);
            printf(
"%d\n",tt);
        }

        
else
        
{
            now
++;
            add(
1,1,n,now,(a[i][1]+tt)%d);
        }

    }

    
return 0;
}






posted on 2013-01-17 08:57 Kiro 阅读(99) 评论(0)  编辑 收藏 引用 所属分类: 衡八oj