2 条题解

  • 0
    @ 2025-10-8 16:49:31

    C41 线段树+差分 P2184 贪婪大陆

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    #define ls u << 1
    #define rs u << 1 | 1
    const int N = 1e6+10;
    int n, m;
    struct tree
    {
      int l, r, sum[2];
    } tr[N * 4];
    // sum[0]:区间起点数, sum[1]:区间终点数
    
    void pushup(int u, int k)// 上传
    { 
      tr[ u].sum[k] = tr[ls].sum[k] + tr[rs].sum[k];
    }
    void build(int u, int l, int r)// 建树
    { 
      tr[ u] = {l, r, 0, 0};
      if (l == r)
        return;
      int mid = (l + r) >> 1;
      build(ls, l, mid);
      build(rs, mid + 1, r);
    }
    void change(int u, int x, int k)// 点修
    { 
      if (tr[ u].l == tr[ u].r)
      {
        tr[ u].sum[k]++;
        return;
      }
      if (x <= tr[ls].r)
        change(ls, x, k);
      else
        change(rs, x, k);
      pushup(u, k);
    }
    int query(int u, int x, int y, int k)// 区查
    { 
      if (x > tr[ u].r || y < tr[ u].l)
        return 0;
      if (x <= tr[ u].l && tr[ u].r <= y)
        return tr[ u].sum[k];
      return query(ls, x, y, k) + query(rs, x, y, k);
    }
    int main()
    {
      scanf("%d", &n);
      build(1, 1, 1e6);
      for (int i = 1,op, l, r; i <= n; i++)
      {
        scanf("%d%d%d", &op, &l, &r);
        if (op == 1)
          change(1, l, 0), change(1, r, 1);
        else
          printf("%d\n", query(1, 1, r, 0) - query(1, 1, l - 1, 1));
      }
      return 0;
    }
    
    • 0
      @ 2025-10-8 16:49:21

      C41 线段树+差分 P2184 贪婪大陆

      #include <iostream>
      #include <cstring>
      #include <algorithm>
      using namespace std;

      #define ls u << 1 #define rs u << 1 | 1 const int N = 1e6+10; int n, m; struct tree { int l, r, sum[2]; } tr[N * 4]; // sum[0]:区间起点数, sum[1]:区间终点数

      void pushup(int u, int k)// 上传 { tr[ u].sum[k] = tr[ls].sum[k] + tr[rs].sum[k]; } void build(int u, int l, int r)// 建树 { tr[ u] = {l, r, 0, 0}; if (l == r) return; int mid = (l + r) >> 1; build(ls, l, mid); build(rs, mid + 1, r); } void change(int u, int x, int k)// 点修 { if (tr[ u].l == tr[ u].r) { tr[ u].sum[k]++; return; } if (x <= tr[ls].r) change(ls, x, k); else change(rs, x, k); pushup(u, k); } int query(int u, int x, int y, int k)// 区查 { if (x > tr[ u].r || y < tr[ u].l) return 0; if (x <= tr[ u].l && tr[ u].r <= y) return tr[ u].sum[k]; return query(ls, x, y, k) + query(rs, x, y, k); } int main() { scanf("%d", &n); build(1, 1, 1e6); for (int i = 1,op, l, r; i <= n; i++) { scanf("%d%d%d", &op, &l, &r); if (op == 1) change(1, l, 0), change(1, r, 1); else printf("%d\n", query(1, 1, r, 0) - query(1, 1, l - 1, 1)); } return 0; }</pre>

      • 1

      C41【线段树+差分】一维区间修改+区间询问颜色种数2️⃣[贪婪大陆(改)]

      信息

      ID
      326
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      135
      已通过
      40
      上传者