社区讨论

Hack点T了,求调

P4145上帝造题的七分钟 2 / 花神游历各国参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lotfybfh
此快照首次捕获于
2023/11/11 10:42
2 年前
此快照最后确认于
2023/11/17 23:06
2 年前
查看原帖
CPP
//
// Created by 96454 on 2023/9/26.
//
#include <bits/stdc++.h>
using namespace std;

#define MAXN 100010
#define int long long
template<typename T> inline void rd(T &x)
{
    int w = 1;x = 0; char s;
    while (!isdigit(s = getchar())) if (s == '-') w = -1;
    while (isdigit(s)) x = (x << 3) + (x << 1), x += s - '0', s = getchar();
    x *= w;
}
template<typename T> inline void we(T x) {
    static int sta[35];
    int top = 0;
    do {
        sta[top++] = x % 10, x /= 10;
    } while (x);
    while (top) putchar(sta[--top] + 48);  // 48 是 '0'
}
struct SGtree{
    int val, tag, l, r;
    #define val(x) tr[x].val
    #define tag(x) tr[x].tag
    #define l(x) tr[x].l
    #define r(x) tr[x].r
}tr[MAXN << 2];
int value[MAXN], n, ans, m;
inline void build(int x, int l, int r){
    l(x) = l, r(x) = r;
    if (l == r)
    {
        val(x) = value[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(x * 2, l, mid);
    build(x * 2 + 1, mid + 1, r);
    val(x) = val(x * 2) + val(x * 2 + 1);
}
inline void change(int x, int l, int r){
    if (l(x) >= l && r(x) <= r)
    {
        tag(x)++;
        return;
    }
    int mid = (l(x) + r(x)) >> 1;
    if (l <= mid) change(x * 2, l, r);
    if (r > mid) change(x * 2 + 1, l, r);
}
inline void query(int x, int l, int r, int tap){
    if (l(x) >= l && r(x) <= r)
    {
        if (tap + tag(x) >= 6)
        {
            ans += (r(x) - l(x) + 1);
            return;
        }
    }
    if (l(x) == r(x))
    {
        int v = val(x);
        for (register int i = 1; i <= tap + tag(x); i++)
        {
            v = sqrt(v);
        }
        ans += v;
        return;
    }
    int mid = (l(x) + r(x)) >> 1;
    if (l <= mid) query(x * 2, l, r, tag(x) + tap);
    if (r > mid) query(x * 2 + 1, l, r, tag(x) + tap);
}
signed main(){
    rd(n);
    for (register int i = 1; i <= n; i++) rd(value[i]);
    build(1, 1, n);
    rd(m);
    for (register int i = 1; i <= m; i++){
        int x;
        rd(x);
        if (x == 1)
        {
           int l, r;
           rd(l);rd(r);
           if (l > r) swap(l, r);
           ans = 0;
           query(1, l, r, 0);
           we(ans);
           puts("");
        }
        else
        {
            int l, r;
            rd(l);rd(r);
            if (l > r) swap(l, r);
            change(1, l, r);
        }
    }
}

回复

0 条回复,欢迎继续交流。

正在加载回复...