Link:
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; }