大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
小 A 和小 B 在玩一个游戏。
首先,小 A 写了一个由 0 和 1 组成的序列 S,长度为 N。
然后,小 B 向小 A 提出了 M 个问题。
在每个问题中,小 B 指定两个数 l 和 r,小 A 回答 S[l∼r] 中有奇数个 1 还是偶数个 1。
机智的小 B 发现小 A 有可能在撒谎。
例如,小 A 曾经回答过 S[1∼3] 中有奇数个 1,S[4∼6] 中有偶数个 1,现在又回答 S[1∼6] 中有偶数个 1,显然这是自相矛盾的。
请你帮助小 B 检查这 M 个答案,并指出在至少多少个回答之后可以确定小 A 一定在撒谎。
即求出一个最小的 k,使得 01 序列 S 满足第 1∼k 个回答,但不满足第 1∼k+1 个回答。
输入格式
第一行包含一个整数 N,表示 01 序列长度。
第二行包含一个整数 M,表示问题数量。
接下来 M 行,每行包含一组问答:两个整数 l 和 r,以及回答 even 或 odd,用以描述 S[l∼r] 中有偶数个 1 还是奇数个 1。
输出格式
输出一个整数 k,表示 01 序列满足第 1∼k 个回答,但不满足第 1∼k+1 个回答,如果 01 序列满足所有回答,则输出问题总数量。
数据范围
N≤109,M≤10000
输入样例:
10
5
1 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd
输出样例:
3
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int f[N],d[N];
unordered_map<int,int>m;
int ctx;
int Find(int x){
if(x != f[x]){
int t = f[x];
f[x] = Find(f[x]);
d[x] = (d[x] + d[t]);
}
return f[x];
}
int get(int x){
if(m.count(x) == 0)m[x] = ++ ctx;
return m[x];
}
int main(){
int n;
string type;
cin>>n>>n;
int x,y;
int res = 0;
for(int i = 0;i < N;i ++)f[i] = i,d[i] = 0;
for(int i = 1;i <= n;i ++){
cin>>x>>y>>type;
x = get(x - 1),y = get(y);
int a = Find(x),b = Find(y);
if(type == "even"){
if(a == b && abs(d[x] - d[y]) % 2 && !res)res = i;
else{
f[a] = b;
d[a] = (d[y] - d[x]) % 2;
}
}
else{
if(a == b && (abs(d[x] - d[y] - 1) % 2) == 1 && !res){
res = i;
}
else{
f[a] = b;
d[a] = (1 + d[y] - d[x]) % 2;
}
}
}
if(res > 0)cout<<res - 1<<endl;
else cout<<n<<endl;
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169102.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...