zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    在source insight中阅读Python代码
    修改linux命令行提示符
    gcc链接程序时出现undefined reference to""错误
    [转]init.d解析
    [转]Linux中find常见用法示例
    Linux的网卡由eth0变成了eth1,如何修复?
    测试使用Windows Live Writer
    黑盒测试
    白盒测试技术(二)
    白盒测试技术(一)
  • 原文地址:https://www.cnblogs.com/qldabiaoge/p/9356318.html
Copyright © 2011-2022 走看看