| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
据说此题可以用Link Cut Tree 做................附代码#include<iostream>
#include<stdio.h>
#define FOR(i,l,r) for (i=l;i<=r;i++)
#define MAXN 10100
#define MAXM 100100
using namespace std;
int ca,sa,n;
struct Link_Cut_Tree {
int ki[MAXN][2],fa[MAXN];
int pp[MAXN],cir[MAXN];
void clear() {
#define M(a) memset(a,0,sizeof(a))
M(ki);M(fa);M(pp);M(cir);
}
int find_root(int now) {
while (fa[now]) now=fa[now];
return now;
}
void rotate(int now,bool kin) {
int fp=fa[now],kp=ki[now][kin],kkp=ki[ki[now][kin]][kin^1];
fa[now]=kp ;ki[kp ][kin^1 ]=now;
fa[kp ]=fp ;ki[fp ][ki[fp][1]==now]=kp ;
fa[kkp]=now;ki[now][kin ]=kkp;
}
void up(int now) {
int root=find_root(now),i1,i2;
if (root==now) return ;
pp[now]=pp[root];pp[root]=0;
while (fa[now]) {
if (!fa[fa[now]]) {
rotate(fa[now],ki[fa[now]][1]==now);return ;
}
i1=(ki[fa[now] ][1]==now );
i2=(ki[fa[fa[now]]][1]==fa[now]);
if (i1^i2) {
rotate(fa[now] ,i1);rotate(fa[now],i2);
} else {
rotate(fa[fa[now]],i2);rotate(fa[now],i1);
}
}
fa[0]=pp[0]=cir[0]=0;
}
void access(int now) {
for (int pre=0;now;) {
up(now);
fa[ki[now][1]]=0;
pp[ki[now][1]]=now;
ki[now][1]=pre;
fa[pre]=now;
pp[pre]=0;
pre=now;now=pp[now];
}
fa[0]=pp[0]=cir[0]=0;
}
void del(int now) {
int i,j,k;
access(now);up(now);
for (i=now;ki[i][0];i=ki[i][0]) ;
if (cir[i]) {
if (now==i) {
cir[i]=0;return ;
}
access(cir[i]);up(now);
for (j=cir[i];fa[j] && fa[fa[j]];j=fa[j]) ;
if (cir[i]==now || (fa[j]==now && ki[now][1]==j)) {
pp[ki[now][0]]=cir[i];cir[i]=0;
} else {
access(now);up(now);
}
}
fa[ki[now][0]]=0;ki[now][0]=0;
}
void ins(int now,int nex) {
int i,j,k;
access(nex);up(nex);
for (i=now;fa[i] && fa[fa[i]];i=fa[i]) ;
if (now==nex || (fa[i]==nex && ki[nex][0]==i)) {
cir[now]=nex;return ;
}
pp[find_root(now)]=nex;
}
int ring(int now) {
int i,j,k;
access(now);up(now);
for (i=now;ki[i][0];i=ki[i][0]) ;
return cir[i]?9999:i;
}
} LCT;
struct Event {
int t,o,d;
Event(int i1=0,int i2=0,int i3=0):
t(i1),o(i2),d(i3) {}
void update() {
if (d==0) LCT.del(o);
else LCT.ins(o,d);
}
friend bool operator < (Event e1,Event e2) {
return e1.t<e2.t || (e1.t==e2.t && e1.d<e2.d);
}
} ev[MAXM];
void init() {
LCT.clear();n=0;
}
void qsort(int l,int r) {
int i=l,j=r;Event k=ev[(l+r)>>1];
while (i<=j) {
for (;k<ev[i];i++) ;
for (;ev[j]<k;j--) ;
if (i<=j) swap(ev[i++],ev[j--]);
}
if (i<r) qsort(i,r); if (j>l) qsort(l,j);
}
int main() {
int i,j,k,S,L;
printf("CALL FORWARDING OUTPUT\n");
for (scanf("%d",&ca);init(),ca;ca--) {
printf("SYSTEM %d\n",++sa);
while (scanf("%d",&i)!=EOF && i) {
scanf("%d%d%d",&S,&L,&j);
ev[++n]=Event(S ,i,j);
ev[++n]=Event(S+L+1,i,0);
}
qsort(1,n);
while (scanf("%d",&i)!=EOF && i!=9000) {
scanf("%d",&j);
while (n && ev[n].t<=i)
ev[n--].update();
printf("AT %04d CALL TO %04d RINGS %04d\n",i,j,LCT.ring(j));
}
}
printf("END OF OUTPUT\n");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator