题目链接  Codeforces_Gym_101485

Problem A

直接用优先队列进行贪心即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<string>
 8 #include<set>
 9 #include<queue>
10 #include<map>
11 using namespace std;
12 const int inf=(1<<30)-1;
13 const int maxn=300010;
14 #define REP(i,n) for(int i=(0);i<(n);i++)
15 #define FOR(i,j,n) for(int i=(j);i<=(n);i++)
16 #define Rep(x) for(int i=head[x],y;~i;i=e[i].next) if(!vis[y=e[i].to])
17 typedef long long ll;
18 typedef pair<int,int> PII;
19 int IN(){
20     int c,f,x;
21     while (!isdigit(c=getchar())&&c!='-');c=='-'?(f=1,x=0):(f=0,x=c-'0');
22     while (isdigit(c=getchar())) x=(x<<1)+(x<<3)+c-'0';return !f?x:-x;
23 }
24 #define de(x) cout << #x << "=" << x << endl
25 #define MP make_pair
26 #define PB push_back
27 #define fi first
28 #define se second
29 int n,m,T;
30 struct data{
31     int l,r;
32 }a[maxn];
33 bool cmp(data a,data b)
34 {
35     return a.l<b.l;
36 }
37 priority_queue<int,vector<int>,greater<int> >  Q;
38 int main()
39 {
40     while(~scanf("%d%d",&n,&m))
41     {
42         FOR(i,1,n) {
43             a[i].l=IN();
44             a[i].r=IN();
45             a[i].r+=a[i].l;
46         }
47         sort(a+1,a+n+1,cmp);
48         Q.push(a[1].r+m);
49         int ans=0;
50         for(int i=2;i<=n;i++)
51         {
52             while(!Q.empty()&&Q.top()<a[i].l) Q.pop();
53             int u=Q.top();
54             if(u-m<=a[i].l&&a[i].l<=u) ans++,Q.pop();
55             Q.push(a[i].r+m);
56         }
57         printf("%d\n",ans);
58         while(!Q.empty()) Q.pop();
59     }
60     return 0;
61 }
View Code

相关文章: