zoukankan      html  css  js  c++  java
  • cf605Div3 Nearest Opposite Parity bfs

    题目链接:http://codeforces.com/contest/1272/problem/E

    题意:给定n,给定n个数a[i],对每个数输出d[i]。

    对于每个i,可以移动到i+a[i]和i-a[i](如果i+a[i]<=n,i-a[i]>=1)

    d[i]是指从i移动到任意一个j的步数,需满足条件a[i]和a[j]的奇偶性不同

    不论奇偶,相连的边先放进vector邻接表中

    如果i和i+a[i]奇偶性不同,那么ans[i]为1,把i放到queue队列里

    同理,如果i和i-a[i]奇偶性不同,那么ans[i]为1,把i放到queue队列里

    (bfs)

    queue队列里存的是每个有答案的点,刚开始队列里所有点的ans都为1。

    由于需要a[i]和a[j]奇偶性不同,则只需要跟有答案的点奇偶性相同即可。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2e5+10;
    vector<int> v[maxn];
    int ans[maxn],a[maxn];
    int main()
    {
        memset(ans,-1,sizeof ans);
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)cin>>a[i];
        
        queue<int> q;
        for(int i=1;i<=n;i++)
        {
            int j=i+a[i];
            if(j<=n)
            {
                v[j].push_back(i);
                if(a[j]%2!=a[i]%2)
                {
                    ans[i]=1;
                    q.push(i);
                }
            }
            j=i-a[i];
            if(j>=1)
            {
                v[j].push_back(i);
                if(a[j]%2!=a[i]%2)
                {
                    ans[i]=1;
                    q.push(i);
                }
            }
        }
        while(!q.empty())//bfs
        {
            int cur=q.front();
            q.pop();
            for(int n:v[cur])
            {
                if(ans[n]==-1&&a[n]%2==a[cur]%2)
                {
                    ans[n]=ans[cur]+1;
                    q.push(n);
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            cout<<ans[i]<<" ";
        }
        
        
        return 0;
    } 
  • 相关阅读:
    JAVA-基础-接口
    JAVA-基础-抽象类
    JAVA-基础-多态
    JAVA-基础-继承
    JAVA-基础-封装
    JAVA-基础-面向对象
    JAVA-基础-ArrayList集合
    CenOS 6.5下 mysql自动备份
    Cenos 6.5上的subverion的yum配置笔记
    [CF628D]Magic Numbers 题解
  • 原文地址:https://www.cnblogs.com/myrtle/p/12040163.html
Copyright © 2011-2022 走看看