Submission #1411389


Source Code Expand

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <functional>
#include <cmath>
#include <string>
#define SIZE 200005
#define INF 1000000000

using namespace std;
typedef long long int ll;
typedef pair <int,int> P;

struct MaxFlow
{
	struct edge
	{
		int to,cap,rev;
		edge(int to=0,int cap=0,int rev=0):to(to),cap(cap),rev(rev){}
	};
	vector <edge> vec[SIZE];
	int level[SIZE];
	int iter[SIZE];
	int N;
	
	void init(int X)
	{
		N=X;
	}
	void add(int s,int t,int c)
	{
		int S=vec[s].size(),T=vec[t].size();
		vec[s].push_back(edge(t,c,T));
		vec[t].push_back(edge(s,0,S));
	}
	void bfs(int s)
	{
		memset(level,-1,sizeof(level));
		queue <int> que;
		level[s] = 0;
		que.push(s);
		while (!que.empty())
		{
			int v = que.front();que.pop();
			for(int i=0;i<vec[v].size();i++)
			{
				edge&e=vec[v][i];
				if (e.cap>0&&level[e.to]<0)
				{
					level[e.to]=level[v]+1;
					que.push(e.to);
				}
			}
		}
	}
	int flow_dfs(int v,int t,int f)
	{
		if (v==t) return f;
		for(int &i=iter[v];i<vec[v].size();i++)
		{
			edge &e=vec[v][i];
			if (e.cap>0&&level[v]<level[e.to])
			{
				int d=flow_dfs(e.to,t,min(f,e.cap));
				if(d>0)
				{
					e.cap-=d;
					vec[e.to][e.rev].cap+=d;
					return d;
				}
			}
		}
		return 0;
	}
	int max_flow(int s,int t)
	{
		int flow = 0;
		while(1)
		{
			bfs(s);
			if (level[t]<0) return flow;
			for(int i=0;i<N;i++) iter[i]=0;
			while (1)
			{
				int f=flow_dfs(s,t,INF);
				if(f==0) break;
				flow += f;
			}
		}
	}
};
MaxFlow MT;
struct UF
{
	int par[SIZE],rank[SIZE];
	
	void init(int n)
	{
		for(int i=0;i<n;i++)
		{
			par[i]=i;
			rank[i]=1;
		}
	}
	int find(int x)
	{
		if(x==par[x]) return x;
		return par[x]=find(par[x]);
	}
	void unite(int x,int y)
	{
		x=find(x);
		y=find(y);
		if(x==y) return;
		if(rank[x]<rank[y])
		{
			par[x]=y;
		}
		else
		{
			par[y]=x;
			if(rank[x]==rank[y]) rank[x]++;
		}
	}
	bool same(int x,int y)
	{
		return find(x)==find(y);
	}
};
UF uf;
vector <int> vec[SIZE];
int A[SIZE],B[SIZE],C[SIZE],D[SIZE];
int out[SIZE],in[SIZE];

int main()
{
	int n,H;
	scanf("%d %d",&n,&H);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d %d %d",&A[i],&B[i],&C[i],&D[i]);
		if(C[i]==0) C[i]=1;
		else
		{
			A[i]=C[i];
			C[i]=0;
		}
		if(D[i]==0) D[i]=0;
		else
		{
			B[i]=D[i];
			D[i]=1;
		}
	}
	vector <P> vx;
	for(int i=0;i<n;i++)
	{
		vx.push_back(P(A[i],C[i]));
		vx.push_back(P(B[i],D[i]));
	}
	sort(vx.begin(),vx.end());
	vx.erase(unique(vx.begin(),vx.end()),vx.end());
	uf.init(vx.size()+2);
	for(int i=0;i<n;i++)
	{
		int L=lower_bound(vx.begin(),vx.end(),P(A[i],C[i]))-vx.begin();
		int R=lower_bound(vx.begin(),vx.end(),P(B[i],D[i]))-vx.begin();
		out[L]++,in[R]++;
		uf.unite(L,R);
	}
	for(int i=0;i<vx.size();i++)
	{
		if(uf.find(i)==i)
		{
			vector <int> nd;
			for(int j=0;j<vx.size();j++)
			{
				if(uf.same(i,j))
				{
					nd.push_back(j);
				}
			}
			int a=0,b=0;
			for(int j=0;j<nd.size();j++)
			{
				int v=nd[j];
				if(in[v]==out[v]) continue;
				if(in[v]<out[v])
				{
					if(vx[v].second==0)
					{
						puts("NO");
						return 0;
					}
					a+=out[v]-in[v];
				}
				else
				{
					if(vx[v].second==1)
					{
						puts("NO");
						return 0;
					}
					b+=in[v]-out[v];
				}
			}
			if(a!=b||a==0)
			{
				puts("NO");
				return 0;
			}
		}
	}
	MT.init(vx.size()+5);
	int S=vx.size(),T=S+1;
	int cnt=0;
	for(int i=0;i<vx.size();i++)
	{
		if(in[i]<out[i])
		{
			MT.add(S,i,out[i]-in[i]);
			cnt+=out[i]-in[i];
		}
		else if(out[i]<in[i])
		{
			MT.add(i,T,in[i]-out[i]);
		}
	}
	for(int i=0;i<n;i++)
	{
		int L=lower_bound(vx.begin(),vx.end(),P(A[i],C[i]))-vx.begin();
		int R=lower_bound(vx.begin(),vx.end(),P(B[i],D[i]))-vx.begin();
		MT.add(L,R,1);
	}
	bool up=MT.max_flow(S,T)==cnt;
	if(up) puts("YES");
	else puts("NO");
	return 0;
}

