CF28D Don't fear, DravDe is kind

CF28D Don't fear, DravDe is kind


傻逼dp。

显然\(c+l+r\)相同的才能相互转移,然后\(i\)会从满足\(l_j+c_j=l_i\)\(f\)最大的\(j\)转移过来。

#include<bits/stdc++.h>
#define il inline
#define vd void
#define int long long
il int gi(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return x*f;
}
std::map<int,int>yyb;
const int maxn=200001;
int w[maxn],p[maxn],l[maxn],r[maxn];
std::vector<int>S[maxn];
int ans[maxn],Ans=-1,t[1000100],tt[1000100],lst[maxn],f[maxn];
main(){
    int n=gi();
    for(int i=1;i<=n;++i){
        w[i]=gi(),p[i]=gi(),l[i]=gi(),r[i]=gi();
        int s=p[i]+l[i]+r[i];
        if(yyb[s]==0)yyb[s]=i;
        S[yyb[s]].push_back(i);
    }
    for(int i=1;i<=n;++i){
        if(!S[i].size())continue;
        tt[0]=i,t[0]=-1;
        int mx=-1;
        for(int j=0;j<S[i].size();++j){
            if(tt[l[S[i][j]]]!=i)continue;
            lst[j]=t[l[S[i][j]]];
            f[j]=f[lst[j]]+w[S[i][j]];
            int np=l[S[i][j]]+p[S[i][j]];
            if(np<1000001&&(tt[np]!=i||f[t[np]]<f[j]))tt[np]=i,t[np]=j;
            if(r[S[i][j]]==0&&f[mx]<f[j])mx=j;
        }
        if(~mx&&Ans<f[mx]){
            Ans=f[mx];
            ans[0]=0;
            for(int j=mx;~j;j=lst[j])ans[++ans[0]]=S[i][j];
        }
    }
    if(Ans==-1)puts("0");
    else{
        printf("%lld\n",ans[0]);
        for(int i=ans[0];i;--i)printf("%lld ",ans[i]);
        puts("");
    }
    return 0;
}

转载于:https://www.cnblogs.com/xzz_233/p/9762721.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值