HDU多校(Distinct Values)

Problem Description
Chiaki has an array of n positive integers. You are told some facts about the array: for every two elements ai and aj in the subarray al..r (li<jr ), aiaj holds.
Chiaki would like to find a lexicographically minimal array which meets the facts.
 
Input
There are multiple test cases. The first line of input contains an integer T , indicating the number of test cases. For each test case:

The first line contains two integers n and m (1n,m105 ) -- the length of the array and the number of facts. Each of the next m lines contains two integers li and ri (1lirin ).

It is guaranteed that neither the sum of all n nor the sum of all m exceeds 106 .
 
Output
For each test case, output n integers denoting the lexicographically minimal array. Integers should be separated by a single space, and no extra spaces are allowed at the end of lines.
 
Sample Input
3 2 1 1 2 4 2 1 2 3 4 5 2 1 3 2 4
 
Sample Output
1 2 1 2 1 2 1 2 3 1 1
 
这回的航电多校有多个签到题 好评 
 
  这题就用L,R 两个指针维护这个ans序列
 

while(L < qu[i].l) {
     st.insert(ans[L]);
     L++;
}

这些值可以重新插入

while(R < qu[i].r) {
if (R < qu[i].l-1) R++;
else {
       R++;
      ans[R] = *st.begin();
      st.erase(st.begin());
      }
}

这个其实类似于莫队的区间维护

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e6 + 10;
 4 int t, n, m, ans[maxn];
 5 struct node {
 6     int l, r, flag;
 7 } qu[maxn];
 8 int cmp(node a, node b) {
 9     if (a.l == b.l) return a.r < b.r;
10     return a.l < b.l;
11 }
12 int main() {
13     scanf("%d", &t);
14     while(t--) {
15         scanf("%d%d", &n, &m);
16         for (int i = 0 ; i < m ; i++) {
17             scanf("%d%d", &qu[i].l, &qu[i].r);
18             qu[i].flag = 0;
19         }
20         sort(qu, qu + m, cmp);
21         set<int>st;
22         for (int i = 1 ; i <= n ; i++) {
23             st.insert(i);
24             ans[i] = 1;
25         }
26         for (int i = qu[0].l ; i <= qu[0].r ; i++) {
27             ans[i] = *st.begin();
28             st.erase(st.begin());
29         }
30         int L = qu[0].l, R = qu[0].r;
31         for (int i = 1 ; i < m ; i++) {
32             while(L < qu[i].l) {
33                 st.insert(ans[L]);
34                 L++;
35             }
36             while(R < qu[i].r) {
37                 if (R < qu[i].l-1) R++;
38                 else {
39                     R++;
40                     ans[R] = *st.begin();
41                     st.erase(st.begin());
42                 }
43             }
44         }
45         for (int i = 1 ; i <= n ; i++) {
46             if (i != n)  printf("%d ", ans[i]);
47             else printf("%d
", ans[i]);
48         }
49     }
50     return 0;
51 }
原文地址:https://www.cnblogs.com/qldabiaoge/p/9356318.html