zoukankan      html  css  js  c++  java
  • [BZOJ1188/Luogu3185][HNOI2007]*游戏

    题目链接:

    BZOJ1188

    Luogu3185

    博弈论。

    首先,每一堆石子都是互相独立,不影响的,那么就只需求解每一堆的(SG)函数(Xor)即可。

    再想,对于每一堆石子,里面的每一个石头都是互相独立的,那么就只需求解一个石子的(SG)函数,再用(p_i)(Xor)起来就得到了答案。

    那么如果是奇数不变,偶数个则为(0)

    对于一个石子的(SG)函数暴力求即可。

    妙啊喵啊

    时间复杂度 (O(Tn^3))

    #include <cstdio>
    #include <cstring>
    
    int t,n,p[25],SG[25];
    bool Bus[505];
    
    int main()
    {
    	for(scanf("%d",&t);t--;)
    	{
    		scanf("%d",&n);
    		for(int i=1;i<=n;++i)scanf("%d",&p[i]);//这里用1~n编号
    		for(int i=n;i>=1;--i)
    		{
    			memset(Bus,0,sizeof Bus);
    			for(int j=i+1;j<=n;++j)
    				for(int k=j;k<=n;++k)
    					Bus[SG[j]^SG[k]]=true;//后继状态mex
    			for(int j=0;j<=500;++j)
    				if(!Bus[j])
    					SG[i]=j,j=500;
    		}
    		int TSG=0,p1=0,p2=0,p3=0,Cnt=0;
    		for(int i=1;i<=n;++i)
    			if(p[i]&1)
    				TSG^=SG[i];//是奇数,只需xor一次
    		if(TSG)
    			for(int i=1;i<n;++i)
    				for(int j=i+1;j<=n;++j)
    					for(int k=j;k<=n;++k)
    						if(!(TSG^SG[i]^SG[j]^SG[k]))//能使Xor和变为0(必败)
    						{
    							++Cnt;
    							if(!p1)p1=i,p2=j,p3=k;
    						}
    		printf("%d %d %d
    %d
    ",p1-1,p2-1,p3-1,Cnt);
    	}
    	return 0;
    }
    
  • 相关阅读:
    meta标签设置(移动端)
    清除浮动
    响应式设计
    堆和堆排序
    O(n^2)以及O(nlogn)时间复杂度的排序算法
    求数组的最大连续子数组和
    HTTP缓存原理
    将两个有序数组合并为一个有序数组
    如何实现居中对齐
    查找字符串中出现最多的字符
  • 原文地址:https://www.cnblogs.com/LanrTabe/p/10202994.html
Copyright © 2011-2022 走看看