第一眼看到這題大家都覺得是一道線段樹的水題,然而它卻是一道暴力完美解決的超級大水題。估計難度在NOIP pj第一題左右… …
去看了看數據…沒什麼感覺……
再看看別人的代碼長度…
這一定不是線段樹!!!!
也有人考慮用單調隊列或單調棧來做,那樣的話代碼也很短,而且時間也可過(可憐的數據)…重點是如果把這題放在NOIP上,AC率一定非常高。簽到題一樣的…
不說了,直接看代碼吧…
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=200005;
int M,D,x,t=0;
int a[N],b[N];
char cym[3];
int main()
{
memset (b,-1,sizeof(b));
scanf ("%d%d",&M,&D);
int j=1;
for (int i=1;i<=M;i++)
{
scanf ("%s%d",cym,&x);
if (cym[0]=='A')
{
int y=(x+t)%D;
a[j++]=y;
for (int k=j;k>=1;k--)
{
if (y>b[k])
b[k]=y;
else
break; //就是這個跳出循環,凸顯了數據之弱...
}
}
else
{
t=b[j-x+1];
printf ("%d\n",t);
}
}
return 0;
}
如果你是JSOI2008的參賽選手,你敢這樣寫麼…果斷選擇線段樹啊… …
附:%%%%%%進隊CYM%%%%%%%%%%
http://blog.csdn.net/cym19981017
#include<iostream>
#include<cstdio>
using namespace std;
int M,D,last,cnt;
struct data
{
int l,r,mx;
}t[800005];
void build(int idx,int l,int r)
{
t[idx].l=l;
t[idx].r=r;
t[idx].mx=-1;
if(l==r)
return;
int mid=(l+r)>>1;
build(idx<<1,l,mid);
build(idx<<1|1,mid+1,r);
}
inline int Query(int idx,int l,int r)
{
if (t[idx].l==l&&t[idx].r==r)
return t[idx].mx;
int mid=(t[idx].l+t[idx].r)>>1;
if (r<=mid)
return Query(idx<<1,l,r);
else if (l>mid)
return Query(idx<<1|1,l,r);
else
return max(Query(idx<<1,l,mid),Query(idx<<1|1,mid+1,r));
}
inline void insert (int idx,int i,int x)
{
if(t[idx].l==t[idx].r)
{
t[idx].mx=x;
return;
}
int mid=(t[idx].l+t[idx].r)>>1;
if (i<=mid)
insert (idx<<1,i,x);
else
insert (idx<<1|1,i,x);
t[idx].mx=max(t[idx<<1].mx,t[idx<<1|1].mx);
}
int main()
{
scanf ("%d%d",&M,&D);
build(1,1,M);
int t=0;
int j=0,x;
for (int i=1;i<=M;i++)
{
char cym[5];
scanf ("%s",cym);
if(cym[0]=='A')
{
scanf ("%d",&x);
j++;
x=(x+t)%D;
insert(1,j,x);
}
else
{
scanf ("%d",&x);
t=Query(1,j-x+1,j);
printf("%d\n",t);
}
}
return 0;
}