#include#include#include#include#include

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

1699. Turning Turtles

系統 1976 0

http://acm.timus.ru/problem.aspx?space=1&num=1699

從一個點到另一個點正好有一條路 所以原圖是一棵樹

先求出每一對點的最近公共祖先lca

然后一遍dfs 求出每個點到它的lca的轉彎數 最后還要判定兩個點在lca處是否還要一個轉彎

代碼:

      #include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<map>

#include<vector>

#include<stack>

#include<set>

#include<map>

#include<queue>

#include<deque>

#include<algorithm>

#include<cmath>

#define LL long long

#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const int INF=0x3f3f3f3f;

const int N=100005;

int head[N],I;

struct node

{

    int j,next;

    int k;

}edge[N*10];

int X[]={0,0,-1,1};

int Y[]={-1,1,0,0};

int K[]={1,1,2,2};

char grap[N];

bool visited[N];

int q1[N],q2[N],lca[N],d[N],prek[N],tok[N],k1[N],k2[N],ans[N];

int f[N];

vector<int>vt[N];

queue<int>qt;

int n,m;

void add(int i,int j,int k)

{

    edge[I].j=j;

    edge[I].k=k;

    edge[I].next=head[i];

    head[i]=I++;

}

void bfs(int s)

{

    memset(visited,false,sizeof(visited));

    visited[s]=true;

    qt.push(s);

    while(!qt.empty())

    {

        int x=qt.front();

        qt.pop();

        for(int i=0;i<4;++i)

        {

            int l1=x/m+X[i];

            int l2=x%m+Y[i];

            int st=x,nd=l1*m+l2;

            while(l1>=0&&l1<n&&l2>=0&&l2<m&&grap[nd]=='#'&&!visited[nd])

            {

                visited[nd]=true;

                qt.push(nd);

                add(st,nd,K[i]);

                st=nd;

                l1=l1+X[i];

                l2=l2+Y[i];

                nd=l1*m+l2;

            }

        }

    }

}

int fx(int x)

{

    if(f[x]!=x)

    f[x]=fx(f[x]);

    return f[x];

}

void findLca(int x)

{

    for(unsigned int i=0;i<vt[x].size();++i)

    {

        int l=vt[x][i];

        if(q1[l]==x)

        {

            if(f[q2[l]]!=-1)

            lca[l]=fx(q2[l]);

        }else

        {

            if(f[q1[l]]!=-1)

            lca[l]=fx(q1[l]);

        }

    }

}

void dfsLca(int x,int pre)

{

    f[x]=x;

    findLca(x);

    for(int t=head[x];t!=-1;t=edge[t].next)

    {

        int j=edge[t].j;

        dfsLca(j,x);

    }

    f[x]=pre;

}

void F(int x)

{

    for(unsigned int i=0;i<vt[x].size();++i)

    {

        int l=vt[x][i];

        int y=lca[l];

        if(x==q1[l])

        k1[l]=tok[y];

        else

        k2[l]=tok[y];

        ans[l]+=(d[x]-d[y]);

        if((prek[y]&tok[y])==0)

        --ans[l];

    }

}

void dfs(int x,int dt,int kt)

{

    d[x]=dt;

    prek[x]=kt;

    tok[x]=3;

    F(x);

    for(int t=head[x];t!=-1;t=edge[t].next)

    {

        int j=edge[t].j;

        tok[x]=edge[t].k;

        if((prek[x]&tok[x])==0)

        dfs(j,dt+1,edge[t].k);

        else

        dfs(j,dt,edge[t].k);

    }

}

int main()

{

    //freopen("data.in","r",stdin);

    cin>>n>>m;

    int s=-1;

    for(int i=0;i<n;++i)

    for(int j=0;j<m;++j)

    {

        cin>>grap[i*m+j];

        if(s==-1&&grap[i*m+j]=='#')

        s=i*m+j;

    }

    memset(head,-1,sizeof(head));

    I=0;

    bfs(s);

    int q;

    cin>>q;

    for(int i=0;i<q;++i)

    {

        int x1,y1,x2,y2;

        cin>>x1>>y1>>x2>>y2;

        --x1;--y1;--x2;--y2;

        q1[i]=x1*m+y1;

        q2[i]=x2*m+y2;

        if(q1[i]!=q2[i])

        vt[q1[i]].push_back(i);

        vt[q2[i]].push_back(i);

    }

    memset(f,-1,sizeof(f));

    dfsLca(s,s);

    for(int i=0;i<n*m;++i)

    vt[i].clear();

    for(int i=0;i<q;++i)

    if(q1[i]!=q2[i])

    {vt[q1[i]].push_back(i);vt[q2[i]].push_back(i);}

    memset(ans,0,sizeof(ans));

    dfs(s,0,3);

    for(int i=0;i<q;++i)

    {

        if(q1[i]==q2[i])

        {cout<<"0"<<endl;continue;}

        if((k1[i]&k2[i])==0)

        ++ans[i];

        cout<<ans[i]<<endl;

    }

    return 0;

}


    

1699. Turning Turtles


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产天堂久久九九九 | julia中文在线 | 精品亚洲成a人在线观看 | 久久黄色影院 | 黄色录像一级毛片 | 农村女人十八毛片a级毛片 农村三级孕妇视频在线 | 久久久久久亚洲精品不卡 | 亚洲欧美久久 | 毛片网站在线观看 | 精品伊人| 四虎在线免费观看视频 | 理论片 我不卡影院 | 久草免费在线 | 四虎国产精品永久地址48 | 亚洲精品一区二区三区不卡 | 亚洲精品高清视频 | 国产一级特黄a大片99 | 狠狠色噜噜狠狠狠狠97不卡 | 亚洲欧美大片 | 国产99久久精品一区二区 | 日本永久免费 | 毛片高清| 亚洲视频网站在线观看 | 亚洲午夜视频 | 日韩欧美国产精品第一页不卡 | 香蕉伊人久久 | 特黄日韩免费一区二区三区 | 亚洲+自拍+色综合图区一 | 国产精品国偷自产在线 | 亚洲天天做夜夜做天天欢 | 黄色在线免费观看网站 | 伊人久久大香 | 97se亚洲综合自在线尤物 | 国产精品日韩欧美在线第3页 | 亚洲精品亚洲人成在线 | 久久久久久国产精品免费免费 | 国产伦一区二区三区免费 | 性做久久久久久免费观看 | 99热这里只有精品国产动漫 | 欧美特级特黄a大片免费 | 欧美30p|