CodeForces 360A - Levko and Array Recovery【动规】

题意:一道已知操作求原始数组的题目;

分析:求出每个位置初始时可能的最小值...然后再判断是否合法即可;

疑问之处:为什么a数组初始要给10^9(原始数组的最大范围),而不能是inf?

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 1000000007
#define maxn 5005
int a[maxn],b[maxn];
int k;
struct elem
{
int t,l,r,m;
} p[maxn];
int n,m;
bool solve()
{
int i,j;
for(i=1;i<=n;i++) a[i]=1000000000;
memset(b,0,sizeof(b));
for(i=1;i<=m;i++)
{
if(p[i].t==1)
{
for(j=p[i].l;j<=p[i].r;j++) b[j]+=p[i].m;
}
else if(p[i].t==2)
{
for(j=p[i].l;j<=p[i].r;j++) a[j]=min(a[j],p[i].m-b[j]);
}
}
memset(b,0,sizeof(b));
for(i=1;i<=m;i++)
{
if(p[i].t==1)
{
for(j=p[i].l;j<=p[i].r;j++) b[j]+=p[i].m;
}
else if(p[i].t==2)
{
k=-inf;
for(j=p[i].l;j<=p[i].r;j++) k=max(k,a[j]+b[j]);
if(k!=p[i].m) return false;
}
}
return true;
}


int main()
{
while(~scanf("%d%d",&n,&m))
{
int i;
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&p[i].t,&p[i].l,&p[i].r,&p[i].m);
}
bool flag;
flag=solve();
if(!flag) printf("NO");
else
{
printf("YES\n");
for(i=1;i<=n;i++) i==1?printf("%d",a[i]):printf(" %d",a[i]);
}
printf("\n");
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值