专栏文章
题解:UVA1607 与非门电路 Gates
UVA1607题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipxnf54
- 此快照首次捕获于
- 2025/12/03 19:37 3 个月前
- 此快照最后确认于
- 2025/12/03 19:37 3 个月前
题目传送门
思路
- 输出恒为 ,输出任意常数序列即可。
- 输出恒为 ,输出任意常数序列即可。
- 如果输出是 或非 ,那么这最后一个 1 的位置就是 x 的位置。 这个就是整体的思路,再看题目数据的范围,发现 暴力肯定是过不了的。那么怎么做呢?这里要用到 二分。
代码
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 条评论,欢迎与作者交流。
正在加载评论...