社区讨论

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 条回复,欢迎继续交流。

正在加载回复...