社区讨论

方案错了求调

P3592[POI 2015 R3] 洗车 Car washes参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo7n3iov
此快照首次捕获于
2023/10/27 04:31
2 年前
此快照最后确认于
2023/10/27 04:31
2 年前
查看原帖
CPP
#include<iostream>
#include<algorithm>
#define mn 4010
#define FOR(i,x,y) for(int i=x;i<=y;++i)
#define ROF(i,x,y) for(int i=x;i;--i)
using namespace std;
int n,m,cnt;
int a[mn],b[mn];
int c[mn],d[mn];
int g[55][mn];
int f[55][55][mn];
int zzz[55][55][mn];
int pre[55][55][mn];
int ans[55];
void calc(int l,int r,int k)
{
	if(l>r)return;
	int pos=zzz[l][r][k=pre[l][r][k]];
	ans[pos]=d[k];
	calc(l,pos-1,k);
	calc(pos+1,r,k);
}
int main()
{
	ios::sync_with_stdio(false); 
	cin>>n>>m;
	FOR(i,1,m)cin>>a[i]>>b[i]>>c[i],d[i]=c[i];
	sort(d+1,d+m+1);
	cnt=unique(d+1,d+m+1)-d-1;
	FOR(i,1,m)c[i]=lower_bound(d+1,d+cnt+1,c[i])-d;
	ROF(l,n,0)
	{
		FOR(r,l,n)
		{
			FOR(mid,l,r)FOR(k,0,cnt)g[mid][k]=0;
			FOR(i,1,m)if(l<=a[i]&&b[i]<=r)FOR(mid,a[i],b[i])g[mid][c[i]]++;
			FOR(mid,l,r)ROF(k,cnt-1,0)g[mid][k]+=g[mid][k+1];
			ROF(k,cnt,0)
			{
				int res=0;
				FOR(mid,l,r)
				{
					int tmp=f[l][r][k]=max(f[l][r][k],f[l][mid-1][k]+f[mid+1][r][k]+g[mid][k]*d[k]);
                    if(tmp>=res)res=tmp,zzz[l][r][k]=mid;
				}
				if(f[l][r][k+1]<=res)f[l][r][k]=res,pre[l][r][k]=k;
				else f[l][r][k]=f[l][r][k+1],pre[l][r][k]=pre[l][r][k+1];
			}
		}
	}
	cout<<f[1][n][1]<<'\n';
	calc(1,n,1);
	FOR(i,1,n)cout<<ans[i]<<' ';
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...