社区讨论
蒟蒻初学树剖10^-114514s,WA on pts 3求调
CF1843F2 Omsk Metro (hard version)参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @loo9517x
- 此快照首次捕获于
- 2023/11/07 19:32 2 年前
- 此快照最后确认于
- 2023/11/07 21:20 2 年前
rt,错误信息
wrong answer expected NO, found YES [1806th token]感谢神犇!!!!!!!
CPP#include <bits/stdc++.h>
#define in inline
#define rint register int
#define r(a) compilerror::runtimerror(a)
#define w(a) compilerror::wronganswer(a)
#define wl(a) compilerror::wronganswer(a),compilerror::pc('\n')
#define ws(a) compilerror::wronganswer(a),compilerror::pc(' ')
using namespace std;
typedef long long ll;
namespace compilerror{
const int pp2=(1<<20)-1;int pp1=-1;
char buf_in[1<<20],buf_out[1<<20],*p1=buf_in,*p2=buf_in;
in void flush(){fwrite(buf_out,1,pp1+1,stdout);pp1=-1;}
in void pc(const char ch){if(pp1==pp2)flush();buf_out[++pp1]=ch;}
in char gc(){return p1==p2&&(p2=(p1=buf_in)+fread(buf_in,1,1<<20,stdin),p1==p2)?EOF:*p1++;}
template <typename t> in void runtimerror(t &x){
char ch=gc();bool f=false;x=0;
for(;!isdigit(ch);ch=gc()) if(ch=='-') f=true;
for(;isdigit(ch);ch=gc()) x=(x<<3)+(x<<1)+(ch^48);
if(f) x=~x+1;
}
template <typename t> in void wronganswer(t x){
if(!x) pc('0');
else{
static char stk[20];int top=0;
if(x<0) pc('-'),x=~x+1;
while(x) stk[top++]=x%10,x/=10;
while(top--) pc(stk[top]^48);
}
}
}
char opt;
int T,n,u,v,w,cnt,newid,tot,num,fa[200010][20],head[200010],a[200010],dep[200010],nid[200010],newn[200010],top[200010],size[200010],son[200010];
struct ques{
int u,v,w;
}q[200010];
struct Edge{
int to,nex;
}edge[200010];
in void add_edge(int from,int to){
edge[++tot]=(Edge){to,head[from]};
head[from]=tot;
}
void dfs1(int id,int fat,int dp){
size[id]=1,fa[id][0]=fat,dep[id]=dp;
for(rint i=1;i<=18;i++){
fa[id][i]=fa[fa[id][i-1]][i-1];
}
for(rint i=head[id];i;i=edge[i].nex){
if(edge[i].to==fat) continue;
dfs1(edge[i].to,id,dp+1);
size[id]+=size[edge[i].to];
if(size[edge[i].to]>size[son[id]]) son[id]=edge[i].to;
}
}
void dfs2(int id,int tp){
nid[id]=++newid,newn[newid]=a[id],top[id]=tp;
if(!son[id]) return;
dfs2(son[id],tp);
for(rint i=head[id];i;i=edge[i].nex){
if(edge[i].to==fa[id][0]||edge[i].to==son[id]) continue;
dfs2(edge[i].to,edge[i].to);
}
}
in int lca(int u,int v){
if(u==v) return u;
if(dep[u]<dep[v]) swap(u,v);
for(rint i=18;i>=0;i--){
if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
}
if(u==v) return u;
for(rint i=18;i>=0;i--){
if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
}
return fa[u][0];
}
struct segment_tree{
int maxid;
struct segment{
int l,r,suml_max,suml_min,sumr_max,sumr_min,sum,maxn,minn;
}tr[800010];
in void pushup(segment &rt,segment l,segment r){
rt.sum=l.sum+r.sum;
rt.suml_max=max(l.suml_max,l.sum+r.suml_max);
rt.suml_min=min(l.suml_min,l.sum+r.suml_min);
rt.sumr_max=max(r.sumr_max,l.sumr_max+r.sum);
rt.sumr_min=min(r.sumr_min,l.sumr_min+r.sum);
rt.maxn=max(l.sumr_max+r.suml_max,max(l.maxn,r.maxn));
rt.minn=min(l.sumr_min+r.suml_min,min(l.minn,r.minn));
}
void build(int id,int l,int r){
maxid=max(maxid,id);
if(l==r){
tr[id]=(segment){l,r,newn[l],newn[l],newn[l],newn[l],newn[l],newn[l],newn[l]};
return;
}
tr[id]=(segment){l,r};
int mid=l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
pushup(tr[id],tr[id<<1],tr[id<<1|1]);
}
segment query(int id,int l,int r){
if(tr[id].l>=l&&tr[id].r<=r) return tr[id];
segment ans={0};
int mid=tr[id].l+tr[id].r>>1;
if(mid>=l) ans=query(id<<1,l,r);
if(mid<r){
segment cache=query(id<<1|1,l,r);
pushup(ans,ans,cache);
}
return ans;
}
in segment query_path(int u,int v){
segment ans1={0},ans2={0};
while(top[u]!=top[v]){
ans2=query(1,nid[top[u]],nid[u]);
pushup(ans1,ans2,ans1);
u=fa[top[u]][0];
}
ans2=query(1,nid[v],nid[u]);
pushup(ans1,ans2,ans1);
return ans1;
}
in bool check(int u,int v,int k){
if(!k) return true;
int lc=lca(u,v),maxn,minn;
segment ans1=query_path(u,lc),ans2=query_path(v,lc);
maxn=max(ans1.maxn,ans2.maxn);
minn=min(ans1.minn,ans2.minn);
if(u!=lc&&v!=lc){
maxn=max(maxn,ans1.suml_max+ans2.suml_max-a[lc]);
minn=min(minn,ans1.suml_min+ans2.suml_min-a[lc]);
}
return k>=minn&&k<=maxn;
}
in void clear(){
for(rint i=1;i<=maxid;i++){
tr[i]={0};
}
maxid=0;
}
}t;
in void clear(){
t.clear();
for(rint i=1;i<=cnt;i++){
head[i]=a[i]=dep[i]=nid[i]=newn[i]=top[i]=size[i]=son[i]=0;
for(rint j=0;j<=18;j++) fa[i][j]=0;
}
for(rint i=1;i<=num;i++){
q[i]={0};
}
for(rint i=1;i<=tot;i++){
edge[i]={0};
}
tot=newid=num=cnt=0,a[++cnt]=1;
}
int main(){
#ifndef ONLINE_JUDGE
(void)!freopen("cin.in","r",stdin);
(void)!freopen("cout.out","w",stdout);
#endif
r(T);
while(T--){
clear();
r(n);
while(n--){
opt=compilerror::gc();
switch(opt){
case '+':
r(u),r(w);
a[++cnt]=w;
add_edge(u,cnt);
break;
case '?':
r(u),r(v),r(w);
q[++num]=(ques){u,v,w};
break;
}
}
dfs1(1,0,1);
dfs2(1,1);
t.build(1,1,cnt);
for(rint i=1;i<=num;i++){
puts(t.check(q[i].u,q[i].v,q[i].w)?"YES":"NO");
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...