Naive Operations

 

PS:照着感觉瞎写了一波。记录每个区间的最小值,当a数组加1时,b数组减一,即对应区间的最小值减1,如果最小值变成了0,就暴力寻找那些位置变成0的,并将值重置为a[i]

//#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<vector>
#include<queue>
#include<map>
#include<string>
#include<stack>
#define ll long long
#define P pair<int, int>
#define PP pair<int,pair<int, int>>
#define pb push_back
#define pp pop_back
#define lson root << 1
#define INF (int)2e9 + 7
#define rson root << 1 | 1
#define LINF (unsigned long long int)1e18
#define mem(arry, in) memset(arry, in, sizeof(arry))
using namespace std;

inline void coutSpace() { puts("\n"); }
inline void coutInt(int x) { cout << x << endl; }
inline void coutSpaceInt(int x) { cout << x << " "; }
inline void coutLong(ll x) { cout << x << endl; }
inline void coutSpaceLong(ll x) { cout << x << " "; }
inline void printInt(int x) { printf("%d\n", x); }
inline void printLong(ll x) { printf("%lld\n", x); }
inline void printDouble(double x) { printf("%.7f\n", x); }
inline void readInt(int& x) { scanf("%d", &x); }
inline void readLong(ll& x) { scanf("%lld", &x); }

const int N = 1e5 + 5;

int n, q;
int a[4 * N], lazy[4 * N], Min[4 * N], pos[4 * N], cnt[4 * N];

void Pushup(int root) {
    Min[root] = min(Min[lson] - lazy[lson], Min[rson] - lazy[rson]);
    cnt[root] = cnt[lson] + cnt[rson];
}

void Pushdown(int root) {
    lazy[lson] += lazy[root];
    lazy[rson] += lazy[root];
    lazy[root] = 0;
}

void Build(int l, int r, int root) {
    if(l == r) {
        cnt[root] = 0;
        readInt(Min[root]);
        a[root] = Min[root];
        return;
    }
    int mid = (l + r) >> 1;
    Build(l, mid, lson);
    Build(mid + 1, r, rson);
    Pushup(root);
}

void Find(int l, int r, int root) {
    if(l == r) {
        lazy[root] = 0;
        Min[root] = a[root];
        cnt[root]++;
        return;
    }
    if(lazy[root]) Pushdown(root);
    int mid = (l + r) >> 1;
    if(Min[lson] == lazy[lson]) Find(l, mid, lson);
    if(Min[rson] == lazy[rson]) Find(mid + 1, r, rson);
    Pushup(root);
}

void Update(int l, int r, int root, int L, int R) {
    if(l > R || r < L) return;
    if(L <= l && r <= R) {
        lazy[root]++;
        if(Min[root] == lazy[root]) Find(l, r, root);
        return;
    }
    if(lazy[root]) Pushdown(root);
    int mid = (l + r) >> 1;
    Update(l, mid, lson, L, R);
    Update(mid + 1, r, rson, L, R);
    Pushup(root);
}

int Query(int l, int r, int root, int L, int R) {
    if(l > R || r < L) return 0;
    if(L <= l && r <= R) return cnt[root];
    int mid = (l + r) >> 1;
    int ans = 0;
    ans += Query(l, mid, lson, L, R);
    ans += Query(mid + 1, r, rson, L, R);
    return ans;
}

int main()
{
    while(scanf("%d %d", &n, &q) != EOF) {
        mem(lazy, 0);
        Build(1, n, 1);
        char s[10];
        while(q--) {
            int x, y;
            scanf("%s %d %d", s, &x, &y);
            if(s[0] == 'a') {
                Update(1, n, 1, x, y);
            }
            else {
                printInt(Query(1, n, 1, x, y));
            }
        }
    }
    return 0;
}

 

posted @ 2018-07-30 10:10  天之道,利而不害  阅读(391)  评论(0编辑  收藏  举报