简单贪心,只需要维护每一个点可以到达之前的最小值和次小值。
唉,还是太弱,比赛的时候写了也蛮久,忘了判断右端点相同的区间了。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
using namespace std;
#define MAX(x,y) (((x)>(y))?(x):(y))
#define MIN(x,y) (((x)<(y))?(x):(y))
#define N 50010
#define pi acos(-1.0)
#define inf 100000000
typedef long long ll;
typedef unsigned long long ull;
struct link{
int a,b;
}a[N];
bool cmp( link a ,link b){
return a.b<b.b ;
}
int f1[N];
int f2[N];
int main(){
int n,m,q;
while(~scanf("%d%d%d",&n,&m,&q)){
memset(f1,127,sizeof(f1));
memset(f2,127,sizeof(f2));
int max1=inf;
int max2=inf;
for(int i=1;i<=m;i++){
scanf("%d%d",&a[i].b,&a[i].a);
}
sort(a+1,a+1+m,cmp);
int e=m;
for(int i=n;i>=1;i--){
if(a[e].b!=i){
f1[i]=max1;
f2[i]=max2;
}
else if(a[e].b==i){
if(max1>a[e].a){
max2=max1;
max1=a[e].a;
}
else if(max2>a[e].a){
max2=a[e].a;
}
f1[i]=max1;
f2[i]=max2;
e--;
i++;
}
}
int tmp;
for(int i=1;i<=q;i++){
scanf("%d",&tmp);
int ans=tmp-MAX(f1[tmp],f2[tmp]);
if(ans<0) ans=0;
printf("%d\n",ans);
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-24 09:17:23