思路:线段树维护最短路

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
struct node{
int l,r,c[][];
}t[];
int id[][];
int s[][];
int fa[],n;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
int find(int x){
if (fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
node operator +(node a,node b){
node p;
p.l=std::min(a.l,b.l);
p.r=std::max(a.r,b.r);
p.c[][]=p.c[][]=p.c[][]=p.c[][]=0x3f3f3f3f;
for (int i=;i<=;i++)
if (s[i][a.l]==)
for (int j=;j<=;j++)
if (s[j][b.r]==)
for (int k=;k<=;k++)
if (s[k][a.r]==&&s[k][b.l]==)
p.c[i][j]=std::min(p.c[i][j],a.c[i][k]+b.c[k][j]+); return p;
}
void build(int k,int l,int r){
t[k].c[][]=t[k].c[][]=t[k].c[][]=t[k].c[][]=0x3f3f3f3f;
if (l==r){
t[k].l=t[k].r=l;
if (s[][l]==) t[k].c[][]=;
if (s[][l]==) t[k].c[][]=;
if (s[][l]==&&s[][l]==) t[k].c[][]=t[k].c[][]=;
return;
}
int mid=(l+r)>>;
build(k*,l,mid);
build(k*+,mid+,r);
t[k]=t[k*]+t[k*+];
}
void init(){
char S[];
scanf("%s",S+);
for (int i=;i<=n;i++)
s[][i]=S[i]-'';
scanf("%s",S+);
for (int i=;i<=n;i++)
s[][i]=S[i]-'';
int sz=;
for (int i=;i<;i++)
for (int j=;j<=n;j++)
id[i][j]=++sz;
for (int i=;i<=*n;i++) fa[i]=i;
for (int i=;i<n;i++)
if (s[][i]==&&s[][i+]==) fa[find(id[][i])]=find(id[][i+]);
for (int i=;i<n;i++)
if (s[][i]==&&s[][i+]==) fa[find(id[][i])]=find(id[][i+]);
for (int i=;i<=n;i++)
if (s[][i]==&&s[][i]==) fa[find(id[][i])]=find(id[][i]); }
node query(int k,int l,int r,int x,int y){
int mid=(l+r)>>;
node tmp;
if (l==x&&r==y) return t[k];
if (y<=mid) return query(k*,l,mid,x,y);
else
if (x>mid) return query(k*+,mid+,r,x,y);
else return query(k*,l,mid,x,mid)+query(k*+,mid+,r,mid+,y);
}
int main(){
int T;
n=read();T=read();
init();
build(,,n);
while (T--){
int x=read(),y=read();
if (x==y) {puts("");continue;}
if (find(x)!=find(y)){puts("You have been confusional!");continue;}
int x1=(x>n)?x-n:x;int y1=(y>n)?y-n:y;
if (x1>y1) std::swap(x,y),std::swap(x1,y1);
node tmp=query(,,n,x1,y1);
int id1,id2;
if (x>n) id1=;else id1=;
if (y>n) id2=;else id2=;
int ans=tmp.c[id1][id2];
if (ans==0x3f3f3f3f) puts("You have been confusional!");
else printf("%d\n",ans);
}
}

XJOI网上同步测试DAY14 T1的更多相关文章

  1. XJOI网上同步测试DAY14 T3

    思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就 ...

  2. XJOI网上同步测试DAY14 T2

    思路:先考虑在D高度的最小圆覆盖,再一层一层往下走时,可以保证圆心与最开始的圆相同的时候答案是最优的. 时间复杂度O(n) 有一个坑点,就是我用了srand(time(NULL))就T了,RP太差了. ...

  3. XJOI网上同步训练DAY6 T1

    思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...

  4. XJOI网上同步训练DAY5 T1

    思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...

  5. XJOI网上同步训练DAY3 T1

    思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的 ...

  6. XJOI网上同步训练DAY2 T1

    [问题描述] 为了迎接校庆月亮中学操场开始施工.不久后操场下发现了很多古墓这些古墓中有很多宝藏.然而学生们逐渐发现自从操场施工之后学校的运气就开始变得特别不好.后来经过调查发现古墓下有一个太守坟由于操 ...

  7. XJOI网上同步训练DAY1 T1

    思路:我们考虑由于没有人的区间会覆盖其他人,所以我们将区间按左端点排序,发现如果地盘长度已知,可以贪心地尽量往左放,来判断是否有解,因此做法很简单,就是二分答案,然后O(n)贪心判定,复杂度为O(nl ...

  8. XJOI网上同步训练DAY5 T3

    就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...

  9. XJOI网上同步训练DAY6 T2

    思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...

随机推荐

  1. js中方法类型比较

    参考链接 http://bbs.csdn.net/topics/390775296/ function People(name){this.name=name;//对象方法this.Introduce ...

  2. android获得屏幕高度和宽度

    获取屏幕的宽度与高度有以下几种方法: .WindowManager wm = (WindowManager) getContext()                     .getSystemSe ...

  3. 【开源项目】Android 手写记事 App(半成品)

    该项目已上传到 CSDN 的 Git 平台中 项目地址:https://code.csdn.net/gd920129/whiteboard GIT SSH:git@code.csdn.net:gd92 ...

  4. 【剑指offer】链表倒数第k个节点

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在 ...

  5. ORACLE函数之单行数字函数

     1.           ABS(X) 返回X的绝对值 SQL>SELECT ABS(-1) A,ABS(1) B,ABS(0) C FROM DUAL; A          B     ...

  6. XgCalendar日历插件动态添加参数

    在使用xgcalendar日历插件的时候,参数数组并非只有类型.显示时间.时区等这些参数,还可以根据extParam自定义参数扩展搜索条件,例如根据用户Id搜索不同用户的日历信息,需要将用户的Id存在 ...

  7. 黑信 socket即时通讯 示例

    整个过程 首先开启服务器 打开一个SDK大于4.4的手机---B 打开一个SDK小于4.4的手机---A 相互发送一条消息,对方就可以收到,当然这些消息都是通过服务器[转发]过来的 MainActiv ...

  8. 使用静态资源设置UI信息

    首先建立一个文件存放样式设置(资源字典),所有风格设置都可以这里进行 加入以下代码: <ResourceDictionary xmlns="http://schemas.microso ...

  9. JspSmart文件上传与下载

    JspSmart 文件上传包,放在WEB-INF/lib下 uploadForm.jsp <%@ page language="java" import="java ...

  10. 秒味课堂Angular js笔记------$scope.$watch和$scope.$apply

    $scope.$watch(watchFn , watchAction , deepWatch) 其中,watchFn是带有angular表达式或函数字符串: watchAction是一个函数或者表达 ...