桌球遊戲可不是桌球!桌球好像也和這個遊戲沒啥關係。這個遊戲的主角就是——區間。對於兩個區間,如果(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 要求你還原出這個排列。刷水有益身心健康。既然是求方案,資料範圍又很小,那麼明顯的要用把點向權值連邊。然後他每次給出範圍之後再進行刪邊。最後,二...