bzoj2262: 平行宇宙与虫洞

Description

量子力学指出,宇宙并非只有一种形态。 
根据量子理论,一件事件发生之后可以产生不同的后果,而所有可能的后果都会形成自己的宇宙。 
我们可以把一个宇宙看成一个时间轴,虫洞可以看成不同宇宙的不同时间之间的跳跃。虫洞非常的不稳定,存在时间只有一瞬间。 
如果存在虫洞事件(U1,t1,U2,t2)那么在宇宙U1的t1时间和宇宙U2的t2时间会被连接,此时就会发生时空跳跃现象。 
你可以认为:同一个宇宙同一个时刻最多只存在一个虫洞事件。 
为了研究虫洞的性质,科学家向宇宙深处发射了虫洞探测器。 
该探测器会检测到自己存在的宇宙中的虫洞事件,并且一旦检测到虫洞事件就一定会进行跳跃。 
由于科学家并不确定虫洞事件的具体位置时间,所以暂时用电脑模拟很多平行宇宙以及虫洞事件。 
你将被告之探测器被放出时所在的宇宙名称和时间。 
你需要处理以下信息: 
1. “ADD U1 t1 U2 t2” 表示在模拟中加入一个虫洞事件(U1,t1,U2,t2),其中U1和U2是字符串,t1和t2是32位非负整数 
2. “DEL U1 t1 U2 t2” 表示删除之前加入过的一个虫洞事件,保证该事件之前被ADD过。 
3. “QUERY” 表示询问探测器经过足够久的时间后会落入哪个宇宙,输出宇宙名称。如果答案不确定,请输出“*”

Input

第一行: U0 t0 表示探测器发射的地点和时间。保证该时刻不存在虫洞事件。 
第二行: 正整数 Q 表示操作数 
接下来 Q 行: 2种操作,如描述,ADD或ASK。无多余字符。

Output

按照输入顺序,回答每一个ASK操作,直接输出宇宙名称或者“*”,每个回答占一行。

将每个有事件的时刻建一个点表示,每个点有且只有一个后继,构成基环内向树森林,查询就是查环上是否同色,如果是的话输出颜色,可用lct维护

#include<bits/stdc++.h>
int _(){
    int x=0,f=1,c=getchar();
    while(c<48)c==‘-‘?f=-1:0,c=getchar();
    while(c>47)x=x*10+c-48,c=getchar();
    return x*f;
}
void _(char*s){
    scanf("%s",s);
}
char ss[1007][23],s[23];
int nx[21111][27],ptr=1,st1,st2,idp=0,qs[210007][5],qp,ids[1007];
std::vector<int>e[1007];
struct node{
    node*c[2],*f,*ff;
    int id,ida;
    bool nrt(){return this==f->c[0]||this==f->c[1];}
    void up();
}ns[410007],*nil=ns;
void node::up(){
    ida=(c[0]!=nil&&c[0]->ida!=id||c[1]!=nil&&c[1]->ida!=id)?0:id;
}
void rot(node*w){
    node*f=w->f,*g=f->f;
    int d=f->c[1]==w;
    if(f->nrt())g->c[g->c[1]==f]=w;
    w->f=g;
    (f->c[d]=w->c[d^1])->f=f;
    (w->c[d^1]=f)->f=w;
    f->up();
}
void sp(node*w){
    while(w->nrt()){
        node*f=w->f;
        if(f->nrt())rot((w==f->c[0])==(f==f->f->c[0])?f:w);
        rot(w);
    }
    w->up();
}
node*acs(node*x){
    node*y=nil;
    for(;x!=nil;sp(x),x->c[1]=y,x->up(),y=x,x=x->f);
    return y;
}
node*gl(node*w){
    while(w->c[0]!=nil)w=w->c[0];
    sp(w);
    return w;
}
node*grt(node*w){
    node*w0=w;
    while(w->f!=nil)w=w->f;
    sp(w0);
    return w;
}
void lk(node*x,node*y){
    node*w=acs(x);
    if(grt(y)==w)x->ff=y;
    else sp(x),x->f=y;
}
node*ct(node*x){
    acs(x),sp(x);
    node*y=x->c[0];
    if(y!=nil){
        x->c[0]=y->f=nil;
        x->up();
        y=gl(acs(y));
        if(y->ff!=nil&&grt(y->ff)==x){
            y->f=y->ff;
            y->ff=nil;
        }
    }else x->ff=nil;
}
int tins(){
    int w=1;
    for(int i=0;s[i];++i){
        int c=s[i]-‘a‘;
        if(!nx[w][c])nx[w][c]=++ptr;
        w=nx[w][c];
    }
    if(!nx[w][26]){
        nx[w][26]=++idp;
        strcpy(ss[idp],s);
    }
    return nx[w][26];
}
int gid(int a,int b){
    return ids[a]+std::lower_bound(e[a].data(),e[a].data()+e[a].size(),b)-e[a].data();
}
int main(){
    _(s);
    e[st1=tins()].push_back(st2=_());
    qp=_();
    for(int i=0;i<qp;++i){
        _(s);
        if(s[0]==‘Q‘){
            qs[i][0]=0;
        }else{
            qs[i][0]=s[0]==‘A‘?1:2;
            _(s);
            qs[i][1]=tins();
            qs[i][2]=_();
            _(s);
            qs[i][3]=tins();
            qs[i][4]=_();
            if(qs[i][0]==1){
                e[qs[i][1]].push_back(qs[i][2]);
                e[qs[i][3]].push_back(qs[i][4]);
            }
        }
    }
    ids[1]=1;
    ns[0]=(node){nil,nil,nil,nil,0,0};
    for(int i=1;i<=idp;++i){
        int*l=e[i].data(),*r=l+e[i].size();
        std::sort(l,r);
        e[i].resize(std::unique(l,r)-l);
        int mx=ids[i+1]=ids[i]+e[i].size()+1;
        for(int j=ids[i];j<mx;++j)ns[j]=(node){nil,nil,ns+j+1,nil,i,i};
        ns[mx-1].f=nil;
        ns[mx-1].ff=ns+mx-1;
    }
    st2=gid(st1,st2);
    ss[0][0]=‘*‘;
    for(int i=0;i<qp;++i){
        if(qs[i][0]==0){
            node*w=gl(acs(ns+st2));
            puts(ss[acs(w->ff)->ida]);
        }else{
            int w1=gid(qs[i][1],qs[i][2]);
            int w2=gid(qs[i][3],qs[i][4]);
            ct(ns+w1),ct(ns+w2);
            if(qs[i][0]==1){
                lk(ns+w1,ns+w2+1);
                lk(ns+w2,ns+w1+1);
            }else{
                lk(ns+w1,ns+w1+1);
                lk(ns+w2,ns+w2+1);
            }
        }
    }
    return 0;
}
时间: 2024-11-08 20:22:52

