UVA1607-Gates(思维+二分)
Accept: 111 Submit: 767
Time Limit: 3000 mSec
Problem Description
Input
The first line of the input contains exactly one positive integer d equal to the number of data sets, 1 ≤ d ≤ 20. The data sets follow. Each data set consists of two consecutive lines. The first of those lines contains exactly two positive integers n and m separated by single space, 1 ≤ n ≤ 100000, 1 ≤ m ≤ 200000. Integer n is the number of the net inputs and integer m is the number of the gates in the net. The second of those lines contains exactly 2m nonzero integers, separated by single spaces. The numbers on positions 2j −1 and 2j describe the signal sources for the inputs to gate j. The positive number s means the output of gate s. The negative number s means the (−s)-th input to the net. The gates and the net inputs are numbered starting from one. The input of each gate is connected to an input of the net or to an output of a gate whose description occurred earlier in the sequence. Each net input is connected to at least one gate input. Each gate output is connected to at least one gate input except the output of the last gate that is connected to the output of the net.
Output
Sample Input
Sample Output
10x
题解:这个题比较难理解的地方我觉得在二分的正确性(orz),前面的推理还是比较好理解的,如果当x为0、1时输出相同那么输出就是常数,随意输出一个01串即可,如果不同,那么输出就是x或!x,,也就是说00……0和11……1输出不同,那么从10……0、110……0一直到11……1中间必有一个状态使得11……100……0的输出和11……1相同,从第一个数开始尝试将其变为1,那么试到的第一个输出和11……1相同的状态就可以构造出一个满足条件的解,把该状态新加的1设置为x即可,然而每次输出的时间复杂度时O(m),尝试的时间复杂度时O(n),肯定会超时,这个时候据lrj的分析,可以二分1的个数来找到这个位置,这样就变成O(mlogn)(感觉紫书上写错了),这样就不会超时了。
二分正确性的简单证明:首先要明白一个问题,这个题完全有可能有多解,但是二分不是只能卡出来一个解吗,解不是应该唯一吗,这个想法时错误的,错误的原因可以通过我下面的描述看出。如果现在二分到有mid个1(也就是从左往右显是mid个1,然后全是0)如果这个解不是可行解,也就是说这个状态的输出还是和00……0相同,那么我们就可以忽略前面mid个1,后面一定还有一个状态使得输出改变,所以把解的范围缩小到mid到R是可以找到解的(即便1到L有解),如果这个解是可行解,也就是说这个状态的输出和11……1相同那么我们可以忽略从mid到R的数,从L到mid这个区间里肯定是有解的(不然怎么会输出改变),这就证明了二分的合理性。这个二分难理解就在于虽然是在二分卡一个答案,但是答案完全有可能并不唯一,被你舍弃的搜索范围并不是没有解只是你选择继续搜索的区间里一定有解。
- #include <bits/stdc++.h>
- using namespace std;
- const int maxm = + ;
- struct Nand {
- int a, b, o;
- }nand[maxm];
- int n, m;
- int output(int k) {
- for (int i = ; i <= m; i++) {
- int x = nand[i].a, y = nand[i].b;
- int va = x < ? -x > k : nand[x].o;
- int vb = y < ? -y > k : nand[y].o;
- nand[i].o = !(va && vb);
- }
- return nand[m].o;
- }
- int solve(int vn) {
- int l = , r = n;
- int ans;
- while (l <= r) {
- int mid = (l + r) >> ;
- if (output(mid) == vn) {
- ans = mid;
- r = mid - ;
- }
- else l = mid + ;
- }
- return ans;
- }
- int main()
- {
- //freopen("input.txt", "r", stdin);
- int iCase;
- scanf("%d", &iCase);
- while (iCase--) {
- scanf("%d%d", &n, &m);
- for (int i = ; i <= m; i++) {
- scanf("%d%d", &nand[i].a, &nand[i].b);
- }
- int vn = output(n), v0 = output();
- if (vn == v0) {
- for (int i = ; i <= n; i++) {
- printf("");
- }
- printf("\n");
- }
- else {
- int pos = solve(vn);
- for (int i = ; i < pos; i++) printf("");
- printf("x");
- for (int i = pos + ; i <= n; i++) printf("");
- printf("\n");
- }
- }
- return ;
- }
UVA1607-Gates(思维+二分)的更多相关文章
- UVA1607 Gates 与非门电路 (二分)
题意:给你一个按发生时间的序列,表示与非门电路的输入,一开始全部输入是x,现在要改成尽量少的x,实现相同的功能. 题解:电路功能只有4中0,1,x,非x.那么如果一开始x改变了,输出结果不变,那么说明 ...
- Educational Codeforces Round 60 C 思维 + 二分
https://codeforces.com/contest/1117/problem/C 题意 在一个二维坐标轴上给你一个起点一个终点(x,y<=1e9),然后给你一串字符串代表每一秒的风向, ...
- [NOIP10.6模拟赛]1.merchant题解--思维+二分
题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...
- Voltage Keepsake CodeForces - 801C (思维+二分)
题目链接 这是一道很棒的二分题. 思路: 首先先思考什么情况下是可以无限的使用,即输出-1. 我们思考可知,如果每一秒内所有设备的用电量总和小于等于充电器每秒可以充的电,那么这一群设备就可以无限使用. ...
- 【Codeforces】894D. Ralph And His Tour in Binary Country 思维+二分
题意 给定一棵$n$个节点完全二叉树,$m$次询问,每次询问从$a$节点到其它所有节点(包括自身)的距离$L$与给定$H_a$之差$H_a-L$大于$0$的值之和 对整棵树从叶子节点到父节点从上往下预 ...
- C. Magic Ship (思维+二分)
https://codeforces.com/contest/1117/problem/C 你是一个船长.最初你在点 (x1,y1) (显然,大海上的所有点都可以用平面直角坐标描述),你想去点 (x2 ...
- Present CodeForces - 1323D (思维+二分)
题目大意比较简单,就是求一堆(二元组)的异或和. 思路:按位考虑,如果说第k位为1的话,那么一定有奇数个(二元组)在该位为1.二元组内的数是相加的,相加是可以进位的.所以第k位是0还是1,至于k为后边 ...
- HDU 5178 pairs —— 思维 + 二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5178 pairs Time Limit: 2000/1000 MS (Java/Others) ...
- BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分
Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...
随机推荐
- Java基础篇——集合浅谈
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10703558.html,否则将追究法律责任!!! Set(基于Map来实现的,不细说) H ...
- 前端数据可视化echarts.js
一.echarts.js的优势与总体情况 echarts.js作为国内的IT三巨头之一的百度的推出一款相对较为成功的开源项目,总体上来说有这样的一些优点 1.容易使用 echarts.js的官方文档比 ...
- 抛弃console.log(),拥抱浏览器Debugger
译者按: 切换成本真的不高,建议使用开发者工具来Debug! 原文:How to stop using console.log() and start using your browser's deb ...
- 开源前端脚本错误监控及跟踪解决项目-BadJS 试用
BadJS 是 一个web 前端脚本错误监控及跟踪项目.此项目为鹅厂 imweb(qq群:179045421) 团队的开源项目.此项目支持单机,集群,docker.存储支持mongodb等. 官网文档 ...
- 2,使用javascript
1, <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...
- BZOJ2655: calc(dp 拉格朗日插值)
题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...
- Shell中判断语句if中-z至-d的意思
[ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ ...
- redis中各种数据类型的常用操作方法汇总
在spring中使用jedisTemplate操作,详见https://www.cnblogs.com/EasonJim/p/7803067.html 一.Redis的五大数据类型 1.String( ...
- JMeter 配置元件之HTTP Cookie Manager 介绍
配置元件之HTTP Cookie Manager 介绍 by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1. Cookie管理器介绍 Cookie Ma ...
- JMeter 线程组之Stepping Thread Group插件介绍
线程组之Stepping Thread Group插件介绍 by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 插件: https://jmeter-plu ...