Description

题库链接

给出平面上 \(n\) 个点,一开始你可以选任何一个点作为起点,接着对于每一个你在的位置,你可以选取一个未走过的点。将路径(线段)上所有的点均选上(包括起点终点),并走到选择的那个点上。询问选的点的个数 \(\geq 4\) 的方案数。区别不同的方案,只需要路径不一样即可。

\(1\leq n\leq 20\)

Solution

状压 \(dp\) 。

先预处理出两点间路径上会经过的点。 \(dp\) 的时候需要选择路径上不会经过未选择点的方案走。

复杂度 \(O(n^3+2^nn^2)\) 。

Code

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 20+5, SIZE = (1<<20)+5, yzh = 100000007; struct point {
int x, y;
point (int _x = 0, int _y = 0) {x = _x, y = _y; }
point operator - (const point &b) const {return point(x-b.x, y-b.y); }
int operator * (const point &b) const {return x*b.y-y*b.x; }
}a[N];
int n, mp[N][N], bin[N], f[SIZE][N], cnt[SIZE], ans; void check(int x, int y) {
int mxx = max(a[x].x, a[y].x), mnx = min(a[x].x, a[y].x);
int mxy = max(a[x].y, a[y].y), mny = min(a[x].y, a[y].y);
for (int i = 1; i <= n; i++)
if (i != x && i != y)
if ((a[y]-a[x])*(a[i]-a[x]) == 0)
if (a[i].x >= mnx && a[i].x <= mxx && a[i].y >= mny && a[i].y <= mxy)
mp[x][y] |= bin[i-1];
}
void work() {
scanf("%d", &n);
bin[0] = 1; for (int i = 1; i <= n; i++) bin[i] = bin[i-1]<<1;
for (int i = 1; i <= bin[n]; i++) cnt[i] = cnt[i-lowbit(i)]+1;
for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].x, &a[i].y);
for (int i = 1; i <= n; i++) for (int j = i+1; j <= n; j++) check(i, j);
f[0][0] = 1;
for (int i = 0; i < bin[n]; i++)
for (int j = 0; j <= n; j++) if (f[i][j])
for (int k = 1; k <= n; k++) if (!(bin[k-1]&i)) {
int x = j, y = k; if (x > y) swap(x, y);
if ((i&mp[x][y]) == mp[x][y]) (f[i|bin[k-1]][k] += f[i][j]) %= yzh;
}
for (int i = 0; i < bin[n]; i++) if (cnt[i] >= 4)
for (int j = 1; j <= n; j++) (ans += f[i][j]) %= yzh;
printf("%d\n", ans);
}
int main() {work(); return 0; }

[CQOI 2018]解锁屏幕的更多相关文章

  1. Loj 2536 解锁屏幕

    Loj 2536 解锁屏幕 状态比较显然的状压 \(dp\) ,设 \(f[S][i]\) 表示连接 \(S\) 集合中的点,最后到的点是 \(i\) 的方案数. 转移时,枚举一个 \(j\notin ...

  2. Activator 通过SSH解锁屏幕等手势操作

    来源:https://qunwang6.github.io/blog/Activator/ Activator 发表于 2015-10-24   |   分类于 iOS Activator Activ ...

  3. bzoj5299: [Cqoi2018]解锁屏幕

    题目链接 bzoj 5299: [Cqoi2018]解锁屏幕 题解 很水的装压dp,相信没人需要看题解.... dp[i][j]表示状态为i最后一个到的点为j,然后转移就很好写了 不过 我读入优化没读 ...

  4. BZOJ5299:[CQOI2018]解锁屏幕(状压DP)

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

  5. 【BZOJ5299】【CQOI2018】解锁屏幕(动态规划,状态压缩)

    [BZOJ5299][CQOI2018]解锁屏幕(动态规划,状态压缩) 题面 BZOJ 洛谷 Description 使用过Android手机的同学一定对手势解锁屏幕不陌生.Android的解锁屏幕由 ...

  6. [Luogu] P4460 [CQOI2018]解锁屏幕

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

  7. P4460 [CQOI2018]解锁屏幕

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

  8. 「杂录」CQOI 2018 背板记

    背景 经过一天天的等待,终于迎来了\(CQOI2018\),想想\(NOIp\)过后到现在,已经有了快要半年了,曾经遥遥无期,没想到时间一转眼就过去了-- 日志 \(Day0\) 因为明天就要考试了, ...

  9. [CQOI 2018]异或序列&[Codeforces 617E]XOR and Favorite Number

    Description 题库链接1 题库链接2 已知一个长度为 \(n\) 的整数数列 \(a_1,a_2,\cdots,a_n\) ,给定查询参数 \(l,r\) ,问在 \([l,r]\) 区间内 ...

随机推荐

  1. mongodb 命令行安装

    因为下载zip的文件速度快,所以就使用了zip,zip格式的解压完后需要使用命令行安装,步骤大致如下: 1,首先创建一个文件叫mongo的文件,里面包含了数据库存放的目录以及日志,然后在指定的目录下创 ...

  2. js框操作-----Selenium快速入门(八)

    js框,就是JavaScript中的警告框(alert),确认框(confirm),提示框(prompt),他们都是模态窗口.什么是模态窗口,大家可以自行百度一下,简单说就是弹出的窗口是在最顶端的,你 ...

  3. JAVA 从头开始<五>

    一.反编译 java代码 javac编译后的class文件,想要看得懂,需要使用反编译工具 使用bin目录下的java开发工具(javap.exe) 二.构造函数 三.构造代码块 1.类中可能有多个构 ...

  4. 【自动化专题】selenium如何轻松搞定文件上传

    使用selenium做自动化时,我们经常会遇到的一个让人头疼的问题就是文件上传. 问题的难点在于selenium无法识别并操作Windows窗口,若我们可以绕过弹出框直接把文件信息上传给选择按钮,难点 ...

  5. shiro之深度解析FormAuthenticationFilter

      shiro是我们在项目经常使用到的权限管理框架,本文我们就重点来分析FormAuthenticationFilter的验证过程. FormAuthenticationFilter 1.继承结构   ...

  6. laravel 的passport Oauth 认证登录请求 的 oauth_token 重置

    laravel 的passport Oauth 认证登录请求 的 oauth_token 重置    使用API登录认证是需要获取访问令牌,方法为: 参数: grant_type —— 密码模式固定为 ...

  7. hello lua

    http://manual.luaer.cn/ http://www.lua.org/pil/contents.html #include <cstdio> #include <st ...

  8. win32 音视频相关 api

    waveInGetNumDevs waveInGetDevCaps waveInOpen waveInGetDevCaps waveInPrepareHeader waveInAddBuffer wa ...

  9. vue 学前班001(基础概念)

    1  学习目标 通过这一节,你会学会: 1.目前前端技术使用的趋势 2.什么是MVVM 3.Vue.js的两大核心 4.Vue.js的适用场景  诞生背景 近几年来,得益于手机设备的普及和性能的提升, ...

  10. Android studio 安装的安装若干问题

    1.在国内如何更新android sdk? 由于众所周知的某些原因,我们无法直接连接android sdk的更新服务更新sdk,所以可以通过国内的ftp站点把常用的sdk组件如android plat ...