Submission Info

Submission Time
Task E - Jigsaw
User yutaka1999
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 4091 Byte
Status AC
Exec Time 76 ms
Memory 21232 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:143:22: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n,&H);
                      ^
./Main.cpp:146:47: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d %d",&A[i],&B[i],&C[i],&D[i]);
                                               ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1200 / 1200
Status
AC × 3
AC × 84
Set Name Test Cases
Sample sample1.txt, sample2.txt, sample3.txt
All sample1.txt, sample2.txt, sample3.txt, a1.txt, a2.txt, a3.txt, b1.txt, b10.txt, b101.txt, b102.txt, b103.txt, b104.txt, b105.txt, b106.txt, b107.txt, b108.txt, b109.txt, b11.txt, b110.txt, b111.txt, b112.txt, b113.txt, b114.txt, b115.txt, b116.txt, b117.txt, b118.txt, b119.txt, b12.txt, b13.txt, b14.txt, b15.txt, b2.txt, b200.txt, b201.txt, b202.txt, b203.txt, b204.txt, b205.txt, b206.txt, b207.txt, b208.txt, b209.txt, b210.txt, b211.txt, b212.txt, b213.txt, b214.txt, b215.txt, b216.txt, b217.txt, b218.txt, b219.txt, b3.txt, b300.txt, b301.txt, b302.txt, b303.txt, b304.txt, b305.txt, b306.txt, b307.txt, b308.txt, b309.txt, b310.txt, b311.txt, b4.txt, b5.txt, b6.txt, b7.txt, b8.txt, b9.txt, c1.txt, c2.txt, c3.txt, c4.txt, c5.txt, d1.txt, d2.txt, d3.txt, d4.txt, sample1.txt, sample2.txt, sample3.txt
Case Name Status Exec Time Memory
a1.txt AC 5 ms 14592 KB
a2.txt AC 10 ms 14976 KB
a3.txt AC 55 ms 17140 KB
b1.txt AC 5 ms 14592 KB
b10.txt AC 19 ms 15864 KB
b101.txt AC 73 ms 20208 KB
b102.txt AC 56 ms 17140 KB
b103.txt AC 71 ms 20080 KB
b104.txt AC 71 ms 20464 KB
b105.txt AC 56 ms 17140 KB
b106.txt AC 27 ms 15864 KB
b107.txt AC 66 ms 19440 KB
b108.txt AC 71 ms 19952 KB
b109.txt AC 50 ms 17140 KB
b11.txt AC 49 ms 18548 KB
b110.txt AC 72 ms 20080 KB
b111.txt AC 56 ms 17140 KB
b112.txt AC 72 ms 19952 KB
b113.txt AC 71 ms 20208 KB
b114.txt AC 56 ms 17140 KB
b115.txt AC 27 ms 15864 KB
b116.txt AC 65 ms 19056 KB
b117.txt AC 71 ms 19952 KB
b118.txt AC 44 ms 17012 KB
b119.txt AC 51 ms 17268 KB
b12.txt AC 41 ms 17012 KB
b13.txt AC 74 ms 19952 KB
b14.txt AC 75 ms 20080 KB
b15.txt AC 74 ms 20336 KB
b2.txt AC 12 ms 15228 KB
b200.txt AC 55 ms 17140 KB
b201.txt AC 55 ms 17140 KB
b202.txt AC 55 ms 17140 KB
b203.txt AC 55 ms 17140 KB
b204.txt AC 73 ms 20336 KB
b205.txt AC 73 ms 20336 KB
b206.txt AC 55 ms 17140 KB
b207.txt AC 55 ms 17140 KB
b208.txt AC 73 ms 20464 KB
b209.txt AC 56 ms 17140 KB
b210.txt AC 55 ms 17140 KB
b211.txt AC 73 ms 20208 KB
b212.txt AC 55 ms 17140 KB
b213.txt AC 73 ms 19952 KB
b214.txt AC 73 ms 20080 KB
b215.txt AC 55 ms 17140 KB
b216.txt AC 73 ms 20208 KB
b217.txt AC 74 ms 20464 KB
b218.txt AC 55 ms 17140 KB
b219.txt AC 76 ms 20208 KB
b3.txt AC 56 ms 17140 KB
b300.txt AC 75 ms 20080 KB
b301.txt AC 54 ms 17140 KB
b302.txt AC 41 ms 18800 KB
b303.txt AC 41 ms 18800 KB
b304.txt AC 73 ms 19952 KB
b305.txt AC 54 ms 17140 KB
b306.txt AC 35 ms 17140 KB
b307.txt AC 41 ms 18928 KB
b308.txt AC 66 ms 19696 KB
b309.txt AC 75 ms 19952 KB
b310.txt AC 55 ms 20720 KB
b311.txt AC 52 ms 21232 KB
b4.txt AC 70 ms 20720 KB
b5.txt AC 10 ms 14976 KB
b6.txt AC 10 ms 14976 KB
b7.txt AC 10 ms 14976 KB
b8.txt AC 10 ms 14976 KB
b9.txt AC 10 ms 14976 KB
c1.txt AC 40 ms 17140 KB
c2.txt AC 41 ms 17140 KB
c3.txt AC 42 ms 18672 KB
c4.txt AC 40 ms 17140 KB
c5.txt AC 29 ms 18036 KB
d1.txt AC 67 ms 20080 KB
d2.txt AC 68 ms 20080 KB
d3.txt AC 68 ms 20080 KB
d4.txt AC 54 ms 18800 KB
sample1.txt AC 5 ms 14592 KB
sample2.txt AC 5 ms 14592 KB
sample3.txt AC 5 ms 14592 KB