题意可以简单这样考虑

给出n^2个集合(每个集合的元素不超过n),包含某个元素的集合至少有n个,选出最少的集合,使这些集合的并包含n个元素

n最大只有18

可以考虑状压n个元素,然后枚举n^2个集合

这样的复杂度是2^n*n^2

但是我们可以这样考虑,因为最终的集合一定包含所有的元素,所以不妨预处理出每个状态中最靠左的0的位置,

然后每次只需要考虑包含这个元素的n个集合(因为你最终一定要包含这个元素,所以不如就先包含它)

这样复杂度就降低成2^n*n

注意精度,以及两个点不一定能构成抛物线

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std; struct Pair
{
double x, y;
Pair() {}
Pair(double _x, double _y):x(_x), y(_y) {}
}p[];
int Map[][];
vector<int> State;
int f[(<<())], Hash[(<<())];
Pair Get(Pair A, Pair B)
{
if(A.x == B.x && A.y == B.y) B.x = A.x+;
double y = (B.y*A.x - B.x*A.y)/(B.x*B.x*A.x - A.x*A.x*B.x);
double x = (A.y - y*A.x*A.x)/A.x;
return Pair(x, y);
}
const double eps = 1e-;
bool On(Pair A, Pair X)
{
return abs(X.y - A.x*X.x - A.y*X.x*X.x) < eps;
}
int n, m, T;
int And(int X, int i)
{
for(int j = ; j <= n; j++)
if(Map[i][j]) X = X|(<<(j-));
return X;
}
void debug(int X)
{
for(int i = ; i < n; i++) if(X&(<<i)) cout<<; else cout<<;
cout<<endl;
}
int main()
{
for(int i = ; i <= (<<)-; i++)
{
for(int j = ; j <= ; j++)
if((i&(<<j)) == ) { Hash[i] = j+; break; }
}
cin>>T;
while(T--)
{
cin>>n>>m;
memset(Map, , sizeof(Map));
memset(f, , sizeof(f));
State.clear(); State.push_back();
for(int i = ; i <= n; i++) cin>>p[i].x>>p[i].y;
int tot = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
{
Pair temp = Get(p[i], p[j]);
if(temp.y >= ) continue;
for(int k = ; k <= n; k++)
if(On(temp, p[k]))
Map[(i-)*n+j][k] = ;
}
int k = , M = (<<n)-;
while(f[M] == )
{
int sz = State.size();
for(int s = k; s < sz; s++)
{
for(int i = ; i <= n; i++)
{
int s2 = And(State[s], (Hash[State[s]]-)*n+i);
if(f[s2] == && s2 != )
{
f[s2] = f[State[s]] + ;
State.push_back(s2);
}else
f[s2] = min(f[s2], f[State[s]] + );
}
}
k = sz;
}
cout<<f[(<<n)-]<<endl;
}
}

【noip2016d2t3】状压DP+巧妙优化的更多相关文章

  1. 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...

  2. NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]

    我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS   ...

  3. Codeforces 917C - Pollywog(状压 dp+矩阵优化)

    UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...

  4. BZOJ4000 [TJOI2015]棋盘 【状压dp + 矩阵优化】

    题目链接 BZOJ4000 题解 注意题目中的编号均从\(0\)开始= = \(m\)特别小,考虑状压 设\(f[i][s]\)为第\(i\)行为\(s\)的方案数 每个棋子能攻击的只有本行,上一行, ...

  5. POJ1038 Bugs Integrated, Inc 状压DP+优化

    (1) 最简单的4^10*N的枚举(理论上20%) (2) 优化优化200^3*N的枚举(理论上至少50%) (3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%) (4) ...

  6. bzoj2004 矩阵快速幂优化状压dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...

  7. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

  8. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  9. POJ1185 状压dp(二进制//三进制)解法

    很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...

随机推荐

  1. 【Java】Maven安装、Eclipse配置以及相关错误解决集合

    作者呕血总结,下面写的每一个错误我都遇过 · Maven安装 · Eclipse配置 · Maven安装 安装前请确保已经装有JDK. 一. 准备Maven程序包 到官网https://maven.a ...

  2. 12.1.0.2自适应特性导致SQL性能下降

    背景介绍 在升级到12.1.0.2.0数据库版本后,在使用12c中引入的自适应特性默认配置的情况下,可能引起SQL性能的下降. 问题现象升级到12.1.0.2.0后,SQL语句性能可能出现下降. 影响 ...

  3. Linux相关知识

    1.设置代理 sudo vi /etc/apt/apt.conf Acquire::http::Proxy "http://proxy_address:8080/"; 2.生成 s ...

  4. Java的“Goto”与标签

    goto在Java中是一个保留字,但在语言中并没有用到它:Java没有goto.但是,Java也能完成一些类似于跳转的操作,主要是依靠:标签. 为什么要使用标签 在迭代语句中,我们可以使用break和 ...

  5. java通过FreeMarker模板生成Excel文件之.ftl模板制作

    关于怎么通过freemarker模板生成excel的文章很多,关键点在于怎么制作模板文件.ftl 网上的办法是: (1)把Excel模板的格式调好,另存为xml文件 (2)新建一个.ftl文件,把xm ...

  6. httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例

    httpd配置内容 httpd2.2 配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服务脚本: /etc/rc.d/init.d/ ...

  7. linux mysql5.7 安装、 开机启动

    一.安装 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz h ...

  8. Struts2之基于配置的字段校验

    上一篇struts2之输入校验介绍了手动完成输入校验,也即依靠重写validate方法和validateXxx方法,指定请求某个方法时对传入的参数进行校验. 本篇介绍基于配置的字段校验.下面是登录的常 ...

  9. storm集群安装部署

    安装步骤: 搭建Zookeeper集群: 安装Storm依赖库: 下载并解压Storm发布版本: 修改storm.yaml配置文件: 启动Storm各个后台进程. 1. 搭建Zookeeper集群 这 ...

  10. mysql in和exists性能比较和使用【转】

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...