社区讨论
方案错了求调
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 条回复,欢迎继续交流。
正在加载回复...