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. devtools进行热部署

    热部署的形式这里只介绍一种devtools devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymele ...

  2. python使用tcp实现一个简单的下载器

    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...

  3. Idea 15 激活

    https://www.cnblogs.com/moko/p/5012006.html 1.把补丁下载到自己的电脑上 2.打开idea,help->edit custom VM options ...

  4. Http协议请求头、响应头、响应码

    Http部分请求头 Accept 客户机通过这个头,告诉服务器,它支持哪些数据类型 Accept-Charset 客户机通过这个头,告诉服务器,它支持的编码 Accept-Encoding 客户机通过 ...

  5. Python中字典dict

    dict字典 字典是一种组合数据,没有顺序的组合数据,数据以键值对形式出现 # 字典的创建 # 创建空字典1 d = {} print(d) # 创建空字典2 d = dict() print(d) ...

  6. mybatis 自动生成文件配置

    maven 依赖配置: <!-- sql server --><dependency> <groupId>com.microsoft.sqlserver</g ...

  7. Android开发CheckBox控件,全选,反选,取消全选

    在Android开发中我们经常会使用CheckBox控件,那么怎么实现CheckBox控件的全选,反选呢 首先布局我们的界面: <?xml version="1.0" enc ...

  8. C# 动态输出Dos命令执行结果

    本文以一个简单的小例子讲解如何将命令行信息实时的输出到文本框中.仅供学习分享使用,如有不足之处,还请指正. 概述 在C#程序开发过程中,有时需要运行其它的程序并获得输出的结果来进行进一步的处理.一般第 ...

  9. 使用混淆ProGuard压缩代码和资源/减少方法数量

    ProGuard介绍 ProGuard是一个Java类文件压缩器,优化器,混淆器和预先文件验证器. 压缩步骤检测和删除未使用的类,字段,方法和属性. 优化步骤分析和优化方法的字节码. 混淆步骤使用短无 ...

  10. 布局优化之ViewStub源码分析

    源码分析 @RemoteView public final class ViewStub extends View { private int mInflatedId; private int mLa ...