1. 程式人生 > >AtCoder Regular Contest 079 F

AtCoder Regular Contest 079 F

題意

給出一棵外向環套樹,問能否給每一個點定一個權值,使得每個點的權值都滿足其恰好是該點所有後繼節點的mex。
n<=200000

分析

對於不在環上的節點,它的權值是唯一確定的。對於環上的任意一個點,它的權值有兩種可能,一種是它的所有非環上後繼的mex,另一種是第二大的未出現過的數。那麼只要列舉兩種情況,看是否合法即可。

程式碼

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using
namespace std; const int N=200005; int n,cnt,last[N],p[N],sg[N],p1,p2,tim,arr[N]; bool vis[N]; struct edge{int to,next;bool del;}e[N]; int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return
x*f; } void addedge(int u,int v) { e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt; } int get_mex(int x) { int ans; for (int i=last[x];i;i=e[i].next) if (!e[i].del) vis[sg[e[i].to]]=1; for (int i=0;;i++) if (!vis[i]) {ans=i;break;} for (int i=last[x];i;i=e[i].next) if (!e[i].del) vis[sg[e[i].to]]=0
; return ans; } void dfs(int x) { arr[x]=tim; for (int i=last[x];i;i=e[i].next) if (!arr[e[i].to]) dfs(e[i].to); else if (arr[e[i].to]==tim) p1=x,p2=e[i].to,e[i].del=1; sg[x]=get_mex(x); } int main() { n=read(); for (int i=1;i<=n;i++) p[i]=read(),addedge(p[i],i); for (int i=1;i<=n;i++) if (!arr[i]) tim++,dfs(i); int s1=get_mex(p1); vis[s1]=1; int s2=get_mex(p1); vis[s1]=0; if (sg[p2]!=s1) {puts("POSSIBLE");return 0;} sg[p1]=s2; int x=p1; while (x!=p2) x=p[x],sg[x]=get_mex(x); if (sg[p2]==s1) puts("POSSIBLE"); else puts("IMPOSSIBLE"); return 0; }

相關推薦

AtCoder Regular Contest 079 F

題意 給出一棵外向環套樹,問能否給每一個點定一個權值,使得每個點的權值都滿足其恰好是該點所有後繼節點的mex。 n<=200000 分析 對於不在環上的節點,它的權值是唯一確定的。對於環上的任意一個點,它的權值有兩種可能,一種是它的所有非環上後

AtCoder Regular Contest 081 F - Flip and Rectangles

題目傳送門:https://arc081.contest.atcoder.jp/tasks/arc081_d 題目大意: 給定一個\(n×m\)的棋盤,棋盤上有一些黑點和白點,每次你可以選擇一行或一列,將上面所有的顏色取反,問若干次操作後可以得到的最大全黑子矩陣面積 首先我們可以發現,對於一個\(2×2

AtCoder Regular Contest 085 F NRE 線段樹優化dp

題意 有長度為n初始全為0的陣列A和僅由0和1組成的陣列B。現在給出m個區間,每次可以選擇某個區間[l,r],使得A陣列下標在[l,r]之間的元素變為1。問A和B最小不同位置數量是多少。 n,m<=200000 分析 比賽的時候看成是區間取反,

AtCoder Regular Contest 075 E - Meaningful Mean 樹狀數組求順序對, 前綴和

n) cin 答案 bound std lan memset main ani 題目鏈接: http://arc075.contest.atcoder.jp/tasks/arc075_c 題意: 給你一個序列和一個數k,求有多少對l,r,使得a[l]+a[l+1]+...+

AtCoder Regular Contest 088 E - Papple Sort(樹狀數組+結論)

stream line sed post regular sum lib printf char   結論:每次把字符丟到最外面最優,用樹狀數組統計答案,把字符放到最外邊後可以當成消失了,直接在樹狀數組上刪掉就好。   感性理解是把字符丟到中間會增加其他字符的移動次數,但

[Atcoder Regular Contest 060] Tutorial

sts type link b- nbsp target AD SQ isp Link: ARC060 傳送門 C: #include <bits/stdc++.h> using namespace std; typedef long long ll; c

AtCoder Regular Contest 100 E - Or Plus Max

