zoukankan      html  css  js  c++  java
  • bzoj1012: [JSOI2008]最大数maxnumber(貌似是道线段树喔)

    1012: [JSOI2008]最大数maxnumber

    题目:传送门

    题解:

       发现自己空了一道水题...

       1~210000建线段树,其实就是一道裸题...

       单点修改+区间查询...1A~

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define qread(x)x=read();
     7 using namespace std;
     8 inline int read()
     9 {
    10     int f=1,x=0;char ch;
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return f*x;
    14 }
    15 struct node
    16 {
    17     int l,r,lc,rc,c;
    18 }tr[410000];int len;
    19 void bt(int l,int r)
    20 {
    21     len++;int now=len;
    22     tr[now].l=l;tr[now].r=r;tr[now].c=0;
    23     tr[now].lc=tr[now].rc=-1;
    24     if(l<r)
    25     {
    26         int mid=(l+r)/2;
    27         tr[now].lc=len+1;bt(l,mid);
    28         tr[now].rc=len+1;bt(mid+1,r);
    29     }
    30 }
    31 void change(int now,int x,int k)
    32 {
    33     if(tr[now].l==tr[now].r){tr[now].c=k;return ;}
    34     int lc=tr[now].lc,rc=tr[now].rc;
    35     int mid=(tr[now].l+tr[now].r)/2;
    36     if(x<=mid)change(lc,x,k);
    37     else if(mid+1<=x) change(rc,x,k);
    38     tr[now].c=max(tr[lc].c,tr[rc].c);
    39 }
    40 int findmax(int now,int l,int r)
    41 {
    42     if(l==tr[now].l && tr[now].r==r)return tr[now].c;
    43     int lc=tr[now].lc,rc=tr[now].rc;
    44     int mid=(tr[now].l+tr[now].r)/2;
    45     if(r<=mid)return findmax(lc,l,r);
    46     else if(mid+1<=l)return findmax(rc,l,r);
    47     else return max(findmax(lc,l,mid),findmax(rc,mid+1,r));
    48 }
    49 int main()
    50 {
    51     int M,D,t=0,ans,num;
    52     qread(M);qread(D);
    53     char c[5];len=0;
    54     bt(1,210000);num=0;
    55     for(int i=1;i<=M;i++)
    56     {
    57         int x;
    58         scanf("%s",c);qread(x);
    59         if(c[0]=='A')
    60             change(1,++num,(x+t)%D);
    61         else
    62         {
    63             t=findmax(1,num-x+1,num);
    64             printf("%d
    ",t);
    65         }
    66     }
    67     return 0;
    68 }

     

  • 相关阅读:
    20150805-20150807 tradeDate-----python
    nutz_web应用中主页跳转到登录页面的方式
    nutz中实现登录验证
    C#之继承
    C#中Page执行顺序:OnPreInit()、OnInit()……
    利用堆栈实现走迷宫算法
    对数组结构体按照K值翻转
    实现多项式的加法和乘法运算
    两个有序链表的合并
    队列的比较和存储方式
  • 原文地址:https://www.cnblogs.com/CHerish_OI/p/8108965.html
Copyright © 2011-2022 走看看