D. Andrey and Escape from Capygrad

D. Andrey and Escape from Capygrad

An incident occurred in Capygrad, the capital of Tyagoland, where all the capybaras in the city went crazy and started throwing mandarins. Andrey was forced to escape from the city as far as possible, using portals.

Tyagoland is represented by a number line, and the city of Capygrad is located at point 0. There are n portals all over Tyagoland, each of which is characterised by four integers li, ri, ai and bi (1liaibiri109). Note that the segment [ai,bi] is contained in the segment [li,ri].

If Andrey is on the segment [li,ri], then the portal can teleport him to any point on the segment [ai,bi]. Andrey has a pass that allows him to use the portals an unlimited number of times.

Andrey thinks that the point x is on the segment [l,r] if the inequality lxr is satisfied.

Andrey has q options for where to start his escape, each option is characterized by a single integer xi — the starting position of the escape. He wants to escape from Capygrad as far as possible (to the point with the maximum possible coordinate). Help Andrey determine how far he could escape from Capygrad, starting at each of the q positions.

Input

Each test consists of multiple test cases. The first line contains a single integer t (1t104) — the number of sets of test cases. The description of test cases follows.

The first line of each test case contains a single integer n (1n2105) — the number of portals.

Each of the next n lines contains four integers li, ri, ai, and bi (1liaibiri109) — the characteristics of the portals.

The next line contains a single integer q (1q2105) — the number of positions.

The following line contains q integers x1,x2,,xq (1xi109) — the position from which Andrey will start his escape in the i-th options.

It is guaranteed that the sum of n and the sum of q over all test cases does not exceed 2105.

Output

For each test case, output a single line of q integers, containing the answers to Andrey's questions.

Example

input

复制代码
5
3
6 17 7 14
1 12 3 8
16 24 20 22
6
10 2 23 15 28 18
3
3 14 7 10
16 24 20 22
1 16 3 14
9
2 4 6 8 18 23 11 13 15
2
1 4 2 3
3 9 6 7
3
4 8 1
5
18 24 18 24
1 8 2 4
11 16 14 14
26 32 28 30
5 10 6 8
9
15 14 13 27 22 17 31 1 7
6
9 22 14 20
11 26 13 24
21 33 22 23
21 33 25 32
1 6 3 4
18 29 20 21
8
11 23 16 5 8 33 2 21
复制代码

output

14 14 23 15 28 22 
14 14 14 14 22 23 14 14 15 
7 8 7 
15 14 14 30 24 17 31 4 8 
32 32 32 5 8 33 4 32 

Note

In the first test case:

Optimal actions when starting from each position:

  1. Use portal 1 and teleport to point b1=14.
  2. Use portal 2 first and teleport to point 6, which is on the segment [l1,r1]=[6,17], then use portal 1 and teleport to point b1=14.
  3. Stay at point x3=23 without using any portals.
  4. Stay at point x4=15 without using any portals.
  5. Point x5=28 is not on any segment, so Andrey won't be able to teleport anywhere.
  6. Point x6=18 is only on the segment [l3,r3]=[16,24], use portal 3 and teleport to point b3=22.

In the fifth test case:

Optimal actions when starting from each position:

  1. Use portal 1 first and teleport to point 15 on the segment [a1,b1]=[14,20], then use portal 2 and teleport to point 21, which is on the segment [l4,r4]=[21,33] and on the segment [a2,b2]=[13,24], then teleport to point b4=32.
  2. Use portal 6 first and teleport to point 20 on the segment [a6,b6]=[20,21], then use portal 2 and teleport to point 22, which is simultaneously on the segment [l4,r4]=[21,33] and on the segment [a2,b2]=[13,24], then teleport to point b4=32.
  3. Perform the same actions as from the first position.
  4. Stay at point x4=5 without using any portals.
  5. Point 8 is not on any segment, so Andrey won't be able to teleport anywhere.
  6. Stay at point x6=33 without using any portals.
  7. Use portal 5 and teleport to point b5=4.
  8. Perform the same actions as from the first position.

 

解题思路

  对于一段区间(li,ri,ai,bi),实际上我们只关心其[li,bi]这一部分。我们把原本的区间分成两段,分别是[li,bi][bi+1,ri],当下标x[li,bi],那么x就可以通过该区间传送到bi处,x不会变小;当下标x[bi+1,ri],如果要通过该区间传送,那么x最大只能传送到bix只会变小。因此对于每个区间的[bi+1,ri]这部分可以直接舍弃,因为如果x位于这个区间范围内,若要传送则x只会变小,不如保持原来的不变。

  同时如果x[li,bi],那么x一定可以变成bi,又因为可以无限传送,因此如果区间存在交集那么继续往最右边传送。所以可以进行区间合并,那么就会得到若干个互不相交的区间(否则就可以合并成一个),然后对合并后的区间按左端点排序,对于每一个询问x可以二分出左端点不超过x的最大区间,那么x最终能传送到最远的地方就是x本身与这个区间右端点中最大的一个。

  AC代码如下,时间复杂度为O(nlogn)

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 typedef pair<int, int> PII;
 6 
 7 const int N = 2e5 + 10;
 8 
 9 PII p[N];
10 
11 void solve() {
12     int n, m;
13     scanf("%d", &n);
14     for (int i = 0; i < n; i++) {
15         int l, r;
16         scanf("%d %*d %*d %d", &l, &r);    // 对于区间(l,r,a,b),只关心l和b 
17         p[i] = {l, r};
18     }
19     // 对区间按左端点排序,然后进行区间合并 
20     sort(p, p + n); 
21     vector<PII> q;
22     int l = -1, r = -1;
23     for (int i = 0; i < n; i++) {
24         if (p[i].first > r) {
25             if (l != -1) q.push_back({l, r});
26             l = p[i].first, r = p[i].second;
27         }
28         else {
29             r = max(r, p[i].second);
30         }
31     }
32     q.push_back({l, r}); 
33     scanf("%d", &m);
34     while (m--) {
35         int x;
36         scanf("%d", &x);
37         int l = 0, r = q.size() - 1;
38         while (l < r) {
39             int mid = l + r + 1 >> 1;
40             if (q[mid].first <= x) l = mid;
41             else r = mid - 1;
42         }
43         if (q[l].first <= x && q[l].second >= x) printf("%d ", q[l].second);    // 存在左端点不超过x的区间,且区间右端点超过x 
44         else printf("%d ", x);
45     }
46     printf("\n");
47 }
48 
49 int main() {
50     int t;
51     scanf("%d", &t);
52     while (t--) {
53         solve();
54     }
55     
56     return 0;
57 }
复制代码

 

参考资料

  Codeforces Round 892 (Div. 2)A-D:https://zhuanlan.zhihu.com/p/649683357

  Codeforces Round #892 (Div. 2) Editorial:https://codeforces.com/blog/entry/119287

posted @   onlyblues  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
Web Analytics
点击右上角即可分享
微信分享提示