51Nod 1402 最大值问题

来源:互联网 发布:java用户注册代码 编辑:程序博客网 时间:2024/05/16 15:27

1402 最大值
题目来源: TopCoder
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
 收藏
 关注
一个N长的数组s[](注意这里的数组初始下标设为1,而不是0,即N个元素为s[1],s[2],...,s[N]),满足以下性质:
1)每个元素都是非负的整数,且s[1]=0;
2)任意两个相邻元素差值的绝对值不大于1,即| s[i]-s[i+1] |<=1;
3)对于部分特殊点xi,要求s[xi]<=ti(这样的特殊点一共M个);
问在以上约束下s[]中的最大值最大可能是多少?
Input
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5每组测试数据有相同的结构构成:第一行两个整数N,M,表示s[]的长度与特殊点的个数,其中1<=N<=100000,0<=M<=50.之后M行,每行两个整数xi与ti,其中1<=xi<=N,0<=ti<=100000,且xi以增序给出。
Output
每组数据一行输出,即数组的可能最大值。
Input示例
310 23 18 1100000 02718 51 10000030 100000400 1000001300 1000002500 100000
Output示例
3999992717
孔炤 (题目提供者)
从前往后再从后往前扫一遍即可
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<limits.h>#include<string>#include<queue>#include<vector>#include<stack>#include<math.h>#include<map>#include<algorithm>using namespace std;typedef long long ll;#define maxn 1000005#define Mod 1000000007const int inf=1e10;ll a[maxn],b[maxn],flag[maxn];int  main(){ll n,m,k,i,j,T,x,y;scanf("%lld",&T);while(T--){ll ans=0;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(flag,-1,sizeof(flag));scanf("%lld%lld",&n,&m);for(i=1;i<=m;i++){scanf("%lld%lld",&x,&y);flag[x]=y;}ll t1=0,t2=inf;for(i=2;i<=n;i++){t1++;if(flag[i]>=0)t1=min(flag[i],t1);a[i]=t1;}for(i=n;i>1;i--){t2++;if(flag[i]>=0)t2=min(flag[i],t2);b[i]=t2;}for(i=1;i<=n;i++)ans=max(ans,min(a[i],b[i]));printf("%lld\n",ans);}}

0 0
原创粉丝点击