bzoj2262: 平行宇宙与虫洞的相关文章

利用金箔形成的暗能量制造出的虫洞穿越空间的机器

技术领域 [0001] 该设备成功的制造出可以穿越宇宙空间的机器. [0002] 背景技术 [0003] 四种平行宇宙理论描述的是四种平行宇宙,它们是四种不同形式的平行宇宙,它们共同组成了我们这个世界的所有平行宇宙.平行宇宙,或者叫多重宇宙,是指在我们这宇宙外存在无数个宇宙,它们的物理规律和我们这个宇宙相同也可能不同,有四种类型的平行宇宙. [0004] 第一种,视界之外的宇宙.根据宇宙大爆炸理论,宇宙在不断的膨胀中,我们所能观察到的距离是宇宙诞生130亿年光所传播的距离,也称哈勃空间 ,随着宇

BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞

Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞.其中1<=N<=500,1<=M<=2500,1<=W<=200. 现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗. John将向你提供F(1<=F<=5)个农场的地图.没有小路会耗费你超过100

POJ 3259 虫洞旅行 spfa判负环

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31425   Accepted: 11431 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way p

NOIP模拟赛 虫洞(holes)

Problem 3 虫洞(holes.cpp/c/pas) [题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差为delta. 1.从白洞跃迁到黑洞,消耗的燃料值减少delta,若该条路径消耗的燃料值变为负数的话,取为0. 2.从黑洞跃迁到白洞,消耗的燃料值增加delta. 3.路径两端均为黑洞或白洞,消耗的燃料值不变化. 作为压轴题,自然不会是如此简单的最短路问题,所以每过1单位时间黑洞

看“平行宇宙”有感

近日看了豆瓣上推荐的一部叫"平行宇宙"的电影,据说本来是一部美剧,结果搞了一部电影出来了. 电影的故事还算新颖,虽然我觉得违和感还是挺强的...... 里面一直强调一个概念:我们不是穿越了时间,只是到了另一个空间.这一点我是非常赞同的,我也觉得穿越时间是不太可能的,或者说是无意义的,霍金那混蛋(还是爱因斯坦)说什么超过光速就可以逆转时间,反正吹吹牛逼又不犯法.我觉得时空只是事物发展所形成的一个概念而已. 举个例子: 把一个玩具车从a弄到b点,这件事情经历了一个所谓的时间段(从t1到t2

[BZOJ1715][Usaco2006 Dec]Wormholes 虫洞

1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 902  Solved: 475 [Submit][Status][Discuss] Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞.其中1<=N

虫洞 (C++)

虫洞 难度级别:C: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差为delta. 1.从白洞跃迁到黑洞,消耗的燃料值减少delta,若该条路径消耗的燃料值变为负数的话,取为0. 2.从黑洞跃迁到白洞,消耗的燃料值增加delta. 3.路径两端均为黑洞或白洞,消耗的燃料值不变化. 作为压轴题,

[noip模拟赛]虫洞holes&lt;SPFA&gt;

虫洞(holes.cpp/c/pas) [题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差为delta. 1.从白洞跃迁到黑洞,消耗的燃料值减少delta,若该条路径消耗的燃料值变为负数的话,取为0. 2.从黑洞跃迁到白洞,消耗的燃料值增加delta. 3.路径两端均为黑洞或白洞,消耗的燃料值不变化. 作为压轴题,自然不会是如此简单的最短路问题,所以每过1单位时间黑洞变为白洞,白洞变为黑

nefu 1191 平行宇宙 (bfs)

Description 小k是时空贸易者,他经常在两个平行宇宙之间往来经商,现在他要从S点到达E点,问最少需要多长时间.(已知小k在同一个宇宙中只能向上下左右四个方向移动,每次移动需要1个单位时间,且不能在危险小行星带'#'中移动,遇到黑洞'O'时,他会被瞬间吸入另一个宇宙的对应的同一位置,比如从一个宇宙的黑洞处(2,2)必须且只能移动到另一个宇宙的(2,2)位置) Input 多组输入数据,每组数据第一行包含两个整数n,m(2<=n,m<=1000),表示两个宇宙的大小. 接下来n行表示第一