题解【ABC155F】並列に危険

<ビット/ STDC ++。H>含みます

N 200005を定義します

名前空間stdを使用。

整数N、M。
INTヘッド[N]、[N << 1]〜NEX [N << 1]、EID [N << 1]、ECNT。
int型P [N]、[N]です。

{光ストラクト
int型のPOS、状態。
} LIG [N]。

BOOL cmpLight(CONST光&LHS、CONST光&RHS){戻りlhs.pos <rhs.pos。}

インラインint型リード(){
int型のx = 0。チャーCH = GETCHAR()。
しばらく(isdigit(CH)!)CH = getchar関数();
一方、(isdigit(CH))X = X * 10 + CH - '0'、CH = GETCHAR()。
戻り値は、x;
}
インラインボイドADDE(INT U、V INT、INT ID){
[++ ECNT = V、EIDに[ECNT = ID。
NEX [ECNT =頭部[U]、ヘッド[U] = ECNT。
}

int型cntOne;
INTデフ[n]は、[N]信仰[N]ん。
BOOL VIS [N]。

ボイドDFS(INT U){
IF(S [U])++ DIF [U]、++ cntOne。
以下のために(INT iがヘッド[U]、Vが=; I; iがNEX [I] =){
V =に[I]を、
(FAは[V])であれば続けます。
FA [V] = U、FE [V] = EID [i]は、DFS(V)。
DIF [U] + = DIF [V]。
}
}

メイン(){int型
)は、n =(読み取り、M =(リード)
以下のために(INT I 1 =; I <= N; ++ I)
LIG [I] .POS = read()は、LIG [I] .state = read()は、

sort(lig + 1, lig + n + 1, cmpLight);
for(int i = 1; i <= n; ++i)
	p[i] = lig[i].pos, s[i] = lig[i].state;
for(int i = n + 1; i >= 1; --i)
	s[i] = s[i] ^ s[i - 1];
	
for(int i = 1, l, r; i <= m; ++i) {
	l = read(), r = read();
	l = lower_bound(p + 1, p + n + 1, l) - p;
	r = upper_bound(p + 1, p + n + 1, r) - p - 1;
	if(l <= r) {
		addE(l, r + 1, i), addE(r + 1, l, i);
	}
}

for(int i = 1; i <= n + 1; ++i)
	if(!fa[i]) {
		fa[i] = i;
		dfs(i);
		if(cntOne & 1) {
			puts("-1");
			return 0;
		}
	}

int cnt = 0;
for(int i = 1; i <= n + 1; ++i)
	if(dif[i] & 1)
		vis[fe[i]] = true, ++cnt;

printf("%d\n", cnt);
for(int i = 1; i <= m; ++i)
	if(vis[i])
		printf("%d ", i);
putchar('\n');
return 0;

}

おすすめ

転載: www.cnblogs.com/Lskkkno1/p/12568984.html