https://zybuluo.com/ysner/note/1144441

题面

戳我

  • \(n\leq20\)

    解析

    这数据范围显然是状压。
    可以发现,区分不同方案的标准是选的点终结点
    于是设\(dp[now][s]\)表示当选点状态为\(now\),最后选的点为\(s\)时的方案数。
    然后预处理一下连两点时中间经过的其它点\(way[i][j]\)(这里注意判断条件问题,不能少等于号)。
    再通过\(queue\)储存、延伸状态,统计时枚举下一个点,枚举中间点判是否路过未经过的点即可。
    目测复杂度\(O(2^nn^3)\)
    但是我发现我傻逼了,好像\((way[i][j]\&now)!=way[i][j])\)就可以\(O(1)\)判不合法呢。
    于是复杂度降到\(O(2^nn^2)\)。
    然后因用\(queue\)被卡爆,被迫改成暴枚状态。。。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define mp make_pair
#define ll long long
#define re register
#define il inline
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define fp(i,a,b) for(re int i=a;i<=b-1;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=1<<20,mod=1e8+7;
int n,way[30][30],x[30],y[30],dp[30][N],now,s;
ll ans;
il int gi()
{re int x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;
}
int main()
{n=gi();fp(i,0,n) x[i]=gi(),y[i]=gi();fp(i,0,n)fp(j,0,n)fp(k,0,n)if(k!=i&&k!=j&&x[k]>=min(x[i],x[j])&&x[k]<=max(x[i],x[j])&&y[k]>=min(y[i],y[j])&&y[k]<=max(y[i],y[j]))if((y[k]-y[i])*(x[j]-x[i])==(y[j]-y[i])*(x[k]-x[i])) way[i][j]|=(1<<k);fp(i,0,n) dp[i][1<<i]=1;fp(now,0,(1<<n))fp(s,0,n){if(!(now&(1<<s))||!dp[s][now]) continue;fp(i,0,n){if((1<<i)&now) continue;if((way[s][i]&now)!=way[s][i]) continue;dp[i][now|(1<<i)]+=dp[s][now];if(dp[i][now|(1<<i)]>=mod) dp[i][now|(1<<i)]-=mod;}}fp(now,0,(1<<n)){re int tot=0,ysn=now;for(;ysn;ysn-=ysn&-ysn) ++tot;if(tot>3)fp(i,0,n) if((1<<i)&now){ans+=dp[i][now];if(ans>=mod) ans-=mod;}}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/yanshannan/p/9027997.html

[CQOI2018]解锁屏幕相关推荐

  1. [CQOI2018] 解锁屏幕

    题目背景 使用过Android 手机的同学一定对手势解锁屏幕不陌生.Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构成一个解锁图案.如下面三个例子所示: ...

  2. P4460 [CQOI2018]解锁屏幕

    算是我比较擅长的类型,自己想想就会了.普通小状压,状态傻子都能想出来.一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分.后来看讨论版...mod竟然是1e8+7!!!这不有毒吗. ...

  3. 题解 P4460 【[CQOI2018]解锁屏幕】

    题目链接:Link Problem 题目背景 使用过Android 手机的同学一定对手势解锁屏幕不陌生.Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构 ...

  4. [CQOI2018] 解锁屏幕(状压dp)

    problem luogu-P4460 solution 题面以及数据告诉我们显然是状压 dpdpdp. 设 f(s,i):f(s,i):f(s,i): 经过的点集 sss 最后一次画的点为 iii ...

  5. Windows 10系统如何使用Ctrl+Alt+Delete解锁屏幕?

    Win10系统在屏幕保护界面中只要按下随机按键或者鼠标按键都可以进入电脑界面,这样就容易被别人无意点开电脑屏幕造成资料泄漏,有没有办法可以设置解锁屏幕的触发按键呢?参见下文. 解决方法: 1.在小娜C ...

  6. android锁屏唤醒并解锁屏幕

    1.这个方法是实现锁屏状态下唤醒手机,亮屏并解锁屏幕: [java] view plain copy public static void wakeUpAndUnlock(Context contex ...

  7. android aoto未解锁,【求教】为什么我的解锁屏幕代码缺无法解锁屏幕

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我运行后报错,有谁知道吗? if(!device.isScreenOn()) { //点亮屏幕 device.wakeUp(); sleep(1000); ...

  8. android 自动亮屏解锁,android锁屏唤醒并解锁屏幕

    1.这个方法是实现锁屏状态下唤醒手机,亮屏并解锁屏幕:public static void wakeUpAndUnlock(Context context){ //屏锁管理器 KeyguardMana ...

  9. Android唤醒、解锁屏幕代码实例

    这篇文章主要介绍了Android唤醒.解锁屏幕代码实例,本文讲解了唤醒.解锁屏幕需要的权限和操作代码实例,代码中包含详细注释,需要的朋友可以参考下 所需权限: 复制代码 代码如下: < uses ...

最新文章

  1. cordova ios的问题
  2. android6.0升级名单,三星Android 6.0升级详细名单[多图]
  3. bool 变量想为什么一般初始化为FALSE 比较好?
  4. 使用smokeping监测网络
  5. linux之修改dns以及用netmask修改ip和网关
  6. PyOpenGL之3D界面详解(一)
  7. android单选按钮_Android单选按钮示例
  8. Python与MongoDB的交互
  9. mysql 多源复制 过滤_MYSQL 多源复制,过滤复制与应用场景
  10. 10.5~10.6复习与预习的进行
  11. 虚拟机服务器关机命令,ESXi主机定时开关机设置
  12. redis 可视化客户端工具
  13. 教您在Excel中批量生成二维码
  14. 移动端Web组件-Dialog对话框
  15. 测试点击屏幕次数的软件_红蜘蛛5校色仪怎么用?显示器校色及测试色域和色彩精准度详细教程...
  16. 马赛克(蒙太奇)图片生成--Python实现
  17. 怎么确定电脑上没有mysql_怎么检查电脑有没有mysql?
  18. 中点画线完整算法c语言,中点画线算法
  19. 基于Transformers库的BERT模型:一个文本情感分类的实例解析
  20. python有哪些细节描写_什么是细节描写?它又包括哪些方面?

热门文章

  1. 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名 BubbleSort
  2. 中琅可变数据软件中如何实现叠印效果
  3. 运行应用,Could not open: device
  4. 路由守卫的简单使用-登录功能
  5. matlab实例——动态心形函数及其涉及的知识点
  6. conda 命令和pip命令的区别,以及conda命令大全
  7. Python中isinstance用法
  8. 小程序实现城市列表的选择
  9. ROS 导航安装及实现(二十二)
  10. Unpopping: Solving the Image-Space Blend Problem for Smooth Discrete LOD Transitions. CGF 2007