这题我写+调了一晚上……代码能力太差
首先忘了LCT怎么维护生成树,看了半天以前的代码
然后写了1.5h。。然后过不了样例
调试
调试
调试
呀!原来这里写错了!改!
样例还是不对……
调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试
Splay写错了!改!
样例过了!
提交,AC了!
真心写不动题解了……Claris题解
现在才真正感受到wzf AHOI2016Day1考场写12k+代码AK的可怕……我写调了将近3h,然而这代码4k不到……
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=200005,INF=2100000000;
int n,m,T,cnt,in[N],on[N];
struct Line{int v;Line *next;Line(int ux=0){v=ux;next=NULL;}}*Sline[N],*Eline[N];
void AddLineS(int u,int v){Line *x=new Line(v);x->next=Sline[u];Sline[u]=x;}
void AddLineE(int u,int v){Line *x=new Line(v);x->next=Eline[u];Eline[u]=x;}
struct Edge{
int u,v,t;
}e[N];
struct Node{
int v,rev,sum,id;
Node *ch[2],*fa,*mne;
Node(){}
Node(int vx,int vy);
void Pushdown();
void Pushup();
}*tree[2*N],*Null;
Node::Node(int val,int vy){
v=val;
id=vy;
sum=id>n;
rev=0;
ch[0]=ch[1]=fa=Null;
mne=this;
}
void Node::Pushdown(){
if(rev){
rev=0;
if(ch[0]!=Null)ch[0]->rev^=1;
if(ch[1]!=Null)ch[1]->rev^=1;
swap(ch[0]->ch[0],ch[0]->ch[1]);
swap(ch[1]->ch[0],ch[1]->ch[1]);
}
}
void Node::Pushup(){
mne=this;
sum=id>n;
if(ch[0]!=Null){if(mne->v>ch[0]->mne->v)mne=ch[0]->mne;sum+=ch[0]->sum;}
if(ch[1]!=Null){if(mne->v>ch[1]->mne->v)mne=ch[1]->mne;sum+=ch[1]->sum;}
}
bool Notroot(Node *x){return x->fa->ch[0]==x || x->fa->ch[1]==x;}
void Prepare(Node *x){if(Notroot(x))Prepare(x->fa);x->Pushdown();}
Node *GetNull(){Node *p=new Node(INF,0);p->v=INF;p->id=p->sum=p->rev=0;p->ch[0]=p->ch[1]=p->fa=p->mne=p;return p;}
void Rotate(Node *x,int kind){
Node *y=x->fa,*z=y->fa;
y->ch[!kind]=x->ch[kind];
if(x->ch[kind]!=Null)x->ch[kind]->fa=y;
x->fa=z;
if(Notroot(y))z->ch[z->ch[1]==y]=x;
y->fa=x;
x->ch[kind]=y;
y->Pushup();
x->Pushup();
}
void Splay(Node *x){
Prepare(x);
while(Notroot(x)){
Node *y=x->fa,*z=y->fa;
if(!Notroot(y))Rotate(x,y->ch[0]==x);
else {
if(y->ch[0]==x && z->ch[0]==y){Rotate(y,1);Rotate(x,1);}
else if(y->ch[0]==x && z->ch[1]==y){Rotate(x,1);Rotate(x,0);}
else if(y->ch[1]==x && z->ch[0]==y){Rotate(x,0);Rotate(x,1);}
else {Rotate(y,0);Rotate(x,0);}
}
}
}
void Access(Node *x){for(Node *y=Null;x!=Null;y=x,x=x->fa){Splay(x);x->ch[1]=y;x->Pushup();}}
void Makeroot(Node *x){Access(x);Splay(x);x->rev^=1;swap(x->ch[0],x->ch[1]);}
void Link(Node *x,Node *y){Makeroot(x);x->fa=y;}
void Cut(Node *x,Node *y){Makeroot(x);Access(y);Splay(y);if(y->ch[0]==x){y->ch[0]=Null;x->fa=Null;}}
Node *Find(Node *x){Access(x);Splay(x);while(x->ch[0]!=Null)x=x->ch[0];return x;}
Node *ToLct(int x){return tree[x];}
void Add(int id){
int u=e[id].u,v=e[id].v;
if(u==v){cnt++;in[id]=1;return;}
if(Find(ToLct(u))!=Find(ToLct(v))){on[id]=1;Link(ToLct(u),ToLct(id+n));Link(ToLct(v),ToLct(id+n));}
else {
Makeroot(ToLct(u));
Access(ToLct(v));
Splay(ToLct(v));
int idx=ToLct(v)->mne->id-n;
if(e[idx].t<e[id].t){
if(ToLct(v)->sum&1^1){in[idx]=1;cnt++;}
Cut(ToLct(e[idx].u),ToLct(idx+n));Cut(ToLct(e[idx].v),ToLct(idx+n));
Link(ToLct(u),ToLct(id+n));Link(ToLct(v),ToLct(id+n));
on[idx]=0;on[id]=1;
}
else if(ToLct(v)->sum&1^1){in[id]=1;cnt++;}
}
}
void Del(int id){
if(in[id]){in[id]=0;cnt--;}else if(on[id]){Cut(ToLct(e[id].u),ToLct(id+n));Cut(ToLct(e[id].v),ToLct(id+n));}
}
int main(){
freopen("4025.in","r",stdin);
freopen("4025.out","w",stdout);
scanf("%d %d %d",&n,&m,&T);
Null=GetNull();
for(int i=1;i<=n;i++)tree[i]=new Node(INF,i);
for(int i=1;i<=m;i++){
int x;
scanf("%d %d %d %d",&e[i].u,&e[i].v,&x,&e[i].t);
AddLineS(x,i);
AddLineE(e[i].t,i);
tree[i+n]=new Node(e[i].t,i+n);
}
for(int i=0;i<T;i++){
for(Line *j=Sline[i];j!=NULL;j=j->next)Add(j->v);
for(Line *j=Eline[i];j!=NULL;j=j->next)Del(j->v);
puts(cnt?"No":"Yes");
}
return 0;
}