题解

什么破题,看一眼就能想出来\(n^2 2^n\)看了一眼数据范围有点虚,结果跑得飞快= =

处理出\(a[i][j]\)表示从\(i\)到\(j\)经过的点的点集

然后\(f[i][S]\)表示最后一个点在\(i\)处,经过的点集为\(S\),方案数是多少

然后枚举一个不在\(S\)中的点\(j\)看看\(a[i][j]\)是否全部被\(S\)包含即可

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int, int>
#define pdi pair<db, int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 1000005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template <class T>
void read(T &res) {
res = 0;
char c = getchar();
T f = 1;
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template <class T>
void out(T x) {
if (x < 0) {
x = -x;
putchar('-');
}
if (x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 100000007;
int N, pos[(1 << 20) + 5];
int a[25][25];
int f[21][(1 << 20) + 5], cnt[(1 << 20) + 5];
struct Point {
int x, y;
Point(int _x = 0, int _y = 0) {
x = _x;
y = _y;
}
friend Point operator+(const Point &a, const Point &b) { return Point(a.x + b.x, a.y + b.y); }
friend Point operator-(const Point &a, const Point &b) { return Point(a.x - b.x, a.y - b.y); }
friend int operator*(const Point &a, const Point &b) { return a.x * b.y - a.y * b.x; }
friend int dot(const Point &a, const Point &b) { return a.x * b.x + a.y * b.y; }
int norm() { return x * x + y * y; }
} P[25];
int inc(int a, int b) { return a + b >= MOD ? a + b - MOD : a + b; }
int mul(int a, int b) { return 1LL * a * b % MOD; }
int lowbit(int x) { return x & (-x); }
void update(int &x, int y) { x = inc(x, y); }
void Solve() {
read(N);
for (int i = 1; i <= N; ++i) {
read(P[i].x);
read(P[i].y);
}
for (int i = 1; i <= N; ++i) {
for (int j = i + 1; j <= N; ++j) {
a[i][j] |= (1 << i - 1) | (1 << j - 1);
for (int k = 1; k <= N; ++k) {
if (k == i || k == j) continue;
if ((P[k] - P[i]) * (P[j] - P[i]) == 0 && dot(P[k] - P[i], P[j] - P[i]) >= 0 &&
(P[k] - P[i]).norm() < (P[j] - P[i]).norm()) {
a[i][j] |= (1 << k - 1);
}
}
a[j][i] = a[i][j];
}
}
for (int i = 0; i < N; ++i) pos[1 << i] = i + 1;
for (int i = 1; i <= N; ++i) {
f[i][1 << i - 1] = 1;
}
for (int S = 1; S < (1 << N); ++S) {
for (int T = S; T; T -= lowbit(T)) {
int h = pos[lowbit(T)];
if (!f[h][S]) continue;
for (int j = 1; j <= N; ++j) {
if ((S & (1 << j - 1)) == 0) {
if ((a[h][j] & (S | (1 << j - 1))) == a[h][j]) update(f[j][S ^ (1 << j - 1)], f[h][S]);
}
}
}
}
int ans = 0;
for (int S = 1; S < (1 << N); ++S) {
cnt[S] = cnt[S - lowbit(S)] + 1;
if (cnt[S] >= 4) {
for (int i = 1; i <= N; ++i) update(ans, f[i][S]);
}
}
out(ans);
enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in", "r", stdin);
#endif
Solve();
return 0;
}

【LOJ】#2536. 「CQOI2018」解锁屏幕的更多相关文章

  1. loj#2531. 「CQOI2018」破解 D-H 协议(BSGS)

    题意 题目链接 Sol 搞个BSGS板子出题人也是很棒棒哦 #include<bits/stdc++.h> #define Pair pair<int, int> #defin ...

  2. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  3. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  4. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  5. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  6. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  7. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  8. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  9. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

随机推荐

  1. 特殊符号 UNICODE编码

    特殊符号 UNICODE编码 =================== Start ⇠  箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HTML JS CSS ⇠ & ...

  2. 【COGS2479】 HZOI2016—偏序

    http://cogs.pro/cogs/problem/problem.php?pid=2479 (题目链接) 题意 四维偏序. Solution CDQ套CDQ. 细节 第二次分治不能直接按照mi ...

  3. Java实现的一个简单的模板渲染

    代码 package com.hdwang; import java.util.HashMap; import java.util.Map; /** * Created by hdwang on 20 ...

  4. C++并发编程实战---阅读笔记

    1. 当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”.如果传递了一个临时变量,而不是一个命名的变量:C++编译器会将其解析为函数声明,而不是类型对象的定义. 例如: class ...

  5. 模拟QQ聊天与视频聊天同时进行-------java基础知识总结

    前言:多线程的知识 代码: package com.day13.math; /** * 类说明 :模拟QQ聊天与视频聊天同时进行 * @author 作者 : chenyanlong * @versi ...

  6. Java基础-Java中的并法库之线程池技术

    Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.

  7. 函数和常用模块【day05】:装饰器前奏(一)

    本节内容 定义 原则 实现装饰器的储备知识 函数及变量 高阶函数 一.定义 1.装饰器:本质是函数. 2.功能:用来装饰其他函数,顾名思义就是,为其他的函数添加附件功能的. 二.原则 不能修改被装饰函 ...

  8. MFC Activex 开发、ocx打包成cab、部署、测试、自动升级

    小小抱怨下:也许是MFC现在用的人少的缘故.在国内和国外都基本上找不到什么全的资料.特别是ocx打包成Cab时的安装文件inf的编写方面,国内基本上是copy,抄的还一知半解.查找个资源真心的累啊.现 ...

  9. bzoj千题计划290:bzoj3143: [Hnoi2013]游走

    http://www.lydsy.com/JudgeOnline/problem.php?id=3143 计算每条边经过的概率e[] 然后经过概率多的分配的编号大,经过概率少的分配的编号小 如何计算边 ...

  10. IOS 与 PHP 通信加密,使用AES 128 CBC no padding

    这个网上的资料真实浩如烟海,但是真正有价值的屈指可数 自己尝试了一天多,终于还是搞定了. 再次要感谢网上的前辈么. 比如下面这个关于php和java端的实现: http://my.oschina.ne ...