关于动态开点
查看原帖
关于动态开点
647306
ColinKIA楼主2022/12/17 10:13

没有动态开点,50pts

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 200005;
int n = 0, m, p;
int last = 0;
struct Segment_tree {
    int l, r;
    int v;
} tree[4 * MAXN];
void pushup(int u) { tree[u].v = max(tree[u * 2].v, tree[u * 2 + 1].v); }
void build(int u, int l, int r) {
    tree[u] = (Segment_tree){ l, r };
    if (l == r)
        return;
    int mid = l + r >> 1;
    build(u * 2, l, mid), build(u * 2 + 1, mid + 1, r);
}
void update(int u, int x, int v) {
    if (tree[u].l == x && tree[u].r == x)
        tree[u].v = v;
    else {
        int mid = tree[u].l + tree[u].r >> 1;
        if (x <= mid)
            update(u * 2, x, v);
        else
            update(u * 2 + 1, x, v);
        pushup(u);
    }
}
int query(int u, int l, int r) {
    if (tree[u].l >= l && tree[u].r <= r)
        return tree[u].v;
    int mid = tree[u].l + tree[u].r >> 1;
    int ans = 0;
    if (l <= mid)
        ans = max(ans, query(u * 2, l, r));
    if (r > mid)
        ans = max(ans, query(u * 2 + 1, l, r));
    return ans;
}
signed main() {
    scanf("%lld %lld", &m, &p);
    build(1, 1, m);
    while (m--) {
        char ch;
        int x;
        scanf("%c %lld\n", &ch, &x);
        if (ch == 'A')
            update(1, ++n, (last + x) % p);
        else {
            last = query(1, n - x + 1, n);
            if (last)
                printf("%lld\n", last);
        }
    }
    return 0;
}

有动态开点 100pts

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 200005,MAXQ=2e9;
int n = 0,m,p,tot=1;
int last = 0;
struct Segment_tree{
    int l,r,lc,rc;
    int Max;
}tree[(int)(MAXN*31)];
void pushup (int u) {
    tree[u].Max=max(tree[tree[u].lc].Max,tree[tree[u].rc].Max);
}
void update (int u,int x,int Max) {
    if (tree[u].l == x && tree[u].r == x){
    	tree[u].Max = Max;
    	return ;
    }
    int mid = tree[u].l+tree[u].r >> 1;
    if (x <= mid){
       	if(!tree[u].lc){
       		tree[u].lc=++tot;
       		tree[tot].l=tree[u].l;
       		tree[tot].r=mid;
       	}
       	update(tree[u].lc,x,Max);
    }else{
       	if(!tree[u].rc){
       		tree[u].rc=++tot;
       		tree[tot].l=mid+1;
       		tree[tot].r=tree[u].r;
       	}
       	update(tree[u].rc,x,Max);
    }
    pushup(u);
}
int query (int u,int l,int r) {
	if(!u||(tree[u].l==0&&tree[u].r==0&&u!=1)) return 0;
    if ((tree[u].l >= l && tree[u].r <= r)) return tree[u].Max;
    int mid = tree[u].l+tree[u].r >> 1;
    int ans = 0;
    if (l <= mid) ans = max (ans,query(tree[u].lc,l,r));
    if (r > mid) ans = max (ans,query(tree[u].rc,l,r));
    return ans;
}
signed main () {
    scanf("%lld %lld",&m,&p);
    tree[tot].l=1,tree[tot].r=m;
    while (m--) {
        char ch;
        int x;
       	cin>>ch>>x;
        if (ch=='A'){
        	update (1,++n,(last+x)%p);	
        }else{
        	last=query (1,n-x+1,n);
            printf("%lld\n",last);
        }
    }
    return 0;
}

为什么题解里几乎没人动态开点但是AC了?

2022/12/17 10:13
加载中...