• hihocoder1079 离散化


    思路:
    线段树 + 离散化。

    测试用例:

    3 10

    1 10

    1 3

    6 10

    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef pair<int, int> pii;
     4 const int N = 200005;
     5 int tree[N << 2], lazy[N << 2], a[N];
     6 
     7 void init()
     8 {
     9     memset(tree, 0, sizeof tree);
    10     memset(lazy, 0, sizeof lazy);
    11 }
    12 
    13 void pushdown(int num, int cl, int cr)
    14 {
    15     if (!lazy[num]) return;
    16     tree[num << 1] = lazy[num] * cl;
    17     tree[num << 1 | 1] = lazy[num] * cr;
    18     lazy[num << 1] = lazy[num];
    19     lazy[num << 1 | 1] = lazy[num];
    20     lazy[num] = 0;
    21 }
    22 
    23 void update(int num, int l, int r, int x, int y, int p)
    24 {
    25     if (x <= l && y >= r) { tree[num] = (r - l + 1) * p; lazy[num] = p; return; }
    26     int m = l + r >> 1;
    27     pushdown(num, m - l + 1, r - m);
    28     if (x <= m) update(num << 1, l, m, x, y, p);
    29     if (y >= m + 1) update(num << 1 | 1, m + 1, r, x, y, p);
    30     tree[num] = tree[num << 1] + tree[num << 1 | 1];
    31 }
    32 
    33 int query(int num, int l, int r, int x, int y)
    34 {
    35     if (x <= l && y >= r) return tree[num];
    36     int m = l + r >> 1;
    37     pushdown(num, m - l + 1, r - m);
    38     int ans = 0;
    39     if (x <= m) ans += query(num << 1, l, m, x, y);
    40     if (y >= m + 1) ans += query(num << 1 | 1, m + 1, r, x, y);
    41     return ans;
    42 }
    43 
    44 int main()
    45 {
    46     ios::sync_with_stdio(false);
    47     init();
    48     int n, l, x, y;
    49     cin >> n >> l;
    50     vector<pii> q;
    51     vector<int> v;
    52     for (int i = 0; i < n; i++)
    53     {
    54         cin >> x >> y;
    55         q.push_back(pii(x, y));
    56         v.push_back(x); v.push_back(y);
    57     }
    58     sort(v.begin(), v.end());
    59     v.erase(unique(v.begin(), v.end()), v.end());
    60     map<int, int> mp;
    61     for (int i = 0; i < v.size(); i++) mp[v[i]] = 2 * i + 1;
    62     int ans = 0, m = v.size() * 2;
    63     for (int i = n - 1; i >= 0; i--)
    64     {
    65         int x = mp[q[i].first], y = mp[q[i].second];
    66         if (query(1, 1, m, x, y) < y - x + 1) ans++;
    67         update(1, 1, m, x, y, 1);
    68     }
    69     cout << ans << endl;
    70     return 0;
    71 }
  • 相关阅读:
    淘淘整理相关链接
    Ajax跨域请求
    tomcat启动(六)Catalina分析-StandardServer.start()
    Tomcat中组件的生命周期管理公共接口Lifecycle
    Catalina.createDigester方法详细理解
    SpringMVC访问WEB-INF下的jsp的方法
    tomcat启动(五)Catalina分析-service.init
    tomcat启动(四)Catalina分析-server的init()方法
    tomcat启动(三)Catalina分析-load方法分析
    tomcat启动(三)Catalina简要分析
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9168898.html
Copyright © 2020-2023  润新知