Link:

Codeforces #210 传送门

A:

贪心,对每个值都取最大值,不会有其他解使答案变优

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
typedef double db;
const int MAXN=5005,INF=1<<30;
struct data{int op,l,r,x;}dat[MAXN];
int n,m,mx[MAXN],vis[MAXN];

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d%d%d%d",&dat[i].op,&dat[i].l,&dat[i].r,&dat[i].x);
    for(int i=1;i<=n;i++)
    {
        int tmp=0;mx[i]=INF;
        for(int j=1;j<=m;j++)
            if(dat[j].op==1&&i>=dat[j].l&&i<=dat[j].r) 
                tmp+=dat[j].x;
            else if(dat[j].op==2&&i>=dat[j].l&&i<=dat[j].r)
                mx[i]=min(mx[i],dat[j].x-tmp);
    }
    for(int i=1;i<=n;i++)
    {
        if(mx[i]==INF) mx[i]=0;
        int tmp=mx[i];
        for(int j=1;j<=m;j++)
            if(dat[j].op==1&&i>=dat[j].l&&i<=dat[j].r) 
                tmp+=dat[j].x;
            else if(dat[j].op==2&&i>=dat[j].l&&i<=dat[j].r&&tmp==dat[j].x)
                vis[j]++;
    }
    for(int i=1;i<=m;i++)
        if(dat[i].op==2&&!vis[i]) return puts("NO"),0;
    puts("YES");
    for(int i=1;i<=n;i++) 
        printf("%d ",mx[i]);
    return 0;
}
Problem A

相关文章: