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=,f=,c=getchar();
while(c<)c=='-'?f=-:,c=getchar();
while(c>)x=x*+c-,c=getchar();
return x*f;
}
void _(char*s){
scanf("%s",s);
}
char ss[][],s[];
int nx[][],ptr=,st1,st2,idp=,qs[][],qp,ids[];
std::vector<int>e[];
struct node{
node*c[],*f,*ff;
int id,ida;
bool nrt(){return this==f->c[]||this==f->c[];}
void up();
}ns[],*nil=ns;
void node::up(){
ida=(c[]!=nil&&c[]->ida!=id||c[]!=nil&&c[]->ida!=id)?:id;
}
void rot(node*w){
node*f=w->f,*g=f->f;
int d=f->c[]==w;
if(f->nrt())g->c[g->c[]==f]=w;
w->f=g;
(f->c[d]=w->c[d^])->f=f;
(w->c[d^]=f)->f=w;
f->up();
}
void sp(node*w){
while(w->nrt()){
node*f=w->f;
if(f->nrt())rot((w==f->c[])==(f==f->f->c[])?f:w);
rot(w);
}
w->up();
}
node*acs(node*x){
node*y=nil;
for(;x!=nil;sp(x),x->c[]=y,x->up(),y=x,x=x->f);
return y;
}
node*gl(node*w){
while(w->c[]!=nil)w=w->c[];
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[];
if(y!=nil){
x->c[]=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=;
for(int i=;s[i];++i){
int c=s[i]-'a';
if(!nx[w][c])nx[w][c]=++ptr;
w=nx[w][c];
}
if(!nx[w][]){
nx[w][]=++idp;
strcpy(ss[idp],s);
}
return nx[w][];
}
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=;i<qp;++i){
_(s);
if(s[]=='Q'){
qs[i][]=;
}else{
qs[i][]=s[]=='A'?:;
_(s);
qs[i][]=tins();
qs[i][]=_();
_(s);
qs[i][]=tins();
qs[i][]=_();
if(qs[i][]==){
e[qs[i][]].push_back(qs[i][]);
e[qs[i][]].push_back(qs[i][]);
}
}
}
ids[]=;
ns[]=(node){nil,nil,nil,nil,,};
for(int i=;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+]=ids[i]+e[i].size()+;
for(int j=ids[i];j<mx;++j)ns[j]=(node){nil,nil,ns+j+,nil,i,i};
ns[mx-].f=nil;
ns[mx-].ff=ns+mx-;
}
st2=gid(st1,st2);
ss[][]='*';
for(int i=;i<qp;++i){
if(qs[i][]==){
node*w=gl(acs(ns+st2));
puts(ss[acs(w->ff)->ida]);
}else{
int w1=gid(qs[i][],qs[i][]);
int w2=gid(qs[i][],qs[i][]);
ct(ns+w1),ct(ns+w2);
if(qs[i][]==){
lk(ns+w1,ns+w2+);
lk(ns+w2,ns+w1+);
}else{
lk(ns+w1,ns+w1+);
lk(ns+w2,ns+w2+);
}
}
}
return ;
}
bzoj2262: 平行宇宙与虫洞的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- hzwer模拟赛 虫洞
[题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差为delta. 1.从白洞跃迁到黑洞,消 ...
- BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞
Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...
- BZOJ1715: [Usaco2006 Dec]Wormholes 虫洞
1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 475 Solved: 263[Sub ...
- nefu 1191 平行宇宙 (bfs)
Description 小k是时空贸易者,他经常在两个平行宇宙之间往来经商,现在他要从S点到达E点,问最少需要多长时间.(已知小k在同一个宇宙中只能向上下左右四个方向移动,每次移动需要1个单位时间,且 ...
- 1715: [Usaco2006 Dec]Wormholes 虫洞
1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 501 Solved: 278[Sub ...
- [P2850][USACO06DEC]虫洞Wormholes (最短路)
死活调不出来 后来是发现这题建边的原因…… 吐血.jpg 所谓的虫洞传说也就是负边了 然后这里打的spfa和原来的不一样 感觉hzwer大佬的spfa好强啊…… 也更易写一点 贴代码 #include ...
- SPFA穿越虫洞——负权回路得判断
poj3259 题目大意:穿越虫洞可以回到过去(时间--)所以能不能让时间倒流呢,就是判断有没有负权回路这次尝试用SPFA算法,也可以复习一下链式前向星 准备工作,队列q,spfa算法得有点就在于这个 ...
- bzoj 1715: [Usaco2006 Dec]Wormholes 虫洞 -- spfa判断负环
1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec Memory Limit: 64 MB 注意第一次加边是双向边第二次是单向边,并且每次询问前数 ...
随机推荐
- Java——String类
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 软工作业No.6 甜美女孩第四周
各成员在Alpha阶段认领的任务 成员 Alpha阶段认领的任务 整个项目预期的任务量 曾祎祺 安排每日任务,每晚总结 16% 邓画月 基础2048+自定义 16% 梁佩诗 负责界面 16% 何颖琪 ...
- DevExpress v18.1新版亮点——WinForms篇(五)
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v18.1 的新功能,快来下载试用新版本! ...
- 在 windows 开发 reactNative 的环境 搭建过程 react-native-android
安装的东西挺多的, 从 jdk 到c++环境 到node , python, 各种模拟器 http://bbs.reactnative.cn/topic/10/%E5%9C%A8windows%E4% ...
- Alpha阶段敏捷冲刺---Day4
一.Daily Scrum Meeting照片 二.今天冲刺情况反馈 今天我们上完课后在禹洲楼教室外进行我们的每日立会.开会的内容主要是对昨天遇到的困难做了一些交流,并且定下今天的任务是完成排行榜界面 ...
- parser_url
$url="http://127.0.0.1/test2.php?sitename=mysite.cn&a=1&b=2";$a=parse_url($url);p( ...
- Ubuntu下安装virtualbox失败解决方案
安装失败的截图: 因此使用常规方法:对依赖的两个包进行获取安装,依旧失败: 因此解决方法为在官网上下载相对应版本的virtualbox软件:下载地址为:https://www.virtualbox.o ...
- WebGL编程指南理论分析之物体的运动和点光源
之前的所有案例中物体都是静止的并且是平行光照射,这里我们来讨论一下运动物体和点光源. 一.运动物体 我们知道对于一个提供原始顶点坐标和原始顶点法向量数据的着色器绘制出来的图形看上去是这样的: 看上去很 ...
- jvm 方法区
方法区在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中.类型信息是由类加载器在类加载时从类文件中提取出来的.类(静态)变量也存储在方法区中. jvm实现的设计者决定了类型信息的内部 ...
- magento常见的问题及解决方法
刚接触magento时,会遇到很多问题,大多数都是些magento配置及操作上的问题,因为刚接触magento不久所有对这些问题比较陌生也不知道如何处理.今日根据模版堂技术指导下和网上的相关例子,这里 ...