标签:contains hdu mini ber case begin multiple out 分享图片
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\n", ans[i]); 48 } 49 } 50 return 0; 51 }
标签:contains hdu mini ber case begin multiple out 分享图片
原文地址:https://www.cnblogs.com/qldabiaoge/p/9356318.html