解題報告 NOI2002 銀河英雄傳說

2022-05-19 19:43:14 字數 787 閱讀 9583

處理m個指令,都為兩種如下形式的指令之一

1.m i j 表示讓第i好戰艦所在列的全部戰艦保持原有順序,接在第j好戰艦所在列的尾部。

2.c i j,表示詢問第i號戰艦與第j號戰艦當前是否處於同一列中,如果在同一列中,它們之間間隔了多少艘戰艦。如果不在同一列中,輸出-1;

並查集第二個指令我們要知道i,j兩號戰艦差多少,維護乙個數列d即可,d[x]代表x前面的戰艦數量,要查詢的時候,我們只要知道i,j兩號前面各有多少戰艦,然後i前面的減去j前面的絕對值減一就可以了。

而第乙個指令就是簡單地處理一下size,記錄集合大小,也很簡單

#include #include using namespace std;

int f[30005];

int d[30005];

int size[30005];

int t;

int jdz(int x)

void init()

}int get(int x)

void merge(int x,int y)

int main()

{ cin>>t;

init();

for(int i=1;i<=t;i++)

{ char s[2];

int x,y;

scanf("%s",s);

cin>>x>>y;

if(s[0]=='m')

merge(x,y);

if(s[0]=='c')

{ if(get(x)==get(y))

cout《資料情況

NOI2002 銀河英雄傳說

noi2002 day1 t1 公元5801年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集團在巴公尺利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組織...

NOI 2002 銀河英雄傳說

有 n 列戰場,每一列一開始只有乙個戰艦,編號就是對應的戰場編號。有 m 次操作 注意每一列戰場的戰艦都是排成一列的。帶偏移量的並查集。記錄 d x 表示 x 到所在列頭的一段上共有多少個戰艦。記錄 sz x 表示 x 所在的一列有多少個戰艦。為了保證複雜度,我們在做的時候還是要路徑壓縮。但是 d ...

NOI2002 銀河英雄傳說

公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集 點名將楊威利組織麾下三萬艘戰艦迎敵。楊威利擅長排兵...