Problem 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

The output should consist of exactly d lines, one line for each data set. The line number i should contain the answer to the i-th data set. The answer to one data set should consist of a sequence of exactly k characters terminated by the end of line (with no spaces in between). Each of those characters should be ‘0’ (the digit ‘zero’) or ‘1’ (the digit ‘one’) or ‘x’ (lower-case letter ‘x’). The i-th symbol of the sequence denotes the assignment to the i-th input of the net. If there are more than one optimal assignment then your program should output any of them (but only one).
 

 Sample Input

1
3 6
-1 -3 -1 -2 1 2 1 2 4 3 5 5
 

 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(思维+二分)的更多相关文章

  1. UVA1607 Gates 与非门电路 (二分)

    题意:给你一个按发生时间的序列,表示与非门电路的输入,一开始全部输入是x,现在要改成尽量少的x,实现相同的功能. 题解:电路功能只有4中0,1,x,非x.那么如果一开始x改变了,输出结果不变,那么说明 ...

  2. Educational Codeforces Round 60 C 思维 + 二分

    https://codeforces.com/contest/1117/problem/C 题意 在一个二维坐标轴上给你一个起点一个终点(x,y<=1e9),然后给你一串字符串代表每一秒的风向, ...

  3. [NOIP10.6模拟赛]1.merchant题解--思维+二分

    题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...

  4. Voltage Keepsake CodeForces - 801C (思维+二分)

    题目链接 这是一道很棒的二分题. 思路: 首先先思考什么情况下是可以无限的使用,即输出-1. 我们思考可知,如果每一秒内所有设备的用电量总和小于等于充电器每秒可以充的电,那么这一群设备就可以无限使用. ...

  5. 【Codeforces】894D. Ralph And His Tour in Binary Country 思维+二分

    题意 给定一棵$n$个节点完全二叉树,$m$次询问,每次询问从$a$节点到其它所有节点(包括自身)的距离$L$与给定$H_a$之差$H_a-L$大于$0$的值之和 对整棵树从叶子节点到父节点从上往下预 ...

  6. C. Magic Ship (思维+二分)

    https://codeforces.com/contest/1117/problem/C 你是一个船长.最初你在点 (x1,y1) (显然,大海上的所有点都可以用平面直角坐标描述),你想去点 (x2 ...

  7. Present CodeForces - 1323D (思维+二分)

    题目大意比较简单,就是求一堆(二元组)的异或和. 思路:按位考虑,如果说第k位为1的话,那么一定有奇数个(二元组)在该位为1.二元组内的数是相加的,相加是可以进位的.所以第k位是0还是1,至于k为后边 ...

  8. HDU 5178 pairs —— 思维 + 二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5178 pairs Time Limit: 2000/1000 MS (Java/Others)     ...

  9. BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分

    Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...

随机推荐

  1. spring aop 实践

    之前用的ssm框架,大部分只是利用spring的IOC特性,很明显这能够为我们开发人员在对象的创建上面节省大部分时间.当相似得到业务越来越多,很多代码也是越来越重复,轮子是越来越重复,比如验证用户登录 ...

  2. How std::cout works [duplicate]

    Question: I accidentally found: cout << cout; The output is some address. What does this addre ...

  3. 汇编语言--微机CPU的指令系统(五)(位操作指令)

    (6) 位操作指令 1.位扫描指令(Bit Scan Instruction) 指令的格式:BSF/BSR Reg, Reg/Mem ;80386+ 受影响的标志位:ZF 位扫描指令是在第二个操作数中 ...

  4. jQuery插件开发进阶

    jQuery插件开发模式 软件开发过程中是需要一定的设计模式来指导开发的,有了模式,我们就能更好地组织我们的代码,并且从这些前人总结出来的模式中学到很多好的实践. 根据<jQuery高级编程&g ...

  5. input的type类型

    对部分生僻的input属性值解释: type="reset": 可以一键清空form表单里面所有的数据 <form> <input type="text ...

  6. 唯一索引的一种使用情景【有则U无则I】

    这个知识点是最近一位面试老师问我的,当时对这种方法不了解,所以只能说那个中效率低的方法了,也就是先进性select判断,然后在执行更新或者插入操作,显然这种是很麻烦的,也自我反思一下,确实有很多的知识 ...

  7. svn基本常见操作设置

    代码管理工具一开始用的确会有点懵,但是永久了就会发现都是那几下套路,记录下来 托管好了代码一般起冲突了还是想重新搞一下,有个万能的重置操作,那就是重新关联svn项目,以前有时更换地址也是,发现遇到很多 ...

  8. redis 数据库安装和基本使用

    Redis 介绍: Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值可以包 ...

  9. git 入门教程之远程仓库

    远程仓库 如果说本地仓库已经足够个人进行版本控制了,那么远程仓库则使多人合作开发成为可能. 如果你只是打算自己使用git,你的工作内容不需要发布给其他人看,那就用不到远程仓库的概念. git 是分布式 ...

  10. (后端)SQL SERVER 字符串按数字排序

    应用于B1-1,B1-2,B10-1,B11-1 sqlserver肯定不能按照字符串进行排序,需要进行处理一番: select CONVERT(varchar, LEFT(code,1)),conv ...