Problem B: 故障电灯(light)
- 考虑对电灯进行差分:若第i个电灯和第i + 1个电灯状态不同,则在第i个位置上放一个球
这样我们就放置了不超过2n个球,且必然是偶数个
于是问题转化为:有m个球,每一步可以把一个球平移奇质数个位置,两个球位于相同位置则同时被消除,计算至
少多少步能消除所有球 - 然后我们发现, 假如两个东西距离为奇质数cost为1, 偶数cost为二(哥德巴赫猜想), 其余奇数的话cost为3
- 然后发现一种贪心方法, 是尽量匹配cost为1的, 然后分奇偶性各自用2覆盖,看看最后剩下的那个直接判断即可
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define mmp make_pair
#define M
using namespace std;
int read() {
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
struct Edge{
int v, c, nxt;
}e[200010];
int head[10010], tot = 1;
void build(int u, int v, int c)
{
e[++tot] = (Edge){v, c, head[u]};
head[u] = tot;
return ;
}
void insert(int u, int v, int c)
{
build(u, v, c);
build(v, u, 0);
return ;
}
int dep[10010];
int S, T;
queue<int> q;
bool bfs()
{
memset(dep, 0, sizeof(dep));
dep[S] = 1;
q.push(S);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = head[u]; i; i = e[i].nxt)
if(!dep[e[i].v]&&e[i].c)
{
dep[e[i].v] = dep[u] + 1;
q.push(e[i].v);
}
}
if(dep[T])return true;
return false;
}
int cur[10010];
int dfs(int u, int flow)
{
if(u == T)return flow;
for(int &i = cur[u]; i; i = e[i].nxt)
if(e[i].c&&dep[e[i].v] == dep[u] + 1)
{
int d = dfs(e[i].v, min(e[i].c, flow));
if(d){
e[i].c -= d;
e[i^1].c += d;
return d;
}
}
return 0;
}
int dinic()
{
int ans = 0;
while(bfs())
{
for(int i = S; i <= T; i++)
cur[i] = head[i];
int d;
while(d = dfs(S, 1e9))ans += d;
}
return ans;
}
int prime[1000010], cnt;
bool vis[10000010];
int x[1010];
int posx[1010], posy[1010];
int cnt1, cnt2;
void push(int x)
{
if(x&1)posx[++cnt1] = x;
else posy[++cnt2] = x;
}
int main(){
int N = 10000000;
vis[1] = true;
for(int i = 2; i <= N; i++)
{
if(!vis[i])prime[++cnt] = i;
for(int j = 1; j <= cnt&&i * prime[j] <= N; j++)
{
vis[i * prime[j]] = true;
if(i%prime[j] == 0)break;
}
}
vis[2] = true;
int t = read();
while(t--)
{
memset(head, 0, sizeof(head));
cnt1 = cnt2 = 0; tot = 1;
int n = read();
for(int i = 1; i <= n; i++)
{
x[i] = read();
if(i == 1||x[i - 1] != x[i] - 1)push(x[i]);
if(i> 1&&x[i - 1] != x[i] - 1)push(x[i - 1] + 1);
}
push(x[n] + 1);
S = 0, T = cnt1 + cnt2 + 1;
for(int i = 1; i <= cnt1; i++)
insert(S, i, 1);
for(int i = 1; i <= cnt1; i++)
for(int j = 1; j <= cnt2; j++)
if(!vis[max(posx[i] - posy[j], posy[j] - posx[i])])
insert(i, cnt1 + j, 1);
for(int i = 1; i <= cnt2; i++)
insert(cnt1 + i, T, 1);
int ans = dinic();
printf("%d\n", ans + (cnt1 - ans)/2 * 2 + (cnt2 - ans)/2 * 2 + (cnt1 - ans)%2 * 3);
}
return 0;
}
Problem B: 故障电灯(light)的更多相关文章
- Light OJ 1272 Maximum Subset Sum 高斯消元 最大XOR值
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011686226/article/details/32337735 题目来源:problem=12 ...
- 设计模式(15)-Facade Pattern
http://www.cnblogs.com/zhenyulu/articles/55992.html 一. 门面(Facade)模式 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象 ...
- 门面(Facade)模式(转)
转载:http://www.cnblogs.com/skywang/articles/1375447.html 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式. ...
- java并发 使用ScheduledExecutor的温室控制器--thinking in java 21.7.5
package org.rui.thread.newc; import java.text.DateFormat; import java.text.SimpleDateFormat; import ...
- hdoj Pipe&&南阳oj管道问题&&poj1039(计算几何问题...枚举)
Pipe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- js原生之一个面向对象的应用
function IElectricalEquipment() { } IElectricalEquipment.prototype = { poweron: fu ...
- 自学Zabbix3.8.2-可视化Visualisation-maps网络地图
自学Zabbix3.8.2-可视化Visualisation-maps网络地图 可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map,通过map可以了解应用的整体状况:服务器是否异常 ...
- 011.Zabbix的拓扑创建
一 Map简介 Map的作用是将各种设备用网络拓扑图的方式展示,在Zabbix中,拓扑的展示通过手动方式添加. 二 Map的添加 2.1 添加Map的背景图 #在添加Map之前可谓Map添加一个背景图 ...
- (58)zabbix网络拓扑图配置network map
zabbix网络地图介绍 “zabbix network map”可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map, 通过map可以了解应用的整体状况:服务器是否异常.网络是否有 ...
随机推荐
- Pycharm 常用快捷键与设置
pycharm高频率使用的快捷键 Ctrl+Shift+F10 运行当前的页面 Ctrl + / 注释(取消注释)选择的行 Ctrl+Shift+F 高级查找 Shift + Enter 开始新行 T ...
- @NotNull和@NotEmpty和@NotBlank 区别
1.@NotNull:不能为null,但可以为empty:用在基本类型上. 2.@NotEmpty:不能为null,而且长度必须大于0:用在集合类上面. 3.@NotBlank:只能作用在String ...
- python多进程拷贝数据
from multiprocessing import Pool,Manager import os #完成拷贝文件 def copyFile(filename,oldname,newname,que ...
- Qt实现 动态化遍历二叉树(前中后层次遍历)
binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...
- 20164322 韩玉婷-----Exp6 信息搜索与漏洞扫描
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...
- JS如何充分“压榨”浏览器
不同浏览器厂商实现的 JS 标准有所不同,这意味着 window 对象和可用的 api 也有所不同,希望不久的将来,所有浏览器都能实现统一的 JS 标准. 自己写 api 是很耗费时间跟精力的,而且变 ...
- inno安装客户端,写注册表url调用客户端
[Registry] Root: HKCR; SubKey: xxx; ValueData: "xxx"; ValueType: string; Flags: CreateValu ...
- 软件开发者路线图梗概&书摘chapter6
安排你的课程:靠自己去寻求建议,安排课程 1.阅读列表:维护一张列表,更新未读和已读 保存在公共空间 得出模式.趋势.缺口,决定下一步,得到建议 参考书目形成优先级队列 从宽泛的读起,指导者推荐 能使 ...
- [C]奇数求和
/* 用递归算法实现,输入整数n(n>0), 求1+3+5+7….+(2*n-1) 的和 */ #include<stdio.h> int add(int n); int main( ...
- 【解决】nginx 下$_SERVER['PATH_INFO'] 无法获取到内容
Apache是模块加载文件的,默认支持$_SERVER['PATH_INFO'] : 而对于Nginx下, 是不支持PATH INFO的, 也就是它不会默认设置PATH_INFO. 而因为Nginx默 ...