今天刷题的时候偶然看到了一个特别难的题,我果断逛了逛csdn,发现答案寥寥无几并且没有一个让我满意的答复,不是编译错误就是无效代码,再或者只有简单的套路压根就没有答案的,这瞬间引起了我的重视,我随即去百度搜索答案,发现压根就没有这题的解答,我又去查了我的GPT4.0,同样错误百出,我最后只能去洛谷博客去找答案了,但好在最后是找到了(原代码出处:云剪贴板 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
太不容易了好吧,点个赞支持一下吧
直接上代码
test1~3
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll dr()
{
ll xx=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')xx=xx*10+ch-'0',ch=getchar();
return xx*f;
}
int n,m,op[40000],k[40000],c1[40000],c2[40000],t1[40000],t2[40000];ll xh1[40000],xh2[40000];
ll x[20],mx1;int fir=1,cho[100],cn,mcho[100],mcn;ll mx[20];
int l,r;
int lco[40000],ln;
void ss(int t)
{
if(t<0||t>r)
{
if(fir)
{
fir=0;
mcn=cn,mx1=x[1];
for(int i=1;i<=cn;i++)mcho[i]=cho[i];
for(int i=1;i<=m;i++)mx[i]=x[i];
}
else if(x[1]>mx1)
{
mcn=cn,mx1=x[1];
for(int i=1;i<=cn;i++)mcho[i]=cho[i];
for(int i=1;i<=m;i++)mx[i]=x[i];
}
return;
}
if(op[t]==0)
{
ll add=k[t]*(c2[t]?x[xh2[t]]:xh2[t]);
x[xh1[t]]+=add,ss(t+1),x[xh1[t]]-=add;
}
else if(op[t]==1)
{
cho[++cn]=1,ss(t1[t]),--cn;
cho[++cn]=2,ss(t2[t]),--cn;
}
else
{
ll Le=c1[t]?x[xh1[t]]:xh1[t],Ri=c2[t]?x[xh2[t]]:xh2[t];
ss(Le<Ri?t1[t]:t2[t]);
}
}
bool check(int t)
{
if(op[t]!=0)return true;
if(k[t]!=-1)return true;
if(c2[t]!=1)return true;
if(xh1[t]!=m||xh2[t]!=m)return true;
return false;
}
int main()
{
freopen("train3.in","r",stdin);
freopen("train3.out","w",stdout);
n=dr(),m=dr();
for(int i=1;i<=n;i++)
{
char ch=getchar();
while(ch!='v'&&ch!='s'&&ch!='i')ch=getchar();
if(ch=='v')
{
op[i]=0,c1[i]=1,xh1[i]=dr();
ch=getchar();
while(ch!='+'&&ch!='-')ch=getchar();
k[i]=ch=='+'?1:-1;
ch=getchar();
while(ch!='v'&&ch!='c')ch=getchar();
c2[i]=ch=='v'?1:0,xh2[i]=dr();
}
else if(ch=='s')op[i]=1,t1[i]=dr(),t2[i]=dr();
else
{
op[i]=2,ch=getchar();
while(ch!='v'&&ch!='c')ch=getchar();
c1[i]=ch=='v'?1:0,xh1[i]=dr();
ch=getchar();
while(ch!='v'&&ch!='c')ch=getchar();
c2[i]=ch=='v'?1:0,xh2[i]=dr();
t1[i]=dr(),t2[i]=dr();
}
}
for(int i=1;i<=n;i++)
{
r=l=i;
while(r<n&&check(r))++r;
fir=1,cn=mcn=0;
for(int j=1;j<=m;j++)x[j]=mx[j];
for(int j=3;j<=m;j++)if(x[j]!=0){printf("%d %d",i,j);return 0;}
ss(l);
for(int j=1;j<=mcn;j++)lco[++ln]=mcho[j];
i=r;
}
for(int i=1;i<=ln;i++)printf("%d\n",lco[i]);
}
test4~6
(部分重复代码段不再放出,后续相同)
ll wei[2010],val[2010],M;int tn,bj[2010];
int z[2010],zd;
ll f[2010][10010],g[2010][5010],to[2010][10010];
vector<int> bi[2010];
void add(int u,int v){bi[u].push_back(v);}
void dp(int u)
{
int fir=1,lv=0;
for(int i=0,in=bi[u].size();i<in;i++)
{
int v=bi[u][i];
dp(v);
if(fir)
{
for(int j=wei[v];j<=M;j++)g[v][j]=f[v][j-wei[v]]+val[v],to[v][j]=j;
fir=0;
}
else
{
for(int j=0;j<=M;j++)g[v][j]=g[lv][j],to[v][j]=0;
for(int j=0;j<=M;j++)for(int k=0;j+k+wei[v]<=M;k++)
{
ll nv=g[lv][j]+f[v][k]+val[v];
if(nv>g[v][j+k+wei[v]])g[v][j+k+wei[v]]=nv,to[v][j+k+wei[v]]=k+wei[v];
}
}
lv=v;
}
if(!fir)for(int i=0;i<=M;i++)f[u][i]=g[lv][i];
}
void work(int u,ll lm)
{
bj[u]=1;
int in=bi[u].size();
for(int i=in-1;i>=0;i--)
{
int v=bi[u][i];
if(to[v][lm])work(v,to[v][lm]-wei[v]),lm-=to[v][lm];
}
}
void print(int u,ll &lm)
{
if(bj[u])printf("1\n"),lm-=wei[u];
else{printf("2\n");return;}
for(int i=0,in=bi[u].size();i<in;i++)
{
int v=bi[u][i];
if(lm>=wei[v])print(v,lm);
}
}
int main()
{
/*
...
*/
M=xh2[1];
//注释部分为Test 4
/*for(int i=2;i<=n;i+=6)
{
++tn;
wei[tn]=xh2[i+3],val[tn]=xh2[i+4];
}
for(int i=1;i<=tn;i++)
{
for(int j=0;j<=M;j++)f[i][j]=f[i-1][j];
for(int j=wei[i];j<=M;j++)f[i][j]=max(f[i][j],f[i-1][j-wei[i]]+val[i]);
}
ll lm=M;
for(int i=tn;i;i--)if(lm>=wei[i]&&f[i-1][lm-wei[i]]+val[i]>f[i-1][lm])bj[i]=1,lm-=wei[i];
for(int i=1;i<=tn;i++)
if(M>=wei[i])
{
if(bj[i])printf("1\n"),M-=wei[i];
else printf("2\n");
}*/
for(int i=2;i<=n;i++)
if(c1[i]==1)
{
++tn,wei[tn]=xh2[i+3],val[tn]=xh2[i+4];
z[++zd]=tn;
i=i+4;
}
else
{
int bxh=z[zd];--zd;
if(zd)add(z[zd],bxh);
}
dp(1),work(1,M-wei[1]);
print(1,M);
}
test7~8
int main()
{
/*
...
*/
M=xh2[1];
for(int i=2;i<=n;i++)
{
++tn,wei[tn]=xh2[i+3];
l=i+4,r=t1[i+1],fir=1;
ss(l);
val[tn]=mx1;
i=r-1;
}
for(int i=1;i<=tn;i++)
{
for(int j=0;j<=M;j++)f[i][j]=f[i-1][j];
for(int j=wei[i];j<=M;j++)f[i][j]=max(f[i][j],f[i-1][j-wei[i]]+val[i]);
}
ll lm=M;
for(int i=tn;i;i--)if(lm>=wei[i]&&f[i-1][lm-wei[i]]+val[i]>f[i-1][lm])bj[i]=1,lm-=wei[i];
for(int i=1;i<=tn;i++)
if(M>=wei[i])
{
if(bj[i])
{
printf("1\n");
for(int j=1;j<=mcn[i];j++)printf("%d\n",mcho[i][j]);
M-=wei[i];
}
else printf("2\n");
}
}
Test 9~10
void print(int u,ll &lm)
{
if(bj[u])printf("1\n"),lm-=wei[u];
else{printf("2\n");return;}
for(int i=1;i<=mcn[u];i++)printf("%d\n",mcho[u][i]);
for(int i=0,in=bi[u].size();i<in;i++)
{
int v=bi[u][i];
if(lm>=wei[v])print(v,lm);
}
}
int main()
{
/*
...
*/
M=xh2[1];
for(int i=2;i<=n;i++)
if(c1[i]==1)
{
++tn,wei[tn]=xh2[i+3];
r=l=i+4,fir=1;
while(check(r))++r;
ss(l);
val[tn]=mx1,z[++zd]=tn;
i=r;
}
else
{
int bxh=z[zd];--zd;
if(zd)add(z[zd],bxh);
}
dp(1),work(1,M-wei[1]);
print(1,M);
}
源码
### Test 1\~3
```cpp
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll dr()
{
ll xx=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')xx=xx*10+ch-'0',ch=getchar();
return xx*f;
}
int n,m,op[40000],k[40000],c1[40000],c2[40000],t1[40000],t2[40000];ll xh1[40000],xh2[40000];
ll x[20],mx1;int fir=1,cho[100],cn,mcho[100],mcn;ll mx[20];
int l,r;
int lco[40000],ln;
void ss(int t)
{
if(t<0||t>r)
{
if(fir)
{
fir=0;
mcn=cn,mx1=x[1];
for(int i=1;i<=cn;i++)mcho[i]=cho[i];
for(int i=1;i<=m;i++)mx[i]=x[i];
}
else if(x[1]>mx1)
{
mcn=cn,mx1=x[1];
for(int i=1;i<=cn;i++)mcho[i]=cho[i];
for(int i=1;i<=m;i++)mx[i]=x[i];
}
return;
}
if(op[t]==0)
{
ll add=k[t]*(c2[t]?x[xh2[t]]:xh2[t]);
x[xh1[t]]+=add,ss(t+1),x[xh1[t]]-=add;
}
else if(op[t]==1)
{
cho[++cn]=1,ss(t1[t]),--cn;
cho[++cn]=2,ss(t2[t]),--cn;
}
else
{
ll Le=c1[t]?x[xh1[t]]:xh1[t],Ri=c2[t]?x[xh2[t]]:xh2[t];
ss(Le<Ri?t1[t]:t2[t]);
}
}
bool check(int t)
{
if(op[t]!=0)return true;
if(k[t]!=-1)return true;
if(c2[t]!=1)return true;
if(xh1[t]!=m||xh2[t]!=m)return true;
return false;
}
int main()
{
freopen("train3.in","r",stdin);
freopen("train3.out","w",stdout);
n=dr(),m=dr();
for(int i=1;i<=n;i++)
{
char ch=getchar();
while(ch!='v'&&ch!='s'&&ch!='i')ch=getchar();
if(ch=='v')
{
op[i]=0,c1[i]=1,xh1[i]=dr();
ch=getchar();
while(ch!='+'&&ch!='-')ch=getchar();
k[i]=ch=='+'?1:-1;
ch=getchar();
while(ch!='v'&&ch!='c')ch=getchar();
c2[i]=ch=='v'?1:0,xh2[i]=dr();
}
else if(ch=='s')op[i]=1,t1[i]=dr(),t2[i]=dr();
else
{
op[i]=2,ch=getchar();
while(ch!='v'&&ch!='c')ch=getchar();
c1[i]=ch=='v'?1:0,xh1[i]=dr();
ch=getchar();
while(ch!='v'&&ch!='c')ch=getchar();
c2[i]=ch=='v'?1:0,xh2[i]=dr();
t1[i]=dr(),t2[i]=dr();
}
}
for(int i=1;i<=n;i++)
{
r=l=i;
while(r<n&&check(r))++r;
fir=1,cn=mcn=0;
for(int j=1;j<=m;j++)x[j]=mx[j];
for(int j=3;j<=m;j++)if(x[j]!=0){printf("%d %d",i,j);return 0;}
ss(l);
for(int j=1;j<=mcn;j++)lco[++ln]=mcho[j];
i=r;
}
for(int i=1;i<=ln;i++)printf("%d\n",lco[i]);
}
```
### Test 4\~6
(部分重复代码段不再放出,后续相同)
```cpp
ll wei[2010],val[2010],M;int tn,bj[2010];
int z[2010],zd;
ll f[2010][10010],g[2010][5010],to[2010][10010];
vector<int> bi[2010];
void add(int u,int v){bi[u].push_back(v);}
void dp(int u)
{
int fir=1,lv=0;
for(int i=0,in=bi[u].size();i<in;i++)
{
int v=bi[u][i];
dp(v);
if(fir)
{
for(int j=wei[v];j<=M;j++)g[v][j]=f[v][j-wei[v]]+val[v],to[v][j]=j;
fir=0;
}
else
{
for(int j=0;j<=M;j++)g[v][j]=g[lv][j],to[v][j]=0;
for(int j=0;j<=M;j++)for(int k=0;j+k+wei[v]<=M;k++)
{
ll nv=g[lv][j]+f[v][k]+val[v];
if(nv>g[v][j+k+wei[v]])g[v][j+k+wei[v]]=nv,to[v][j+k+wei[v]]=k+wei[v];
}
}
lv=v;
}
if(!fir)for(int i=0;i<=M;i++)f[u][i]=g[lv][i];
}
void work(int u,ll lm)
{
bj[u]=1;
int in=bi[u].size();
for(int i=in-1;i>=0;i--)
{
int v=bi[u][i];
if(to[v][lm])work(v,to[v][lm]-wei[v]),lm-=to[v][lm];
}
}
void print(int u,ll &lm)
{
if(bj[u])printf("1\n"),lm-=wei[u];
else{printf("2\n");return;}
for(int i=0,in=bi[u].size();i<in;i++)
{
int v=bi[u][i];
if(lm>=wei[v])print(v,lm);
}
}
int main()
{
/*
...
*/
M=xh2[1];
//注释部分为Test 4
/*for(int i=2;i<=n;i+=6)
{
++tn;
wei[tn]=xh2[i+3],val[tn]=xh2[i+4];
}
for(int i=1;i<=tn;i++)
{
for(int j=0;j<=M;j++)f[i][j]=f[i-1][j];
for(int j=wei[i];j<=M;j++)f[i][j]=max(f[i][j],f[i-1][j-wei[i]]+val[i]);
}
ll lm=M;
for(int i=tn;i;i--)if(lm>=wei[i]&&f[i-1][lm-wei[i]]+val[i]>f[i-1][lm])bj[i]=1,lm-=wei[i];
for(int i=1;i<=tn;i++)
if(M>=wei[i])
{
if(bj[i])printf("1\n"),M-=wei[i];
else printf("2\n");
}*/
for(int i=2;i<=n;i++)
if(c1[i]==1)
{
++tn,wei[tn]=xh2[i+3],val[tn]=xh2[i+4];
z[++zd]=tn;
i=i+4;
}
else
{
int bxh=z[zd];--zd;
if(zd)add(z[zd],bxh);
}
dp(1),work(1,M-wei[1]);
print(1,M);
}
```
### Test 7\~8
```cpp
int main()
{
/*
...
*/
M=xh2[1];
for(int i=2;i<=n;i++)
{
++tn,wei[tn]=xh2[i+3];
l=i+4,r=t1[i+1],fir=1;
ss(l);
val[tn]=mx1;
i=r-1;
}
for(int i=1;i<=tn;i++)
{
for(int j=0;j<=M;j++)f[i][j]=f[i-1][j];
for(int j=wei[i];j<=M;j++)f[i][j]=max(f[i][j],f[i-1][j-wei[i]]+val[i]);
}
ll lm=M;
for(int i=tn;i;i--)if(lm>=wei[i]&&f[i-1][lm-wei[i]]+val[i]>f[i-1][lm])bj[i]=1,lm-=wei[i];
for(int i=1;i<=tn;i++)
if(M>=wei[i])
{
if(bj[i])
{
printf("1\n");
for(int j=1;j<=mcn[i];j++)printf("%d\n",mcho[i][j]);
M-=wei[i];
}
else printf("2\n");
}
}
```
### Test 9\~10
```cpp
void print(int u,ll &lm)
{
if(bj[u])printf("1\n"),lm-=wei[u];
else{printf("2\n");return;}
for(int i=1;i<=mcn[u];i++)printf("%d\n",mcho[u][i]);
for(int i=0,in=bi[u].size();i<in;i++)
{
int v=bi[u][i];
if(lm>=wei[v])print(v,lm);
}
}
int main()
{
/*
...
*/
M=xh2[1];
for(int i=2;i<=n;i++)
if(c1[i]==1)
{
++tn,wei[tn]=xh2[i+3];
r=l=i+4,fir=1;
while(check(r))++r;
ss(l);
val[tn]=mx1,z[++zd]=tn;
i=r;
}
else
{
int bxh=z[zd];--zd;
if(zd)add(z[zd],bxh);
}
dp(1),work(1,M-wei[1]);
print(1,M);
}
```
特别提示:洛谷有严格的防作弊系统和作弊惩戒系统,以上代码段出自洛谷题解,并且题目较难更容易被管理员盯上,仅供参考,棕名封号两行泪!