pojBuy Tickets(线段树)
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N = 200000 + 10; 6 7 int a[N], Tree[N << 2], ans[N], b[N]; 8 9 void Build(int l, int r, int rt) { 10 Tree[rt] = r - l + 1; 11 if (l == r) { 12 return; 13 } 14 int m = (l + r) >> 1; 15 Build(l, m, rt << 1); 16 Build(m + 1, r, rt << 1 | 1); 17 } 18 void Update(int p, int val, int l, int r, int rt) { 19 Tree[rt]--; 20 if (l == r) { 21 ans[l] = val; 22 return; 23 } 24 int m = (l + r) >> 1; 25 if (p <= Tree[rt << 1]) Update(p, val, l, m, rt << 1); 26 else Update(p - Tree[rt << 1], val, m + 1, r, rt << 1 | 1); 27 } 28 29 int main() { 30 31 ios::sync_with_stdio(0); 32 cin.tie(0); 33 int n; 34 while (scanf("%d", &n) != EOF) { 35 memset(Tree, 0, sizeof(Tree)); 36 Build(1, n, 1); 37 for (int i = 1; i <= n; i++) { 38 scanf("%d %d", &a[i], &b[i]); 39 } 40 for (int i = n; i >= 1; i--) { 41 Update(a[i] + 1, b[i], 1, n, 1); 42 } 43 for (int i = 1; i <= n; i++) { 44 printf("%d ", ans[i]); 45 } 46 printf("\n"); 47 } 48 49 return 0; 50 }
需要注意的是,本题用cin,cout会超时,即使使用
ios::sync_with_stdio(0);优化也会超时,直接使用scanf,printf就可以了
永远热爱,永远向着光。