社区讨论
22分求救
P1335[NOI2013] 小 Q 的修炼参与者 9已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mi0vhn4w
- 此快照首次捕获于
- 2025/11/16 06:43 3 个月前
- 此快照最后确认于
- 2025/11/16 14:19 3 个月前
CPP
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int n,m,a[105],ans=-0x7fffffff;
int fin[1000500],st[1000500];
struct num{
int x1,x2;
num(){x1=x2=0;}
num(int x,char o){
if(o=='v')x1=x,x2=0;
else x1=0,x2=x;
}
};
struct data{
char o,f;
num x,y;
int s1,s2,id;
}d[100500];
char getc(){
char ch=getchar();
while(ch!='v'&&ch!='c'&&ch!='i'&&ch!='s'&&ch!='+'&&ch!='-')
ch=getchar();
return ch;
}
int read(){
int a=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){a=a*10+ch-'0';ch=getchar();}
return a*f;
}
int f[2050][10050],g[2050][10050],pp[2050];
int c[2050],w[2050],tot,pf[2050][10050],pg[2050][10050];
vector<int> pr[2050];
void dfs(int x,int y,int o){
if(!x)return ;
if(o==1||y>=c[x])fin[x]=o;
else fin[x]=0;
if(o==1){
if(pf[x][y])dfs(pf[x][y],y+c[x],2);
else dfs(x-1,y+c[x],1);
}
else{
if(pg[x][y])dfs(pg[x][y],y,2);
else dfs(x-1,y,1);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
d[i].o=getc();
if(d[i].o=='v'){
d[i].x=num(read(),'v');
d[i].f=getc();
d[i].y=num(read(),getc());
if(i==1){d[i].id=0;continue;}
if(d[i].x.x1==2)c[++tot]=d[i].y.x2;
else w[tot]=d[i].y.x2;
d[i].id=tot;
}
else if(d[i].o=='s'){
pp[tot+1]=i;
d[i].id=tot+1;
d[i].s1=read();
d[i].s2=read();
}
else if(d[i].o=='i'){
d[i].id=tot+1;
d[i].x=num(read(),getc());
d[i].y=num(read(),getc());
d[i].s1=read();
d[i].s2=read();
}
}
d[12002].id=tot+1;
for(int i=1;i<=tot;i++)
pr[d[d[pp[i]].s2].id].push_back(i);
memset(f,-0x3f,sizeof f);
f[0][10000]=0;
int p1,p2;
for(int i=1;i<=tot;i++){
for(int j=c[i];j<=10000;j++){
f[i][j-c[i]]=f[i-1][j]+w[i];
pf[i][j-c[i]]=0;
for(int k=0;k<pr[i].size();k++)if(g[pr[i][k]][j]+w[i]>f[i][j-c[i]]){
f[i][j-c[i]]=g[pr[i][k]][j]+w[i];
pf[i][j-c[i]]=pr[i][k];
}
if(f[i][j-c[i]]>ans){
ans=f[i][j-c[i]];
p1=i;p2=j-c[i];
}
}
for(int j=0;j<=10000;j++){
g[i][j]=f[i-1][j];
pg[i][j]=0;
for(int k=0;k<pr[i].size();k++)if(g[pr[i][k]][j]>g[i][j]){
g[i][j]=g[pr[i][k]][j];
pg[i][j]=pr[i][k];
}
}
}
dfs(p1,p2,1);
for(int i=1;i<=tot;i++)if(fin[i])printf("%d\n",fin[i]);
return 0;
}
谁知道这个代码为什么22分,请给予我AC代码并回复
回复
共 13 条回复,欢迎继续交流。
正在加载回复...