UPD:好像有两道题的代码逃跑了?= =就先不找了,反正都是水题。


 

精简题解系列第四弹。(其实也不是那么精简啊= =)

[JSOI2008]最大数maxnumber

  单点修改,区间最大值查询,裸线段树

 1 /**************************************************************
 2     Problem: 1012
 3     User: wsc500
 4     Language: C++
 5     Result: Accepted
 6     Time:944 ms
 7     Memory:5368 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cstdlib>
12 #include <iostream>
13 #include <cstring>
14 #include <algorithm>
15  
16 using namespace std;
17 #define MAXN (262144+2)
18 #define Q (262143)
19 #define bigger(a,b) ((a)>(b)?(a):(b))
20  
21 /*Gloable*/
22 int m,d;
23 int T[MAXN*4];
24 /*Function*/
25 void insert(int p,int val){
26     T[p+Q]=val;
27     int i=p+Q;
28     while (i!=0){
29         T[i/2]=bigger(T[i/2*2],T[i/2*2+1]);
30         i/=2;
31     }
32 }
33 int query(int L,int R,int a,int b,int p){
34     //printf("%d %d %d %d %d\n",L,R,a,b,p);
35     if (R>b)  R=b;
36     if (L<a)  L=a;
37     if (L==a&&R==b) return T[p];
38      
39     int mid=(a+b)/2;
40     int ans1,ans2;
41     ans1=ans2=0;
42      
43     if (L<=mid) ans1=query(L,R,a,mid,p*2);
44     if (R>mid) ans2=query(L,R,mid+1,b,p*2+1);
45      
46     return bigger(ans1,ans2);
47 }
48 int main()
49 {
50     memset(T,0,sizeof(T));
51     int x,t=0,n=1;
52     char cmd[10];
53     scanf("%d%d",&m,&d);
54     for (int i=1;i<=m;i++){
55         //printf("hehe\n");
56         scanf("%s%d",cmd,&x);
57         if (cmd[0]=='A'){
58             insert(n,(x+t)%d);
59             n++;
60         }
61         if (cmd[0]=='Q'){
62             //printf("hehe");
63             t=query(n-x,n-1,1,Q+1,1);
64             printf("%d\n",t);
65         }
66     }
67      
68     return 0;
69 }
View Code

相关文章:

  • 2022-01-03
  • 2022-12-23
  • 2021-12-03
  • 2022-02-01
  • 2021-11-16
  • 2021-12-31
  • 2021-08-14
猜你喜欢
  • 2021-08-23
  • 2022-12-23
  • 2022-01-15
  • 2022-12-23
  • 2021-05-20
  • 2022-12-23
  • 2021-07-03
相关资源
相似解决方案