Cod sursa(job #3193618)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 15 ianuarie 2024 06:43:53
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include<bits/stdc++.h>
using namespace std;
ifstream F("2sat.in");
ofstream G("2sat.out");
vector<int> u[200001],v[200001];
bitset<200001> a,b;
stack<int> s;
int d[200001],c=1,n,m,i,j,k;
void A(int i)
{
	int k=u[i].size(),j;
	for(a[i]=1,j=0;j<k;++j)
        if(!a[u[i][j]])
            A(u[i][j]);
	s.push(i);
}
void B(int i)
{
    int k=v[i].size(),j;
	for(b[i]=1,j=0;j<k;++j)
		if(!b[v[i][j]])
            B(v[i][j]);
	d[i]=c;
}
int main()
{
    for(F>>n>>m;m--;)
        if(F>>j>>k,j>0&&k>0)
            u[j+n].push_back(k),v[k].push_back(j+n),u[k+n].push_back(j),v[j].push_back(k+n);
		else if(j>0&&k<0)
            u[j+n].push_back(n-k),v[n-k].push_back(j+n),u[-k].push_back(j),v[j].push_back(-k);
		else if(j<0&&k>0)
            u[-j].push_back(k),v[k].push_back(-j),u[k+n].push_back(n-j),v[n-j].push_back(k+n);
		else
            u[-j].push_back(n-k),v[n-k].push_back(-j),u[-k].push_back(n-j),v[n-j].push_back(-k);
	for(i=1;i<=2*n;++i)
		if(!a[i])
			A(i);
	for(;!s.empty();)
		if(m=s.top(),s.pop(),!b[m])
            B(m),++c;
	for(i=1;i<=n;++i)
		if(d[i]==d[i+n])
            return G<<-1,0;
	for(i=1;i<=n;G<<(d[i]>d[i+n])<<' ',++i);
	return 0;
}