社区讨论

分块90pts求助

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lo3hsg40
此快照首次捕获于
2023/10/24 06:51
2 年前
此快照最后确认于
2023/10/24 06:51
2 年前
查看原帖
第六个点 wrong answer 136th line differ - expected: '37053', found: '37052'
总之就是非常奇怪。
CPP
#include <bits/stdc++.h>
#define N 100005
#define i64 long long int
using std::max;
using std::min;
i64 n, m;
i64 a[N], d[N], t[N];
i64 s;
void read(i64 *w) {
    *w = 0;
    char c = getchar();
    while(!isdigit(c))
        c = getchar();
    while(isdigit(c))
        *w = (*w) * 10 + c - '0', c = getchar();
    return;
}
#define at(x) (int)(((x) + s - 1) / s)
#define st(x) (int)(((x) - 1) * s + 1)
#define ed(x) (int)((x) * s)
void init(void) {
    read(&n);
    s = sqrt(n);
    for(int i = 1; i <= n; ++ i)
        read(a + i);
    for(int i = 1; i <= n; ++ i)
        d[at(i)] += a[i], t[at(i)] += a[i] > 1;
    return;
}
void modify(int l, int r) {
    for(int i = l; i <= r; ++ i) {
        if(!t[at(i)])
            i = ed(at(i)) + 1;
        if(a[i] <= 1)
            continue;
        d[at(i)] -= a[i];
        a[i] = (int)sqrt(a[i]);
        d[at(i)] += a[i];
        t[at(i)] -= a[i] <= 1;
    }
    return;
}
i64 query(int l, int r) {
    i64 ans = 0;
    for(int i = l, p = min(ed(at(l)), r); i <= p; ++ i)
        ans += a[i];
    for(int i = at(l) + 1, p = at(r); i < p; ++ i)
        ans += d[i];
    if(at(l) == at(r))
        return ans;
    for(int i = st(at(r)); i <= r; ++ i)
        ans += a[i];
    return ans;
}
int main(void) {
    init();
    for(i64 k, l, r, c, i = 0; i < n; ++ i) {
        read(&k), read(&l), read(&r), read(&c);
        if(l > r)
            std::swap(l, r);
        if(k == 0)
            modify(l, r);
        else
            printf("%lld\n", query(l, r));
    }
    return 0;
}

回复

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

正在加载回复...