灯 & 树
这回是两道题一起...
[USACO09NOV]灯
[中山市选2009]树
题意:给您一些灯,以及一些边。每次改变一盏灯的时候,它相邻的灯也会变。求把灯状态全部转换的最小操作次数。
解:
解异或方程组的经典题。
我们对于灯列一个方程组,如果i对j有影响就令a[j][i] = 1
然后解出上三角矩阵。
解出来a[i][i] = 1的地方就是确定的灯。
0就是可有可无的灯。
然后我们大暴力搜索可有可无的灯。遇到确定的灯就根据已经搜索的那些来确定。
#include <cstdio>
#include <bitset>
#include <algorithm>
const int N = ; int n, p[N], ans = 0x3f3f3f3f;
std::bitset<N> a[N]; inline void Gauss() {
for(int i = ; i < n; i++) {
for(int j = i; j <= n; j++) {
if(a[j][i]) {
std::swap(a[i], a[j]);
break;
}
}
if(!a[i][i]) {
continue;
}
for(int j = i + ; j <= n; j++) {
if(a[j][i]) {
a[j] ^= a[i];
}
}
}
return;
} inline void DFS(int k, int s) {
if(s >= ans) {
return;
}
if(k < ) {
ans = std::min(ans, s);
return;
}
if(a[k][k]) {
int t = a[k][n + ];
for(int i = k + ; i <= n; i++) {
if(a[k][i]) {
t ^= p[i];
}
}
if(t) { /// need press
p[k] = ;
DFS(k - , s + );
p[k] = ;
}
else {
DFS(k - , s);
}
}
else {
DFS(k - , s);
p[k] = ;
DFS(k - , s + );
p[k] = ;
}
return;
} int main() {
int m;
scanf("%d%d", &n, &m);
for(int i = , x, y; i <= m; i++) {
scanf("%d%d", &x, &y);
a[y].set(x);
a[x].set(y);
} for(int i = ; i <= n; i++) {
a[i].set(n + );
a[i].set(i);
} Gauss(); DFS(n, ); printf("%d", ans); return ;
}
AC代码
一点思考:
我们能不能把上三角矩阵消成最终的那种结果,然后搜索?这样每次在DFS中确定状态就是O(1)的了。
我们既然都消完了,能不能直接把 ans += a[i][i] & a[i][n + 1] ?
事实证明不行...
随手造了点样例发现过不了...
不禁开始思考a[i][i] = 0的意义来。
比如这个最简单的样例:1和2之间有一条边。
那么消元之后的矩阵是这样的:
1 1 1
0 0 0
这是啥啊.....搞不倒
灯 & 树的更多相关文章
- codevs——1690 开关灯
1690 开关灯 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description YYX家门前的街上有N( ...
- 2021广东工业大学新生赛决赛 L-歪脖子树下的灯
题目:L-歪脖子树下的灯_2021年广东工业大学第11届腾讯杯新生程序设计竞赛(同步赛) (nowcoder.com) 比赛的时候没往dp这方面想(因为之前初赛和月赛数学题太多了啊),因此只往组合数学 ...
- 黑马程序员_JAVA之交通灯管理系统
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.一.需求:模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1.异步随机生成按照各个路 ...
- 数据结构(括号序列,线段树||点分治,堆):ZJOI 2007 捉迷藏
[题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N- ...
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
线段树.. --------------------------------------------------------------------------------- #include< ...
- hdu 2642 二维树状数组 单点更新区间查询 模板水题
Stars Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Total Subm ...
- java 7K交通灯管理系统面试题
交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑.详细需求例如以下: 1. 异常随机生成依照各个路线行驶的车辆. 比如: 由南向而来去往北向的车辆----直行车辆 由西向而来去往 ...
- java--交通灯管理系统
转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9944947 .交通灯管理系统的业务和需求分析 交通灯管理系统的项目需求: 模拟实现十字路口的交 ...
- 树链剖分的一种妙用与一类树链修改单点查询问题的时间复杂度优化——2018ACM陕西邀请赛J题
题目描述 有一棵树,每个结点有一个灯(初始均是关着的).每个灯能对该位置和相邻结点贡献1的亮度.现有两种操作: (1)将一条链上的灯状态翻转,开变关.关变开: (2)查询一个结点的亮度. 数据规模:\ ...
随机推荐
- 使用ajax方法实现form表单的提交
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 写在前面的话 在使用form表单的时候,一旦点击提交触发submit ...
- 【转】Git版本控制软件从入门到精通学习手册
GIT 学习手册简介 本站为 Git 学习参考手册.目的是为学习与记忆 Git 使用中最重要.最普遍的命令提供快速翻阅. 这些命令以你可能需要的操作类型划分,并且将提供日常使用中需要的一些常用的命令以 ...
- [译]通往 Java 函数式编程的捷径
原文地址:An easier path to functional programming in Java 原文作者:Venkat Subramaniam 译文出自:掘金翻译计划 以声明式的思想在你的 ...
- Tomcat通过Redis实现session共享的完整部署记录
对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...
- Individual Reading Assignment
1.What exactly does 'agile' mean? 1)Agile software development does not means a invariable mode of p ...
- 个人博客作业Week2 是否需要有代码规范
问题:是否需要有代码规范 对于是否需要有代码规范,请考虑下列论点并反驳/支持: 1.这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 2.我是个艺术家,手艺人,我有 ...
- 20135327--linux内核分析 实践二
内核模块编译 1.实验原理 Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率很高,但可扩展性 ...
- HDOJ2032_杨辉三角
这是一道水题,思路很简单,把杨辉三角先求出来,然后按照输入将相应的层数的杨慧三角输出即可. HDOJ2032_杨辉三角 #include<stdio.h> #include<stdl ...
- Flask-论坛开发-5-memcached缓存系统
对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 ### 介绍:哪些情况下适合 ...
- Minify or format javascript file by web or notepad++
Notepad++ plugin manager install 'JSTOOL' http://tool.oschina.net/codeformat/js https://www.cnblogs. ...