zoukankan      html  css  js  c++  java
  • P2184 贪婪大陆

    原题链接

    • 题意:就是多组询问,和多组操作,操作只有一种,就是在 (l)(r) 加上新的地雷,询问是问在 (l)(r) 一共有多少种地雷。
    • 题解:这题应该是数据结构的一个经典套路,就是记录 (l)(r) 的位置,在单点 (l)(r)(a_{l}data1+1)(a_{r}data2+1) 操作,然后每次问区间 (x, y) 就是代表着问 ([1, x-1])(sum_{data2})([1, y])(sum_{data1}),然后答案是 (sum_{data2} - sum_{data1}) 显然感性理解就可以。
    • 代码:
    #include <cstdio>
    #include <iostream>
    #include <queue>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    #include <cmath>
    #include <map>
    using namespace std;
    typedef long long ll;
    const ll inf = 0x3f3f3f3f;
    const ll N = 1e5 + 1;
    int n;
    struct segment_Tree{
        struct node {
            int l, r,L, R, data1, data2;
        }tr[N << 2];
        void pushup(int p) {
            tr[p].data1 = tr[tr[p].l].data1 + tr[tr[p].r].data1;
            tr[p].data2 = tr[tr[p].r].data2 + tr[tr[p].l].data2;
        }
        inline void build(int l, int r, int p) {
            tr[p].L = l, tr[p].R = r;
            tr[p].l = p << 1;
            tr[p].r = p << 1 | 1;
            if (l == r) {return;}
            int mid = (l + r)  >> 1;
            build(l, mid, tr[p].l);
            build(mid +1, r, tr[p].r);
            pushup(p);
        }
        inline void add(int l, int r, int p, int op) {
            if (tr[p].L >= l && tr[p].R <= r) {
                if (op==1)tr[p].data1++;
                else tr[p].data2++;
                return;
            }
            if (tr[tr[p].l].R >= l)add(l, r, tr[p].l, op);
            if (tr[tr[p].r].L <= r)add(l, r, tr[p].r, op);
            pushup(p);
        }
        inline int ask(int l, int r, int p, int op) {
            if (tr[p].L >= l && tr[p].R <= r) {
                if (op == 1)
                return tr[p].data1;
                else return tr[p].data2;
            }
            int ret = 0;
            if (tr[tr[p].l].R >= l)ret += ask(l, r, tr[p].l, op);
            if (tr[tr[p].r].L <= r)ret += ask(l, r, tr[p].r, op);
            return ret;
        }
    }T;
    signed main() {
        int n, m;
        scanf("%d%d", &n, &m);
        T.build(1, n, 1);
        while (m--) {
            int op, l, r;
            scanf("%d%d%d", &op, &l, &r);
            if (op == 1) {
                T.add(l, l, 1, 1);
                T.add(r, r, 1, 2);
            } else {
                printf("%d
    ", T.ask(1, r, 1, 1) - T.ask(1, l-1, 1, 2));
            }
        }
    }
    
    
  • 相关阅读:
    MySQL InnoDB事务隔离级别脏读、可重复读、幻读
    数据结构与算法-Python/C
    Go语言 转至Nick老师博客
    短信验证功能、邮箱验证功能
    psutil模块
    简单邮件传输协议SMTP
    CSS3主要的几个样式笔记
    cURL的几个经典实例
    Socket进程通信机制
    对PDO的认识
  • 原文地址:https://www.cnblogs.com/Xiao-yan/p/14693802.html
Copyright © 2011-2022 走看看