比赛 |
4043级2023省选模拟赛1 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
贪玩蓝月 |
最终得分 |
100 |
用户昵称 |
op_组撒头屯 |
运行时间 |
6.709 s |
代码语言 |
C++ |
内存使用 |
13.37 MiB |
提交时间 |
2023-03-20 21:02:25 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=50000+5;
const int M=500+5;
int inf;
typedef long long ll;
int n,m;
int w[N],v[N];
struct sdf{
int l,r;ll ans;
}q[N];
deque<int>dq;
int l[N],r[N],tot=0,tim=1;
struct segtree{
int l,r;vector<int>s;
}tr[N<<2];
void build(int pt,int l,int r){
tr[pt]={l,r};
if (l==r)return ;
int mid=(l+r)/2;
build(pt*2,l,mid);build(pt*2+1,mid+1,r);
}
void add(int pt,int x,int y,int id){
int l=tr[pt].l,r=tr[pt].r;
if (x<=l&&r<=y){
tr[pt].s.push_back(id);return ;
}int mid=(l+r)/2;
if (x<=mid)add(pt*2,x,y,id);
if (mid+1<=y)add(pt*2+1,x,y,id);
}
void solve(int pt,ll *f){
int l=tr[pt].l,r=tr[pt].r;
ll g[2][M],now=0;
memcpy(g[1],f,sizeof(g[1]));
memset(g[0],-0x3f,sizeof(f));g[0][0]=0;
for (int i=0;i<(int)tr[pt].s.size();i++){
int p=tr[pt].s[i];
for (int j=0;j<m;j++){
g[now][(j+w[p])%m]=max(g[now^1][(j+w[p])%m],g[now^1][j]+v[p]);
}
now^=1;
}
if (l==r){
q[l].ans=-1;
for (int i=q[l].l;i<=q[l].r;i++){
q[l].ans=max(q[l].ans,g[now^1][i]);
}return ;
}
solve(pt*2,g[now^1]);solve(pt*2+1,g[now^1]);
}
int main(){
freopen ("tanwan.in","r",stdin);
freopen ("tanwan.out","w",stdout);
int T;scanf("%d",&T);scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
char opt[10];scanf("%s",opt);
if (opt[0]=='I'){tot++;
if (opt[1]=='F')dq.push_front(tot);
else dq.push_back(tot);
scanf("%d%d",&w[tot],&v[tot]);l[tot]=tim;
}
if (opt[0]=='D'){
if (opt[1]=='F'){
r[dq.front()]=tim;dq.pop_front();
}
else{
r[dq.back()]=tim;dq.pop_back();
}
}
if (opt[0]=='Q'){
scanf("%d%d",&q[tim].l,&q[tim].r);tim++;
}
}tim--;
build(1,1,tim);
for (int i=1;i<=tot;i++){
if (l[i]>tim)continue;
if (!r[i])r[i]=tim+1;
add(1,l[i],r[i]-1,i);
}
ll f[M];memset(f,-0x3f,sizeof(f));
inf=f[0];f[0]=0;
solve(1,f);
for (int i=1;i<=tim;i++){
printf("%lld\n",q[i].ans);
}
}