因為這次比賽撞題了,我就憑藉著我曾經的記憶慢慢的寫出來了這一題。(現場做出來的是真的強
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分。對於二維問題可...