题意:有1~N,n(1e5)个嫌疑人,有m个人说真话,每个人的陈述都形如X是凶手,或X不是凶手。现在给出n,m及n个陈述(以+x/-X表示)要求输出每个人说的话是true ,false or notdefine.

题解:模拟,依次假设每个人是犯人,统计说真话的有几个,如果 ==m 就符合。

现在考虑notdefine:当符合的情况数大于1时,就说明有notdefine。

因为枚举时,某一对-y-x,x是凶手时,-x是假话-y是真话,y是凶手时,-x真话-y假话。而其他人的陈述都与xy无关

所以模拟的方法如下://想法很多。

/*wa

如果一个人说的是+x,那么要么true,要么false。

如果是-x那么如果x是犯人则false,如果不是犯人,可能是true可能是not define(x可能是犯人的情况) .

*/

/*wa的想法:跳过

一个ans[x]数组每次有符合的情况,对每个说真话的人i,ans[i]++,

如果没有多种情况时,根据ans 0,1 情况输出,

否则对于ans>1的输出notdifine

*/

正确逻辑记录任意一个人是凶手时是否满足m句话成立,同时统计成立的情况数def。若def=1,则答案没有notdefine

否则对于+x,x若不可能是凶手(是凶手时不满足条件)puts lie, 若可能是凶手(他是凶手满足条件,同时有多组情况成立。换言之,别人是凶手,也满足条件)puts not define.

//说得很绕,逻辑就是如此。

判断代码如下:

if (cnt == m)def++,ans[x]=1;//def 情况数,ans为i满足条件的记录

if (def != 1)def = 0;
for (int i = 1; i <= n; i++) {

if (a[i] > 0)
if (ans[a[i]] == 0)puts("Lie"); else if (def)puts("Truth"); else puts("Not defined");
else
if (ans[-a[i]] == 0)puts("Truth"); else if (def)puts("Lie"); else puts("Not defined");
}

然后注意记录某人是否可能成为凶手时,O(1)判断,否则会T

具体做法是预处理数组x,y保存  说i是凶手 的人数  ,及否认i是凶手 的人数,再保存一下否认语句的总数k。

然后对于每个i如果x[i]+(k-y[i])==m则他是凶手,

这个公式的具体意思是 当i是凶手时 说i是凶手的个数加上 又没有说i不是凶手的人的个数等于m。。。//真的绕orz

ac代码:

#include<iostream>
#define N 100001
#define _for(i, a, b) for (int i = (a); i<(b); ++i)
using namespace std;
int a[N], x[N], y[N], l[N], t = , k = ;
int main() {
int n, m;
cin >> n >> m;
_for(i, , n) { cin >> a[i]; if (a[i]>)x[a[i]]++; else y[-a[i]]++, k++; }
_for(i, , n + ) if (x[i] + k - y[i] == m)t++, l[i] = ;
if (t != ) t = ;
_for(i, , n)if (a[i] > ) cout << (!l[a[i]] ? "Lie" : t ? "Truth" : "Not defined") << endl;
else cout << (!l[-a[i]] ? "Truth" : t ? "Lie" : "Not defined") << endl;
}

CodeForces - 156B Suspects 逻辑 线性 想法 题的更多相关文章

  1. codeforces 657C - Bear and Contribution [想法题]

    题目链接: http://codeforces.com/problemset/problem/657/C ----------------------------------------------- ...

  2. CodeForces - 798D Mike and distribution 想法题,数学证明

    题意:给你两个数列a,b,你要输出k个下标,使得这些下标对应的a的和大于整个a数列的和的1/2.同时这些下标对应的b //题解:首先将条件换一种说法,就是要取floor(n/2)+1个数使得这些数大于 ...

  3. CodeForces - 55C Pie or die 想法题(猜程序)

    http://codeforces.com/problemset/problem/55/C 题意:一个博弈. 题解:瞎猜,目前不清楚原理 #include<iostream> #inclu ...

  4. Codeforces 156B Suspects——————【逻辑判断】

    Suspects Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  5. CodeForces 156B Suspects(枚举)

    B. Suspects time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  6. codeforces 584E Anton and Ira [想法题]

    题意简述: 给定一个$1$到$n(n<=2000)$的初始排列以及最终排列 我们每次可以选取位置为$i$和$j$的 并交换它们的位置 花费为$ |i-j| $ 求从初始状态变换到末状态所需最小花 ...

  7. codeforces gym 100345I Segment Transformations [想法题]

    题意简述 给定一个由A C G T四个字母组成的密码锁(每拨动一次 A变C C变G G变T T变A) 密码锁有n位 规定每次操作可以选取连续的一段拨动1~3次 问最少几次操作可以将初始状态变到末状态 ...

  8. codeforces 11 B.Jumping Jack 想法题

    B. Jumping Jack Jack is working on his jumping skills recently. Currently he's located at point zero ...

  9. CodeForces 111B - Petya and Divisors 统计..想法题

    找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...

随机推荐

  1. ios开发之--CGRectGetXxx方法图解 和代码NSLog输出值

    - (void)test { CGRect rect = CGRectMake(, , , ); // 最小Y坐标,即矩形的顶部top y坐标: minY = rect.y = 20.000000 N ...

  2. windows 下获取当前进程的线程数量

    #include <TlHelp32.h> int get_thread_amount() { ; ]; PROCESSENTRY32 pe32; pe32.dwSize = sizeof ...

  3. 【Python】Excel处理

    1.包导入 from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.compat import r ...

  4. PostgreSQL流复制

    原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组 ...

  5. [Linux] 特殊文件 /dev/zero

    /dev/zero 是类 Unix 系统中一个特殊的文件,当读取该文件时,它会提供无限的空字符 null.它的一个主要用途是提供字符流来初始化数据存储,也就是使用空字符覆盖目标数据.另一个常见的用法是 ...

  6. C语言中如何计算时间差

    #include <time.h>   #include <stdio.h>   int main()   {       time_t start ,end ;        ...

  7. 无刷新上传图片以及使用C#语言

    写这个纯属是给自己一个记忆啦 一.前台的代码以及调用的js <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtm ...

  8. ip防刷脚本

    #!/bin/sh #防刷脚本 #env ACCESS_PATH=/home/wwwlogs ACCESS_LOG=y.log IPTABLES_TOP_LOG=iptables_top.log DR ...

  9. iOS 在已有项目添加CoreData

    本文转载至 http://cnbin.github.io/blog/2016/03/11/ios-zai-yi-you-xiang-mu-tian-jia-coredata/ 如果是新项目很好说,新建 ...

  10. linux-find【递归搜索文件名】

    1 命令格式: $ find <指定目录> <指定条件> <指定动作>   最常见示例:查找文件名(忽略大小写) $find . -iname sqlquery.j ...