思路:线段树维护最短路

#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. 一个高级PHP工程师所应该具备的

    初次接触PHP,就为他的美所折服,于是一发不可收拾. 很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望 ...

  2. hibernate ThreadLocal

    代码 package com.pb.hibernate.util; import org.hibernate.HibernateException; import org.hibernate.Sess ...

  3. YKCW6-BPFPF-BT8C9-7DCTH-QXGWCYQ7PR-QTHDM-HCBCV-9GKGG-TB2TM

    YKCW6-BPFPF-BT8C9-7DCTH-QXGWCYQ7PR-QTHDM-HCBCV-9GKGG-TB2TM

  4. 标准的数据获取 -ios

    #define kBgQueue dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) #define kLatestKivaL ...

  5. 二分图的最大匹配-hdu-3729-I'm Telling the Truth

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3729 题目意思: 有n个学生,老师询问每个学生的排名,每个学生都告诉了一个排名区间,求可能的最多的学 ...

  6. 《JAVA课程设计》实训第四天——《猜猜看》游戏

    第四天,本来想进一步去改进<猜猜看>游戏的.可是非常多问题都不理解.也不熟悉怎么去弄到连接数据库.统计猜对次数,所以并没有进行再多的改动. 基本上就是这种执行结果了 import java ...

  7. android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题

    最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能.当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新, ...

  8. 百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】

    总Time Limit:  10000ms  Memory Limit:  65536kB 有一个奇妙的口袋.总的容积是40,用这个口袋能够变出一些物品,这些物品的整体积必须是40.John如今有n个 ...

  9. linux mysql 数据目录文件夹移动及所遇到的问题

    一 .如果是fedora下用rpm包安装的mysql,修改方法如下: 如果这里说的不够清楚,可以到http://www.vipkj.net/post-839.html给我留言 MySQL默认的数据文件 ...

  10. 配置WifiConfiguration

    public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) { WifiConfiguration  ...