GDOI2015模擬12 21 雞腿 桌球

2021-08-21 09:56:48 字數 1470 閱讀 6271

桌球遊戲可不是桌球!桌球好像也和這個遊戲沒啥關係。這個遊戲的主角就是——區間。對於兩個區間,如果(a,b)和(c,d)區間滿足

c<

a<

d c

<

a

c<

b<

d c

<

b<

d,就可以從(a,b)到(c,d)去。然後現在有兩種操作,分別是:

1 x y : (x < y)表示在區間集合中新增(x,y)這個區間,保證新加入的區間長度一定比之前的所有區間長度長;

2 a b:(a≠b)表示詢問是否有一條路從第a個區間到第b個區間。

雞腿實在是智商捉急,請你來替他回答所有詢問吧。一開始區間集合為空哦~

看錯題爆零了,嗚嗚~~

如果相交的話是雙向邊。

包含的話是單向邊。

並且一定是前面的被後面的包含(長度遞增)。

雙向邊用並查集維護。

直接連邊肯定是不行的,記住線段樹這個好東西,打上標記,vector就是幹。

那麼查詢是求y區間所在並查集能往左往右延伸到哪兒,如果與x區間又交,則有解。

code:

#pragma gcc optimize(2)

#include

#include

#include

#include

#define ll long long

#define fo(i, x, y) for(int i = x; i <= y; i ++)

#define min(a, b) ((a) < (b) ? (a) : (b))

#define max(a, b) ((a) > (b) ? (a) : (b))

using namespace std;

const int n = 1e5 + 5, m = 5e6 + 5, inf = 1e9 + 5;

int tq, q, x, y, z, f[n], p[n], q[n];

struct node a[n];

struct tree t[m]; int tot, pl, pr, px, g;

int find(int

x) void bin(int

x, int

y) }

void fi(int &i, int

x, int

y) if(x == y) return;

intm = x + y >> 1;

fi(t[i].l, x, m); fi(t[i].r, m + 1, y);

}void add(int &i, int

x, int

y) int

m = x + y >> 1;

add(t[i].l, x, m); add(t[i].r, m + 1, y);

}int main() else }}

}

GDOI2015模擬12 20 雞腿 夢境

雞腿做了乙個好夢呢!他化身鋼鐵俠大戰全宇宙的各種怪物,並且取得了勝利。在夢的結尾,雞腿開的飛船困在了一片廢棄飛船群中,同時由於引擎故障,他只能在平面內移動。廢棄飛船群可以描述為許多圓形的飛船,當然因為各種奇怪的原因,飛船可能疊加在一切。雞腿也駕駛著飛船在這個平面中。一開始的時候雞腿的飛船是不會和廢棄...

GDOI2015 水題 tarjan縮點

這一題,我當年只會 60 分做法。我們考慮對原圖跑一波邊雙,然後縮成乙個森林。對於森林中的每一棵樹,我們欽定乙個根。令 siz x 表示以 x 為根的子樹中,在原圖中點的個數。令當前的答案為 ans 對於一條邊 u,v 如果這兩個點在縮點後的同個點內,那麼什麼都不用管,直接輸出 ans 即可。否則我...

GDOI模擬 排列

給你m個對1到n的排列的特徵,特徵有兩種 1 x y v 排列的第x個數到第y個數之間的最大值為v 2 x y v 排列的第x個數到第y個數之間的最小值為v 要求你還原出這個排列。刷水有益身心健康。既然是求方案,資料範圍又很小,那麼明顯的要用把點向權值連邊。然後他每次給出範圍之後再進行刪邊。最後,二...