zoukankan      html  css  js  c++  java
  • 联赛模拟测试23 D. 真相 思维题

    题目描述



    分析


    最后判断时,我们把所有 (k) 相等的说第一类话的人放在一个集合
    判断这些人说真话时得到的结果是否等于 (k) 即可,此时另外的人一定都说假话

    代码

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<cstring>
    #define rg register
    const int maxn=1e6+5,maxm=1e3+5;
    int t,n,h[maxn],tot=1,val[maxn],sta[maxn],tp,js,allfake,tj[maxn][2],jl,jud2;
    bool vis[maxn];
    char s[maxm];
    struct asd{
    	int to,nxt,val;
    }b[maxn];
    void ad(int aa,int bb,int cc){
    	b[tot].to=bb;
    	b[tot].nxt=h[aa];
    	b[tot].val=cc;
    	h[aa]=tot++;
    }
    void dfs(int now,int fa,int lat){
    	if(lat==1) js++;
    	for(rg int i=h[now];i!=-1;i=b[i].nxt){
    		rg int u=b[i].to;
    		if(u==fa) continue;
    		if(lat==1) dfs(u,now,b[i].val);
    		else dfs(u,now,b[i].val^1);
    	}
    }
    void dfs2(int now,int fa,int lat){
    	if(now==n){
    		jl=lat;
    		return;
    	}
    	for(rg int i=h[now];i!=-1;i=b[i].nxt){
    		rg int u=b[i].to;
    		if(u==fa) continue;
    		if(lat==1) dfs2(u,now,b[i].val);
    		else dfs2(u,now,b[i].val^1);
    	}
    }
    int main(){
    	scanf("%d",&t);
    	while(t--){
    		scanf("%d",&n);
    		tot=1;
    		tp=allfake=0;
    		for(rg int i=0;i<=n;i++){
    			h[i]=-1;
    			val[i]=0;
    			vis[i]=0;
    		}
    		rg int haha;
    		rg bool jud=0;
    		for(rg int i=1;i<=n;i++){
    			scanf("%s",s+1);
    			haha=i+1;
    			if(haha>n) haha-=n;
    			if(s[1]=='+'){
    				ad(haha,i,1);
    				ad(i,haha,1);
    			} else if(s[1]=='-'){
    				ad(haha,i,0);
    				ad(i,haha,0);
    			} else {
    				scanf("%d",&val[i]);
    				sta[++tp]=i;
    			}
    		}
    		for(rg int i=1;i<=n;i++){
    			tj[val[i]][0]=tj[val[i]][1]=0;
    		}
    		if(tp==0){
    			jl=1;
    			dfs2(1,0,1);
    			if((b[tot-2].val^jl)==0) jud=1;
    		} else {
    			for(rg int i=1;i<=tp;i++){
    				js=0;
    				vis[val[sta[i]]]=1;
    				dfs(sta[i],0,0);
    				allfake+=js;
    				tj[val[sta[i]]][0]+=js;
    				js=0;
    				dfs(sta[i],0,1);
    				tj[val[sta[i]]][1]+=js;
    			}
    			for(rg int i=1;i<=tp;i++){
    				if(allfake-tj[val[sta[i]]][0]+tj[val[sta[i]]][1]==val[sta[i]]) jud=1;
    			}
    			if(vis[allfake]==0) jud=1;
    		}
    		if(!jud) printf("inconsistent
    ");
    		else printf("consistent
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    iOS iPad开发之Modal
    iOS SVN终端指令
    iOS iPad开发之UIPopoverController的使用
    iOS Xcode6和Xcode5的区别?
    算法 查找算法--二分查找
    算法 排序算法--快速排序
    算法 排序算法--选择排序
    XCode签名证书死活不能选
    IOS7 适配时导航栏变黑
    Xcode Provisioning 路径
  • 原文地址:https://www.cnblogs.com/liuchanglc/p/13879707.html
Copyright © 2011-2022 走看看