NC220821. 排队
描述
输入描述
第一行一个整数 。
接下来 行每行三个整数 。
输出描述
输出一行 个整数,表示每一个小朋友看的小朋友个数
示例1
输入:
3 1 2 3 4 5 6 7 8 9
输出:
1 2 2
说明:
1号小朋友只能看到2号小朋友,2号小朋友可以看到1和3号小朋友,3号小朋友可以看到2号小朋友和1号小朋友。示例2
输入:
5 1 7 3 2 6 4 3 3 3 4 5 4 5 8 3
输出:
1 4 4 4 2
说明:
1号小朋友可以看到2号。2号小朋友可以看到1、3、4、5号。3号小朋友可以看到1、2、4、5号。4号小朋友可以看到1、2、3、5号。5号小朋友可以看到2、4号。C++(clang++11) 解法, 执行用时: 402ms, 内存消耗: 7172K, 提交时间: 2021-05-09 22:26:45
#include<iostream> #include<algorithm> using namespace std; const int N = 300010; int stk[N],ans[N],n; struct node{ int t,h,d,id; }p[N]; bool cmp1(node a,node b) { return a.t < b.t; } bool cmp2(node a,node b) { return a.t > b.t; } void mostk() { int top = 0; for(int i = 0;i < n;i++) { if(i) { int l = 1,r = top; while(l < r) { int mid = (l+r)/2; if(abs(p[i].t-p[stk[mid]].t) > p[i].d) l = mid+1; else r = mid; } ans[p[i].id] += top-l+1; } while(top && p[stk[top]].h <= p[i].h) top--; stk[++top] = i; } } int main() { cin >> n; for(int i = 0;i < n;i++) { cin >> p[i].t >> p[i].h >> p[i].d; p[i].id = i; } sort(p,p+n,cmp1); mostk(); sort(p,p+n,cmp2); mostk(); for(int i = 0;i < n;i++) cout << ans[i] << " "; return 0; }