zoukankan      html  css  js  c++  java
  • BZOJ5299: [Cqoi2018]解锁屏幕

    BZOJ5299: [Cqoi2018]解锁屏幕

    https://lydsy.com/JudgeOnline/problem.php?id=5299

    分析:

    • 傻逼状压,(O(n^22^n))跑的飞快。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    #define mod 100000007
    int flg[22][22],pt[(1<<20)+10];
    int f[21][(1<<20)+10],cnt[(1<<20)+10];
    int xx[22],yy[22],n;
    bool check(int x,int y,int z) {
    	if(xx[z]<min(xx[x],xx[y])||xx[z]>max(xx[x],xx[y])||yy[z]<min(yy[x],yy[y])||yy[z]>max(yy[x],yy[y])) return 0;
    	return (yy[y]-yy[x])*(xx[z]-xx[x])==(yy[z]-yy[x])*(xx[y]-xx[x]);
    }
    int main() {
    	scanf("%d",&n);
    	int i,j,k,s;
    	for(i=1;i<=n;i++) scanf("%d%d",&xx[i],&yy[i]);
    	for(i=1;i<=n;i++) {
    		for(j=1;j<=n;j++) if(i!=j) {
    			for(k=1;k<=n;k++) if(i!=k&&j!=k) {
    				if(check(i,j,k)) flg[i][j]|=(1<<(k-1));
    			}
    		}
    	}
    	for(i=1;i<=n;i++) f[i][1<<(i-1)]=1,pt[1<<(i-1)]=i;
    	int mask=(1<<n)-1;
    	for(s=0;s<=mask;s++) cnt[s]=cnt[s>>1]+(s&1);
    	for(s=1;s<=mask;s++) {
    		for(i=1;i<=n;i++) if(f[i][s] && (s&(1<<(i-1)))) {
    			int t=mask-s;
    			for(j=pt[t&(-t)];t;t-=t&(-t),j=pt[t&(-t)]) if(i!=j && (!(s&(1<<(j-1)))) && ((flg[i][j]|s)==s)) {
    				f[j][s|(1<<(j-1))]=(f[j][s|(1<<(j-1))]+f[i][s])%mod;
    			}
    		}
    	}
    	int ans=0;
    	for(s=1;s<=mask;s++) {
    		if(cnt[s]>=4) {
    			for(i=1;i<=n;i++) if(s&(1<<(i-1))) ans=(ans+f[i][s])%mod;
    		}
    	}
    	printf("%d
    ",ans);
    }
    
  • 相关阅读:
    化DataSet对象并压缩
    数据库连接
    触发器
    事务
    关于C语言的宏
    GCC中的一些参数
    《tkinter实用教程六》tkinter ttk.Label 控件
    《tkinter实用教程三》ttk.Button 控件
    5. 替换空格
    《tkinter实用教程二》ttk 子模块
  • 原文地址:https://www.cnblogs.com/suika/p/10230081.html
Copyright © 2011-2022 走看看