luogu P1198 [JSOI2008]最大数

Posted seven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P1198 [JSOI2008]最大数相关的知识,希望对你有一定的参考价值。

准备写线段树写法

所以先搁置一下23333

啊我debug半个点失败

可能我今天不适合写题解【微笑

拖图片拖了五分钟,总是一点就变成预览模式

气得我想砸电脑

mmp

线段树写法也没写出来

心情好差www

啊好的发泄完毕好轻松

emmmm

那么我们来看一下这道题吧

线段树的单点修改啊,还不用建树!

(可是我没写出来23333【气死

然后谢谢题解

因为每次都在尾端插入

所以可以用st表来写

还是很好理解的思路

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
#define maxn 200010

int dp[maxn][21],cnt,b[maxn];

void add(int x){
  dp[++ cnt][0] = x;
  for(int i = 1;cnt - (1 << i) >= 0;i++)
    dp[cnt][i] = max(dp[cnt][i - 1],dp[cnt - (1 << (i - 1))][i - 1]);
}

int query(int x){
  int k = log2(cnt - x + 1);
  return max(dp[cnt][k],dp[x - 1 + (1 << k)][k]);
}

int main(){
  int m,mod,last = 0;
  scanf("%d%d",&m,&mod);
  for(int i = 1;i <= m;i++){
    char ch;
    cin >> ch;
    if(ch == \'A\'){
      int x;
      scanf("%d",&x);
      int qwq = (x + last) % mod; 
      add(qwq);
    }
    else{
      int y;
      scanf("%d",&y);
      int ans = query(cnt - y + 1);
      last = ans;
      printf("%d\\n",ans);
    }
  }
  return 0;
}

每次写st表的时候都会忍不住想起zyr学长通俗易懂的st表讲解

tql!!!

(突然想起来还有作业【扔下水的一批的题解然后溜

 

在学长帮忙debug之后(orz谢谢

改了一下线段树写法

然后还没切掉

第二天再看的时候

???我智障吗???

为什么我改的时候还把‘A\'的情况删掉了???

好吧

然后又写回来

过了【瘫

那看一下线段树的代码吧

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 200010

int m,last,cnt,q;
int node[maxn * 4];//emmm线段树需要开这么大www

void modify(int orz,int qwq,int now,int L,int R) {
    if(L == R) {
        node[now] = qwq;//赋值
        return ;
    }
    int mid = (L + R) >> 1;
    if(mid >= orz)//orz是当前加入的点的编号
        modify(orz,qwq,now * 2,L,mid);
    if(mid < orz)
        modify(orz,qwq,now * 2 + 1,mid + 1,R);
    node[now] = max(node[now * 2],node[now * 2 + 1]) % q;//取最大
}

int query(int l,int r,int now,int L,int R) {//询问操作,很好理解吧
    if(l <= L && r >= R)
        return node[now];
    if(l > R || r < L)
        return 0;
    int mid = (L + R) >> 1;
    return max(query(l,r,now * 2,L,mid),query(l,r,now * 2 + 1,mid + 1,R));
}

int main() {
    scanf("%d %d",&m,&q);
    for(int i = 1; i <= m; i++) {
        char a;
        int b;
        cin >> a >> b;
        if(a == \'A\'){
            modify(++cnt,(b + last) % q,1,1,m);
        }
        if(a == \'Q\') {
            last = query(cnt - b + 1,cnt,1,1,m) % q;
            printf("%d\\n",last);
        }
    }
    return 0;
}

痛哭流涕

太不容易了嗷嗷嗷

 然后放一下测评结果

上面的是线段树,下面是st表

 

以上是关于luogu P1198 [JSOI2008]最大数的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1198 [JSOI2008]最大数

BZOJ——1012: [JSOI2008]最大数maxnumber || 洛谷—— P1198 [JSOI2008]最大数

洛谷 P1198 [JSOI2008]最大数 题解

洛谷P1198 [JSOI2008]最大数

洛谷 P1198 [JSOI2008]最大数

洛谷P1198 [JSOI2008]最大数