1. 程式人生 > >【河南第十屆省賽-B】情報傳遞

【河南第十屆省賽-B】情報傳遞

using 領導 輸入 AS 其他人 hellip name scanf 多少

題目描述

抗日戰爭時期,在國共合作的大背景下,中共不斷發展壯大,其情報工作也開始由獲取警報性、保衛性信息,向獲取軍政戰略性情報轉變。各系統情報組織遵循"蔭蔽精幹,長期埋伏,積蓄力量,以待時機"的隱蔽戰線工作方針,開展了卓有成效的情報工作。

***特科組是中共情報工作的一個傑出範例,它以點為主、系統延伸、分散輻射的力量格局,異地領導、分頭派遣、單線聯系的組織形式。以打入、拉出、統戰聯絡、內線為主的工作方式,形成了一個傳遞信息隱蔽、效用及時、形式多樣的情報網絡。

***特科組的情報人員共有N人,其代號分別為0,1,……,N-1。 0號是最高領導人,特工之間有一套嚴格的單線聯絡程序,即,每個特工人員只有一個上線,他獲得的情報需層層上傳遞到0號手裏,由0號發報出去。

特工i在傳遞情報時,若通往到0號的通道尚未建立,則需要建立一級級單線通道;若他的上線已建立好通道,只需建立兩人通道,信息發送給上線;依次類推。若特工i已建立好到0號的通道,則直接發出情報。日偽統治中心南京,既是情報來源豐富的地方,又是特工人員活動最危險的地方。因此,一旦某個特工處於不安全狀態,他必須馬上撤離,同時他的所有下線(處在通道上的一級級下線)也一同撤離。

已知***特科組的組織結構,你的任務是計算,當某特工i需要發送情報時,最少需要建立幾個情報人員的通道;當某特工i處於不安全狀態時,最少需要撤離多少人員。

輸入

第一行一個整數: N ( 1≤N ≤5060 )

接下來一行有N-1 個整數, A1 A2 ……An-1 ,其中Ai是編號i的上線。

下一行一個整數: M 表示有M個狀態,( 1≤M ≤5060 )

接下來有M行 :有兩種形式: Send i 特工i處於要發送情報狀態;

Danger i 特工i處於不安全狀態

輸出

輸出占M行 ,對於Send i,輸出最少需要建立通道的情報人員數,若特工i處於通道線上,輸出0;對於Danger i,輸出最少需要撤離多少人員,若特工i不處於通道線上,則輸出0.

樣例輸入

10
0 1 2 1 3 0 0 3 2
10
Send 0
Send 3
Danger 2
Send 7
Send 5
Send 9
Danger 9
Send 4
Send 1
Send 9

樣例輸出

1
3
2
1
3
1
1
1
0
1


這題很坑啊,如果撤離i,i與其他人沒有通道的話自己是不需要撤離的,有通道連自己帶下層一塊撤離(黑人問號臉.jdp)
#include <bits/stdc++.h>
using namespace std;
const int N = 5100;
vector<int>V[N];
int par[N], num, n;
bool mpp[N][N], f;
void dfs(int s)
{
    for(unsigned int i = 0; i < V[s].size(); i++)
    {
        int v = V[s][i];
        if(mpp[s][v])
        {
            f = 1;
            mpp[s][v] = 0;
            mpp[v][s] = 0;
            num++;
            dfs(v);
        }
    }
}
int main()
{
    int m, a;
    cin>>n;
    for(int i = 0; i < n; i++) par[i] = 5066;
    par[5066] = 5066;
    for(int i = 1; i < n; i++)
    {
        scanf("%d", &a);
        par[i] = a;
        V[a].push_back(i);
    }
    cin>>m;
    char s[15];
    while(m--)
    {
        scanf("%s%d", s, &a);
        if(s[0] == S)
        {
            int pa = par[a], ans = 0;
            while(!mpp[a][pa] && a != 5066)
            {
                ans++;
                mpp[pa][a] = 1;
                mpp[a][pa] = 1;
                a = pa;
                pa = par[a];
            }
            printf("%d\n", ans);
        }
        else
        {
            num = 0, f = 0;
            if(mpp[a][par[a]]) f = 1;
            mpp[a][par[a]] = 0;
            mpp[par[a]][a] = 0;
            dfs(a);
            printf("%d\n", f==1?num+1:0);
        }
    }
    return 0;
}

【河南第十屆省賽-B】情報傳遞