这题目有毒,一直没看懂。
输入 case数,然后输入m (电路数) , 最左原始输入端总数。
然后输入每个电路的输入端,如果是原始输入从上到下标号-1,-2 、、、、-n,后来产生的新的输入另加标号。
与非门路,就是两个端子,先进行与运算,然后再进行非运算。
解题思路点击打开链接
;
#include <iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=2e6+5;
struct node
{
int a,b,w;
};
node q[maxn];
int n,m,v0,vn;
int run(int k)
{
for(int i=1;i<=m;i++)
{
int x=q[i].a;
int y=q[i].b;
x= x<0? -x>k : q[x].w;
y= y<0? -y>k : q[y].w;
q[i].w=!(x&y);
}
return q[m].w;
}
int solve()
{
int l=0,r=n;
while(l<r)
{
int mid=l+(r-l)/2;
if(run(mid)==vn) r=mid;
else
l=mid+1;
}
return l;
}
int main()
{
int ka;
scanf("%d",&ka);
while(ka--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].a,&q[i].b);
}
v0=run(0);
vn=run(n);
if(v0==vn)
{
for(int i=0;i<n;i++)
printf("0");
printf("\n");
}
else
{
int ans=solve();
for(int i=1;i<ans;i++)
printf("0");
printf("x");
for(int i=ans+1;i<=n;i++)
printf("1");
printf("\n");
}
}
return 0;
}
;被教主骂了一顿,其实是活该,寒假没好好学习,