社区讨论
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 条回复,欢迎继续交流。
正在加载回复...