没有动态开点,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了?