社区讨论

dalao们,就我

灌水区参与者 4已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@m4tpx2td
此快照首次捕获于
2024/12/18 17:56
去年
此快照最后确认于
2024/12/18 21:23
去年
查看原帖
怎么办啊dalao们,我只是个蒟蒻,今天打开P1001,做了好久都做不出来,,每次我无论输入什么数字,电脑都弹出这个东西,dalao们快救救我,我的电脑是坏了吗,该怎么办啊!!我可以给你们一个关注,救救我吧,,,
C
#include <bits/stdc++.h>
using namespace std;
int num[100000], rev[100000], tag[100000], sum[100000], tre[100000][2], fa[100000], val[100000];
int n, m, rt, x;
void push_up(int x)
{
    num[x] = num[tre[x][0]] + num[tre[x][1]] + 1;
    sum[x] = sum[tre[x][1]] + sum[tre[x][0]] + val[x];
}
void push_down(int x)
{
    if(rev[x]){
        swap(tre[x][0], tre[x][1]);
        if(tre[x][1]) rev[tre[x][1]] ^= 1;
        if(tre[x][0]) rev[tre[x][0]] ^= 1;
        rev[x] = 0;
    }
    if(tag[x]){
        if(tre[x][1]) tag[tre[x][1]] += tag[x], sum[tre[x][1]] += tag[x];
        if(tre[x][0]) tag[tre[x][0]] += tag[x], sum[tre[x][0]] += tag[x];
        tag[x] = 0;
    }
}
void rotate(int x, int &k)
{
    int y = fa[x], z = fa[fa[x]];
    int kind = tre[y][1] == x;
    if(y == k) k = x;
    else tre[z][tre[z][0]==y] = x;
    fa[x] = z; fa[y] = x; fa[tre[x][!kind]] = y;
    tre[y][kind] = tre[x][!kind]; tre[x][!kind] = y;
    push_up(y); push_up(x);
}
int k_th(int x, int k)
{
    push_down(x);
    int r = num[tre[x][0]]+1;
    if(k == r) return x;
    if(k < r) return k_th(tre[x][0], k);
    else return k_th(tre[x][1], k-r);
}
void splay(int x, int &k)
{
    while(x != k){
        int y = fa[x], z = fa[fa[x]];
        if(y != k) if(tre[y][1] == x ^ tre[z][1] == y) rotate(x, k);
        else rotate(y, k);
        rotate(x, k);
    }
}
void split(int ll,int rr)
{
    int x = k_th(rt, ll), y = k_th(rt, rr+2);
    splay(x, rt); splay(y, tre[rt][1]);
}
void rever(int ll,int rr)
{
    split(ll, rr);
    rev[tre[tre[rt][1]][0]] ^= 1;
}
void add(int ll,int rr, int v)
{
    split(ll, rr);
    tag[tre[tre[rt][1]][0]] += v;
    val[tre[tre[rt][1]][0]] += v;
    push_up(tre[tre[rt][1]][0]);
}
int build(int ll,int rr, int f)
{
    if(ll > rr) return 0;
    if(ll == rr){
        fa[ll] = f;
        num[ll] = 1;
        return ll;
    }
    int mid = ll + rr >> 1;
    tre[mid][0] = build(ll, mid-1, mid);
    tre[mid][1] = build(mid+1, rr, mid);
    fa[mid] = f;
    push_up(mid);
    return mid;
}
int asksum(int ll,int rr)
{
    split(ll, rr);
    return sum[tre[tre[rt][1]][0]];
}
int main(){
    n = 2;
    rt = build(1, n+2, 0);
    for(int i = 1; i <= n; i++){
        scanf("%d", &x);
        add(i, i, x);
    }
    rever(1, n);
    printf("%d\n", asksum(1, n));
    return 0;
}

回复

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

正在加载回复...