http://acm.fzu.edu.cn/problem.php?pid=2202
记录下正负数各有多少 再用book[i]代表说i是或不是罪犯的个数
枚举罪犯 如果当i为罪犯时 book1[i]+cnt2-book2[i]即为说真话的人数 如果该值等于m 则i有可能是罪犯 否则绝对是清白的
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
int ary[maxn],book1[maxn],book2[maxn],flag[maxn];
int n,m,cnt1,cnt2;
int main()
{
int t,i,sum;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(book1,0,sizeof(book1));
memset(book2,0,sizeof(book2));
cnt1=0,cnt2=0;
for(i=1;i<=n;i++){
scanf("%d",&ary[i]);
if(ary[i]>0){
book1[ary[i]]++;
cnt1++;
}
else{
book2[-ary[i]]++;
cnt2++;
}
}
memset(flag,0,sizeof(flag));
sum=0;
for(i=1;i<=n;i++){
if(book1[i]+cnt2-book2[i]==m){
flag[i]=1;
sum++;
}
}
for(i=1;i<=n;i++){
if(ary[i]>0){
if(flag[ary[i]]){
if(sum>1) printf("Not defined\n");
else printf("Truth\n");
}
else printf("Lie\n");
}
else{
if(flag[-ary[i]]){
if(sum>1) printf("Not defined\n");
else printf("Truth\n");
}
else{
printf("Truth\n");
}
}
}
}
return 0;
}