BZOJ_1012_[JSOI2008]最大數maxnumber_暴力?(線段樹)

第一眼看到這題大家都覺得是一道線段樹的水題,然而它卻是一道暴力完美解決的超級大水題。估計難度在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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章