enlaces a los temas: Haga clic aquí
Significado de las preguntas:
entrada representa una longitud el cuerda, denota Luego entrada de línea, el siguiente entrada fila representa a la primera el medio de caracteres número es un número par; representa a la primera el medio de caracteres es el número impar. Si el primera frase es un frente por primera vez con las palabras de la contradicción, la salida .
Análisis de las ideas:
representa es incluso en esta condición, representa es una condición extraño que
es el mismo
- si es impar, es un número impar
- si es par, es un número par
es heterogénea
- si es par, es un número impar
- si es impar, es un número par
comprender:
Banda lateral derecho disjuntos-set: y están relacionados, que están en la misma colección, en cuanto a cuál es la relación depende de la cantidad de peso
campo Extensión de disjuntos-set: la colección siempre que una condición es verdadera, entonces todas las condiciones restantes estableció inevitable.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int N = 40010, base = N / 2;
int n, m;
int p[N];
map<int,int> mp;
int get(int x) // 在线离散化
{
if(mp.count(x) == 0) mp[x] = ++n;
return mp[x];
}
int find(int x)
{
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
int main()
{
scanf("%d%d", &n, &m);
n = 0; // 用于离散化
for(int i = 1; i < N; ++i) p[i] = i; // 初始化
int res = m;
for(int i = 1; i <= m; ++i)
{
int a, b;
char op[6];
scanf("%d%d%s", &a, &b, op);
if(res != m) continue;
a = get(a - 1), b = get(b);
if(op[0] == 'e') // 同类
{
if(find(a + base) == find(b)) // 有矛盾
{
res = i - 1;
break; // 数据没有输入完,可以break
}
p[find(a)] = find(b);
p[find(a + base)] = find(b + base);
}
else // 异类
{
if(find(a) == find(b)) // 有矛盾
{
res = i - 1;
break;
}
p[find(a)] = find(b + base);
p[find(a + base)] = find(b);
}
}
printf("%d\n", res);
return 0;
}