zoukankan      html  css  js  c++  java
  • 牛客OI周赛6-提高组 B 践踏

    践踏

    思路:

    如果k不为0, 那么就是对k取模意义下的区间更新, 单点查询

    否则, 就是普通的区间更新, 单点查询

    代码:

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #pragma GCC optimize(4)
    #include<bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    #define pi acos(-1.0)
    #define LL long long
    //#define mp make_pair
    #define pb push_back
    #define ls rt<<1, l, m
    #define rs rt<<1|1, m+1, r
    #define ULL unsigned LL
    #define pll pair<LL, LL>
    #define pli pair<LL, int>
    #define pii pair<int, int>
    #define piii pair<pii, int>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    #define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
    //head
    
    const int N = 2e4 + 10;
    int bit[N], up;
    vector<int> vc;
    piii a[N];
    void add(int x, int a) {
        while(x <= up) bit[x] += a, x += x&-x;
    }
    int sum(int x) {
        int res = 0;
        while(x) res += bit[x], x -= x&-x;
        return res;
    }
    int main() {
        int n, k, op, l, r;
        scanf("%d %d", &n, &k);
        if(n == 0) return 0*puts("fafa");
        if(k) {
            up = k;
            for (int i = 1; i <= n; i++) {
                scanf("%d %d", &op, &l);
                if(op == 1) {
                    scanf("%d", &r);
                    if(r - l + 1 >= k) {
                        add(1, 1), add(k+1, -1);
                        continue;
                    }
                    (l %= k) += 1;
                    (r %= k) += 1;
                    if(l <= r) add(l, 1), add(r+1, -1);
                    else add(1, 1), add(r+1, -1), add(l, 1), add(k+1, -1);
                }
                else if(op == 2) {
                    scanf("%d", &r);
                    if(r - l + 1 >= k) {
                        add(1, -1), add(k+1, 1);
                        continue;
                    }
                    (l %= k) += 1;
                    (r %= k) += 1;
                    if(l <= r) add(l, -1), add(r+1, 1);
                    else add(1, -1), add(r+1, 1), add(l, -1), add(k+1, 1);
                }
                else {
                    printf("%d
    ", sum(l%k + 1));
                }
            }
        }
        else {
            up = 2*n;
            for (int i = 1; i <= n; i++) {
                scanf("%d %d", &a[i].se, &a[i].fi.fi);
                vc.pb(a[i].fi.fi);
                if(a[i].se <= 2) {
                    scanf("%d", &a[i].fi.se);
                    vc.pb(a[i].fi.se);
                }
            }
            sort(vc.begin(), vc.end());
            vc.erase(unique(vc.begin(), vc.end()), vc.end());
            for (int i = 1; i <= n; i++) {
                if(a[i].se == 1) {
                    l = lower_bound(vc.begin(), vc.end(), a[i].fi.fi) - vc.begin() + 1;
                    r = lower_bound(vc.begin(), vc.end(), a[i].fi.se) - vc.begin() + 1;
                    add(l, 1);
                    add(r+1, -1);
                }
                else if(a[i].se == 2) {
                    l = lower_bound(vc.begin(), vc.end(), a[i].fi.fi) - vc.begin() + 1;
                    r = lower_bound(vc.begin(), vc.end(), a[i].fi.se) - vc.begin() + 1;
                    add(l, -1);
                    add(r+1, 1);
                }
                else {
                    int x = lower_bound(vc.begin(), vc.end(), a[i].fi.fi) - vc.begin() + 1;
                    printf("%d
    ", sum(x));
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    phpstudy apache无法启动的解决办法
    Windows server 2008 快速搭建域环境
    使用netsh来进行端口转发
    基于docker构建测试环境
    [Leetcode] Linked List Cycle
    Hyper-V下安装Ossim系统
    Windows应用替代方案接龙
    图解CISCO 3550忘记密码解决方法
    硬件代理解决用户上网问题
    图->存储结构->数组表示法(邻接矩阵)
  • 原文地址:https://www.cnblogs.com/widsom/p/9990384.html
Copyright © 2011-2022 走看看