社区讨论
20pts球调
P1505[国家集训队] 旅游参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo1rzjyt
- 此快照首次捕获于
- 2023/10/23 02:01 2 年前
- 此快照最后确认于
- 2023/11/03 02:38 2 年前
CPP
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<stack>
#include<queue>
#include<list>
#define int long long
#define ll long long
#define S 10000001
#define inf 2147483647
#define in inline
#define re register int
#define debug putchar('1');
#define ed putchar('\n');
using namespace std;
inline int rd(){
char a=getchar();
int f=1,x=0;
while(a<'0'||a>'9'){
if(a=='-')
f=-1;
a=getchar();
}
while(a>='0'&&a<='9'){
x=(x<<3)+(x<<1)+(long(a^48));
a=getchar();
}
return f*x;
}
void qwqqwq(ll x){
if(x!=0){
qwqqwq(x/10);
putchar(x%10^48);
}
return;
}
in void wt(ll x){
if(x==0){
putchar('0');
return;
}
if(x<0){
x=-x;
putchar('-');
}
qwqqwq(x);
return;
}
in ll max(ll a,ll b){
return a>b?a:b;
}
in ll min(ll a,ll b){
return a>b?b:a;
}
in ll abs(ll a){
return a<0?-a:a;
}
in void swap(ll &a,ll &b){
a^=b;
b^=a;
a^=b;
}
struct edge{
int to,nxt,w;
}edge[S];
int h[S],cnt;
in void add(int u,int v,int w){
edge[++cnt].to=v;
edge[cnt].w=w;
edge[cnt].nxt=h[u];
h[u]=cnt;
return;
}
int dep[S],val[S],v[S],id[S],f[S],si[S],son[S],top[S],tot,u1[S],s1[S];
void dfs1(int u,int fa){
dep[u]=dep[fa]+1;
si[u]=1;
f[u]=fa;
for(re i=h[u];i;i=edge[i].nxt){
int t=edge[i].to;
if(t==fa)
continue;
v[t]=edge[i].w;
dfs1(t,u);
si[u]+=si[t];
if(si[t]>si[son[u]])
son[u]=t;
}
return;
}
void dfs2(int u,int tp){
top[u]=tp;
id[u]=++tot;
val[tot]=v[u];
if(son[u]==0)
return;
dfs2(son[u],tp);
for(re i=h[u];i;i=edge[i].nxt){
int t=edge[i].to;
if(t==son[u]||t==f[u])
continue;
dfs2(t,t);
}
return;
}
struct node{
int l,r,w,min,max,lz;
}t[S];
void pu(int i){
t[i].w=t[i<<1].w+t[i<<1|1].w;
t[i].max=max(t[i<<1].max,t[i<<1|1].max);
t[i].min=min(t[i<<1].min,t[i<<1|1].min);
return;
}
void build(int i,int l,int r){
t[i].l=l;
t[i].r=r;
t[i].min=inf;
t[i].max=-inf;
if(l==r){
t[i].w=t[i].max=t[i].min=val[l];
return;
}
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
pu(i);
return;
}
void pd(int i){
if(t[i].lz==0)
return;
t[i<<1].lz^=1;
t[i<<1|1].lz^=1;
t[i<<1].w=-t[i<<1].w;
t[i<<1|1].w=-t[i<<1|1].w;
t[i<<1].max=-t[i<<1].max;
t[i<<1].min=-t[i<<1].min;
t[i<<1|1].min=-t[i<<1|1].min;
t[i<<1|1].max=-t[i<<1|1].max;
swap(t[i<<1].min,t[i<<1].max);
swap(t[i<<1|1].min,t[i<<1|1].max);
t[i].lz=0;
return;
}
void Up(int i,int x,int w){
if(t[i].l==t[i].r){
t[i].w=t[i].max=t[i].min=w;
return;
}
pd(i);
if(t[i<<1].r>=x)
Up(i<<1,x,w);
else
Up(i<<1|1,x,w);
pu(i);
return;
}
int qu1(int i,int l,int r){
if(t[i].l>=l&&t[i].r<=r){
return t[i].w;
}
pd(i);
int ans=0;
if(t[i<<1].r>=l)
ans+=qu1(i<<1,l,r);
if(t[i<<1|1].l<=r)
ans+=qu1(i<<1|1,l,r);
return ans;
}
int qu2(int i,int l,int r){
if(t[i].l>=l&&t[i].r<=r){
return t[i].max;
}
pd(i);
int ans=-inf;
if(t[i<<1].r>=l)
ans=max(ans,qu2(i<<1,l,r));
if(t[i<<1|1].l<=r)
ans=max(ans,qu2(i<<1|1,l,r));
return ans;
}
int qu3(int i,int l,int r){
if(t[i].l>=l&&t[i].r<=r){
return t[i].min;
}
pd(i);
int ans=inf;
if(t[i<<1].r>=l)
ans=min(ans,qu3(i<<1,l,r));
if(t[i<<1|1].l<=r)
ans=min(ans,qu3(i<<1|1,l,r));
return ans;
}
void up(int i,int l,int r){
if(t[i].l>=l&&t[i].r<=r){
t[i].w=-t[i].w;
t[i].min=-t[i].min;
t[i].max=-t[i].max;
t[i].lz^=1;
swap(t[i].min,t[i].max);
return;
}
pd(i);
if(t[i<<1].r>=l)
up(i<<1,l,r);
if(t[i<<1|1].l<=r)
up(i<<1|1,l,r);
pu(i);
return;
}
int Qu1(int l,int r){
int ans=0;
while(top[l]!=top[r]){
if(dep[top[l]]<dep[top[r]])
swap(l,r);
ans+=qu1(1,id[top[l]],id[l]);
l=f[top[l]];
}
if(dep[l]>dep[r])
swap(l,r);
ans+=qu1(1,id[l]+1,r);
return ans;
}
int Qu2(int l,int r){
int ans=-inf;
while(top[l]!=top[r]){
if(dep[top[l]]<dep[top[r]])
swap(l,r);
ans=max(ans,qu2(1,id[top[l]],id[l]));
l=f[top[l]];
}
if(dep[l]>dep[r])
swap(l,r);
ans=max(ans,qu2(1,id[l]+1,id[r]));
return ans;
}
int Qu3(int l,int r){
int ans=inf;
while(top[l]!=top[r]){
if(dep[top[l]]<dep[top[r]])
swap(l,r);
ans=min(ans,qu3(1,id[top[l]],id[l]));
l=f[top[l]];
}
if(dep[l]>dep[r])
swap(l,r);
ans=min(ans,qu3(1,id[l]+1,id[r]));
return ans;
}
void up1(int l,int r){
while(top[l]!=top[r]){
if(dep[top[l]]<dep[top[r]])
swap(l,r);
up(1,id[top[l]],id[l]);
l=f[top[l]];
}
if(dep[l]>dep[r])
swap(l,r);
up(1,id[l]+1,r);
return;
}
signed main(){
int n=rd();
for(re i=1;i<n;++i){
int u=rd()+1,v=rd()+1,w=rd();
u1[i]=u;
s1[i]=v;
add(u,v,w);
add(v,u,w);
}
int m=rd()+1;
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
while(--m){
string str;
cin>>str;
int l=rd()+1,r=rd()+1;
if(str[0]=='C'){
--r;
--l;
if(dep[u1[l]]<dep[s1[l]])
swap(u1[l],s1[l]);
Up(1,id[u1[l]],r);
}
if(str[0]=='N')
up1(l,r);
if(str[0]=='S'){
wt(Qu1(l,r));
ed
}
if(str[1]=='A'){
wt(Qu2(l,r));
ed
}
if(str[1]=='I'){
wt(Qu3(l,r));
ed
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...