http://acm.fzu.edu.cn/problem.php?pid=2202
假设i是犯人,则说真话的人数=说i是犯人的人数+(说某人不是犯人的人数-说i不是犯人的人数)
若i说x是犯人,x可能是犯人时,i说的可能是真话也可能是假话;x不可能是犯人时,i说的必为假话
若i说x不是犯人,x可能是犯人时,i说的可能是真话也可能是假话;x不可能是犯人时,i说的必为真话
<span style="font-size:18px;">#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int v[100010],T[100010],F[100010],bo[100010];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
memset(T,0,sizeof(T));
memset(F,0,sizeof(F));
int Fnum=0,num=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
if(v[i]>0) T[v[i]]++;
else
{
F[v[i]*-1]++;
Fnum++;
}
}
for(int i=1;i<=n;i++)
{
if(m==T[i]+(Fnum-F[i]))
{
bo[i]=1;
num++;
}
else bo[i]=0;
}
if(num>1)
{
for(int i=1;i<=n;i++)
{
if(v[i]>0 && !bo[v[i]]) puts("Lie");
else if(v[i]<0 && !bo[v[i]*-1]) puts("Turth");
else puts("Not defined");
}
}
else
{
for(int i=1;i<=n;i++)
{
if(v[i]>0 && bo[v[i]]) puts("Truth");
else if(v[i]<0 && !bo[v[i]*-1]) puts("Truth");
else puts("Lie");
}
}
}
return 0;
}</span>