生成樹,2019NOI金牌營6,思維好題

2021-09-25 01:51:47 字數 1458 閱讀 5837

因為這次比賽撞題了,我就憑藉著我曾經的記憶慢慢的寫出來了這一題。(現場做出來的是真的強

portal

我們考慮先把1到n的邊先建出來,如果已經有n-1條黑邊或者白邊,那麼就直接輸出。

否則就存在乙個點使得它的兩邊一邊是黑邊都是白邊。

可以直接問一下連線兩邊的點的邊,直接把這條邊建出來,那麼無論外面是白樹還是黑樹,都可以走到當前點。

接著我們拿這個點旁邊的兩個點進去深搜,如果其中的乙個點的旁邊的兩個點沒有聯通,那麼肯定是一條黑邊一條白邊,再不斷問下去,直到聯通為止。

在這個過程中,我們可以用鍊錶來維護這個左右點。

#include#include#include#includeusing namespace std;

int n,m,tot1,tot2;

map,int> f;

long long x,y,z;

long long p[500010];

int w[500010],b[500010];

struct edgeblk[500010],wht[500010];

int las[500010],nex[500010];

int ask_edge(int a,int b)

int findpa(int*f,int x)

void update(int x,int y,int t);

else w[findpa(w,x)]=findpa(w,y),wht[++tot2]=(edge);

}bool insame(int x,int y)

void dfs(int l,int r)

int main()

scanf("%lld %lld %lld",&x,&y,&z);

for(int i=1;i<=n;i++) scanf("%lld",&p[i]);

for(int i=1;i<=n;i++) b[i]=w[i]=i;

las[1]=n;for(int i=2;i<=n;i++) las[i]=i-1;

nex[n]=1;for(int i=1;i=n-1) for(int i=1;i<=n-1;i++) printf("%d %d\n",blk[i].x,blk[i].y);

else if(tot2>=n-1) for(int i=1;i<=n-1;i++) printf("%d %d\n",wht[i].x,wht[i].y);

if(tot1>=n-1 || tot2>=n-1) return 0;

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

if(tot1>=n-1) for(int i=1;i<=n-1;i++) printf("%d %d\n",blk[i].x,blk[i].y);

else if(tot2>=n-1) for(int i=1;i<=n-1;i++) printf("%d %d\n",wht[i].x,wht[i].y);

}

神樹的矩陣,2019NOI金牌營4,思維好題 構造

portal 蒙蔽了很久。首先我們可以找一下 否則我們把它豎著放。第一次,我們強制給紅色區域加上乙個1,然後再除了最後一行的空白部分標上我們想要的。第二次,我們強制個藍色區域加上乙個1,然後除了第一行的空白部分標上我們想要的。最後一次我們給中間的綠色部分強制變為1,然後再兩行中我們需要0的地方標為1...

分組遊戲,2019NOI金牌營1第一題,困難的Dp

題目傳送門 對我來說太困難了,居然是簽到題。很容易我們可以先排個序,但是很容易想偏成從前往後做dp。不妨從後往前,我們考慮 那麼答案就是 轉移考慮新加入的 接著我們列舉一下有k個人現在開始組成一隊,就一共有 當然這個 首先方案數然後把 在乘上 include include include incl...

NOI2019 彈跳 題解(KD樹)

題意 w h網格中有n個點,m條邊。每條邊可以從p點花費t時間到乙個矩形中的任意點,求1號點到每個點的最少時間。1 w,h n 70000,1 m 150000 時間2s,空間128m。本題如果放在序列上,使用線段樹建圖,可以做到 o mlogn 的複雜度,通過資料分治可以獲得72分。對於二維問題可...