洛谷P1335答案

今天刷题的时候偶然看到了一个特别难的题,我果断逛了逛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);
}
```

特别提示:洛谷有严格的防作弊系统和作弊惩戒系统,以上代码段出自洛谷题解,并且题目较难更容易被管理员盯上,仅供参考,棕名封号两行泪!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AC苏zhengji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值