思路:线段树维护最短路

#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. Promise in AngularJS

    What's promise Angular’s event system provides a lot of power to our Angular apps. One of the most p ...

  2. 百度地图点聚合MarkerClusterer,性能优化

    参考文献:http://www.cnblogs.com/lightnull/p/6184867.html 百度的点聚合算法 是基于方格和距离的聚合算法,即开始的时候地图上没有任何已知的聚合点,然后遍历 ...

  3. jquery 定时器

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  4. Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(安装方面)

    前言:第一次接触数据库,想下载个oracle试玩下(虽然听说一般大企业才用),到 官网下载 了个简易版 XE 版本,安装时要注意记住自己输入的数据库密码(口令)  还有安装路径不能含有空格(Do no ...

  5. mysql查询最近一小时的数据

    date_sub()函数: DATE_SUB(date,INTERVAL expr type) 实例: SELECT NOW(),DATE_SUB(NOW(),INTERVAL HOUR) as th ...

  6. ulimit开启coredump时核心转储

    [root@localhost ~]# ulimit -c [root@localhost ~]# ulimit -a core data seg size (kbytes, -d) unlimite ...

  7. CString与std::string unicode下相互转化

      1. CString to string CString str = L"test"; CString stra(str.GetBuffer(0)); str.ReleaseB ...

  8. machine learning in action , part 1

    We should think in below four questions: the decription of machine learning key tasks in machine lea ...

  9. (转)使用DataTime这个类来获取当前的时间

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(--).时间(::).日期+时间(-- ::)等. //获取日期+时间 DateTime ...

  10. ASP.NET-FineUI开发实践-6(二)

    1.上回说到修改以前的会出现好几个5: 这是因为新增时是只新增到最后一行,所以点击选好了就跑到最后一行了,而且行号不会累积,只加到初始化的行号. 其实js里是有插入的,例子里可以插入到第一行,新增是a ...