专栏文章

题解:UVA1607 与非门电路 Gates

UVA1607题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipxnf54
此快照首次捕获于
2025/12/03 19:37
3 个月前
此快照最后确认于
2025/12/03 19:37
3 个月前
查看原文

题目传送门

思路

  • 输出恒为 11,输出任意常数序列即可。
  • 输出恒为 00,输出任意常数序列即可。
  • 如果输出是 xx 或非 xx ,那么这最后一个 1 的位置就是 x 的位置。 这个就是整体的思路,再看题目数据的范围,发现 n100000n \le100000 暴力肯定是过不了的。那么怎么做呢?这里要用到 二分

代码

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node {
	int u,v,w;
} a[1000001];
int n,m;
int fun(int u) {
	for (int i=n-u; i<n; i++){
		a[i].w=1;
	}
	for (int i=0; i<n-u; i++) a[i].w=0;
	for (int i=n+1; i<=n+m; i++) {
		a[i].w=!(a[a[i].u].w&a[a[i].v].w);
	}
	return a[m+n].w;
}
signed main() {
	memset(a,0,sizeof(a));
	int T;
	cin>>T;
	for(t--) {
		cin>>n>>m;
		memset(a,0,sizeof(a));
		for (int i=1; i<=m; i++) {
			int u,v;
			cin>>u>>v;
			a[n+i].u=u+n;//存入 
			a[n+i].v=v+n;
		}
		int x=fun(0);
		int a1=fun(n),ans;
		if (x==y)ans=0;
		else {
			int L=0,R=n;
			while(L<R) {
				int mid=(L+R)/2;
				if (fun(mid)==y){
					R=mid;//找到了当前的答案 
				}
				else{
					L=mid+1;//说明答案右边 
				} 
			}
			ans=L;
		}
		for (int i=1; i<ans; i++){//输出答案 
			cout<<1;
		} 
		if (ans>=1){
			cout<<"x";
		}
		for (int i=ans+1; i<=n; i++){
			cout<<0;
		}
		cout<<endl;
	}
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...