spa scanf cstring sin ans main swa const swap 一道很好的dp題 dp[K]存的是 i滿足二進制1屬於K二進制1位置 最大的兩個Ai 這樣dp[K]統計的兩個數肯定滿足(i | j) <= K 然後不斷做 update(dp

AtCoder Grand Contest 006 F - Blackout

sin 所在 long long || 如果 open int 雙向 mem Description 在 \(n*n\) 的棋盤上給出 \(m\) 個黑點,若 \((x,y)\),\((y,z)\) 都是黑點,那麽 \((z,x)\) 也會變成黑點,求最後黑點的數量 題面

AtCoder Regular Contest 101

ont 二分 結構 數據結構 reg lar pan font coder C題是個傻逼題, 一定是先向右,然後停了或者向左走到某一個點(左邊同理)模擬就可以了 D題想了一會才想出來 和tjoi那道排序挺像的 二分答案變0/1來做 剛開始寫的時候還把自己作為另外一

AtCoder Regular Contest 098

實現 中一 最大數 num mem 最小數 答案 當我 gist AtCoder Regular Contest 098 C - Attention 題意 給定一個只包含“E”,“W”字符串,可以花一的花費使他們互相轉換。選定一個位置,使位置左邊的字符都變成E,右邊都變成

AtCoder Regular Contest 095

pow 滿足 string span 有一個 條件 i++ 就是 algo AtCoder Regular Contest 095 C - Many Medians 題意: 有A,B兩種匹薩和三種購買方案,買一個A,買一個B,買半個A和半個B,花費分別為a,b,c。 求買

AtCoder Regular Contest 102

contest HERE src tco http 技術分享 spa std The 作為一個大蒟蒻,我就只有時間寫c了QAQ 題目鏈接 題意: 給n,k,求有多少個3元組(a,b,c),滿足a+b,b+c,c+a都是k的倍數(n,k<=2e5,1<=a,

AtCoder Regular Contest 101 D - Median of Medians

分答 ios pos 組合 name contest clu include ons 二分答案 然後前綴和+樹狀數組來判斷這個答案是否大於等於數 如果我們對於一個查詢,如果小於這個數令為1,大於這個數領為-1 將所有前綴和放在樹狀數組中,就可以查詢所有sum_{l} <

AtCoder Regular Contest 102 D - All Your Paths are Different Lengths

ret include fio pll urn n) sin push fine D - All Your Paths are Different Lengths 思路: 二進制構造 首先找到最大的t,使得2^t <= l 然後我們就能構造一種方法使得正好存在

AtCoder Regular Contest 103 題解

print -s struct namespace type iostream con clas inline C-/\/\/\ #include<algorithm> #include<iostream> #include<cstdlib&g

AtCoder Regular Contest 103 Problem D Robot Arms (構造)

https con 進制 bsp code lap 直接 coder efi 題目鏈接 Problem D 給定$n$個坐標,然後讓你構造一個長度為$m$的序列, 然後給每個坐標規定一個長度為$m$的序列,ULRD中的一個,意思是走的方向, 每次從原點出發按照這個序

AtCoder Regular Contest 103

getchar() fin 條件 main from tasks 奇數 operator 降序排序 AtCoder Regular Contest 103 一些吐槽 參加的第一場\(ARC\):一個模擬 + 三個構造 沒見過比這更令人感動的題型設置了(簡直就是針對我(TAT

【刷題】AtCoder Regular Contest 001

etc 無法 給定 完全 形式 要求 \n 如果 max A.センター採點 題意:給一個只包含1、2、3、4的字符串,求出現次數最多和最少的字符 做法:還能怎麽做。。。 #include<bits/stdc++.h> #define ui unsigned in

AtCoder Regular Contest 063 E:Integers on a Tree

題目傳送門:https://arc063.contest.atcoder.jp/tasks/arc063_c 題目翻譯 給你一個樹,上面有\(k\)個點有權值,問你是否能把剩下的\(n-k\)個點全部填上權值,使得每條邊連結的兩個點權值相差\(1\),如果可以做到需要輸出任意一組方案。 題解 我們考慮

AtCoder Grand Contest 067 F - Yakiniku Restaurants

題目傳送門:https://arc067.contest.atcoder.jp/tasks/arc067_d 題目大意: 有\(N\)家燒烤店,在直線上按順序排列,第\(i\)家燒烤店和第\(i+1\)家燒烤店的距離為\(A_i\)。你有\(M\)張燒烤券,在第\(i\)家燒烤店使用第\(j\)張券可以獲