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 }