Submission #333396

# Submission time Handle Problem Language Result Execution time Memory
333396 2020-12-05T19:58:17 Z arnold518 None (JOI14_ho_t5) C++14
100 / 100
2853 ms 196744 KB
#pragma GCC optimize ("O3")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
 
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
 
const int MAXN = 2e5;
const int MAXV = 3.6e6;
 
struct Line
{
	int x1, y1, x2, y2, p;
};
 
int W, H, N, M, SX, SY;
Line A[MAXN/2+10], B[MAXN/2+10];
 
vector<int> xcomp, ycomp;
 
ll V, E, C=1;
 
struct BIT
{
	int tree[MAXN+10];
	void update(int i, int x) { for(; i<=SY; i+=(i&-i)) tree[i]+=x; }
	int query(int i) { int ret=0; for(; i>0; i-=(i&-i)) ret+=tree[i]; return ret; }
	int query(int l, int r) { return query(r)-query(l-1); }
}bit;
 
int LC[MAXV+10], RC[MAXV+10];
int ncnt;

int newNode()
{
	if(ncnt+1==MAXV) while(1);
	return ++ncnt;
}
 
vector<pii> adj;
vector<pii> radj;
 
void addEdge(int u, int v)
{
	//printf("%d %d\n", u, v);
	if(u==-1 || v==-1) return;
	adj.push_back({u, v});
}
 
int update(int node, int tl, int tr, int p, int k)
{
	if(p<tl || tr<p) return node;
	if(tr-tl+1<=1)
	{
		if(k>0) return k;
		return -1;
	}
	int ret=newNode();
	int mid=tl+tr>>1;
	LC[ret]=update(LC[node], tl, mid, p, k);
	RC[ret]=update(RC[node], mid+1, tr, p, k);
	addEdge(LC[ret], ret);
	addEdge(RC[ret], ret);
	return ret;
}
 
void query(int node, int tl, int tr, int l, int r, int k)
{
	if(r<tl || tr<l) return;
	if(l<=tl && tr<=r)
	{
		addEdge(node, k);
		radj.push_back({k, node});
		return;
	}
	int mid=tl+tr>>1;
	query(LC[node], tl, mid, l, r, k);
	query(RC[node], mid+1, tr, l, r, k);
}
 
bool vis[MAXV+10];
vector<int> S;
void dfs(int now)
{
	vis[now]=true;
	for(auto it=lower_bound(adj.begin(), adj.end(), pii(now, 0)); it<adj.end() && it->first==now; it++)
	{
		int nxt=it->second;
		if(vis[nxt]) continue;
		dfs(nxt);
	}
	S.push_back(now);
}
 
int scc[MAXV+10], scnt;
void dfs2(int now)
{
	scc[now]=scnt;
	if(now>N+M)
	{
		int nxt=LC[now];
		if(nxt!=-1 && !scc[nxt]) dfs2(nxt);
		nxt=RC[now];
		if(nxt!=-1 && !scc[nxt]) dfs2(nxt);
	}
	else
	{
		for(auto it=lower_bound(radj.begin(), radj.end(), pii(now, 0)); it<radj.end() && it->first==now; it++)
		{
			int nxt=it->second;
			if(scc[nxt]) continue;
			dfs2(nxt);
		}
	}
}
 
int main()
{
	int t;
	scanf("%d%d%d", &W, &H, &t);
	for(int i=1; i<=t; i++)
	{
		Line p;
		scanf("%d%d%d%d", &p.x1, &p.y1, &p.x2, &p.y2);
		xcomp.push_back(p.x1);
		xcomp.push_back(p.x2);
		ycomp.push_back(p.y1);
		ycomp.push_back(p.y2);
		if(p.x1==p.x2) B[++M]=p;
		else A[++N]=p;
	}
 
	xcomp.push_back(0);
	ycomp.push_back(0);
	xcomp.push_back(W);
	ycomp.push_back(H);
 
	A[++N]={0, 0, W, 0};
	A[++N]={0, H, W, H};
	B[++M]={0, 0, 0, H};
	B[++M]={W, 0, W, H};
 
	sort(xcomp.begin(), xcomp.end());
	xcomp.erase(unique(xcomp.begin(), xcomp.end()), xcomp.end());
	sort(ycomp.begin(), ycomp.end());
	ycomp.erase(unique(ycomp.begin(), ycomp.end()), ycomp.end());
 
	SX=xcomp.size(); SY=ycomp.size();
 
	for(int i=1; i<=N; i++)
	{
		A[i].x1=lower_bound(xcomp.begin(), xcomp.end(), A[i].x1)-xcomp.begin()+1;
		A[i].x2=lower_bound(xcomp.begin(), xcomp.end(), A[i].x2)-xcomp.begin()+1;
		A[i].y1=lower_bound(ycomp.begin(), ycomp.end(), A[i].y1)-ycomp.begin()+1;
		A[i].y2=lower_bound(ycomp.begin(), ycomp.end(), A[i].y2)-ycomp.begin()+1;
		A[i].p=newNode();
	}
	for(int i=1; i<=M; i++)
	{
		B[i].x1=lower_bound(xcomp.begin(), xcomp.end(), B[i].x1)-xcomp.begin()+1;
		B[i].x2=lower_bound(xcomp.begin(), xcomp.end(), B[i].x2)-xcomp.begin()+1;
		B[i].y1=lower_bound(ycomp.begin(), ycomp.end(), B[i].y1)-ycomp.begin()+1;
		B[i].y2=lower_bound(ycomp.begin(), ycomp.end(), B[i].y2)-ycomp.begin()+1;
		B[i].p=newNode();
	}
	xcomp.clear(); xcomp.shrink_to_fit();
	ycomp.clear(); ycomp.shrink_to_fit();
 
	for(int i=1; i<=N; i++)
	{
		E+=A[i].x2-A[i].x1;
		V+=A[i].x2-A[i].x1+1;
	}
	for(int i=1; i<=M; i++)
	{
		E+=B[i].y2-B[i].y1;
		V+=B[i].y2-B[i].y1+1;
	}
 
	sort(B+1, B+M+1, [&](const Line &p, const Line &q)
	{
		return p.x1<q.x1;
	});
 
	vector<pair<pll, int>> VV;
	for(int i=1; i<=N; i++)
	{
		VV.push_back({{A[i].x1, A[i].y1}, 1});
		VV.push_back({{A[i].x2+1, A[i].y1}, -1});
	}
	sort(VV.begin(), VV.end());
 
	for(int i=1, j=0; i<=M; i++)
	{
		for(; j<VV.size() && VV[j].first.first<=B[i].x1; j++)
		{
			bit.update(VV[j].first.second, VV[j].second);
		}
		V-=bit.query(B[i].y1, B[i].y2);
	}
 
	int root;
 
	VV.clear(); VV.shrink_to_fit();
	for(int i=1; i<=N; i++)
	{
		VV.push_back({{A[i].x1, A[i].y1}, A[i].p});
		VV.push_back({{A[i].x2+1, A[i].y1}, 0});
	}
	sort(VV.begin(), VV.end());
 
	root=newNode();
	//makeTree(root, 1, SY);
	for(int i=1, j=0; i<=M; i++)
	{
		for(; j<VV.size() && VV[j].first.first<=B[i].x1; j++)
		{
			root=update(root, 1, SY, VV[j].first.second, VV[j].second);
			//printf("!!%d\n", VV[j].second);
		}
		query(root, 1, SY, B[i].y1, B[i].y2, B[i].p);
		//printf("??%d\n", B[i].p);
	}
 
	VV.clear(); VV.shrink_to_fit();
	for(int i=1; i<=M; i++)
	{
		VV.push_back({{B[i].y1, B[i].x1}, B[i].p});
		VV.push_back({{B[i].y2+1, B[i].x1}, 0});
	}
	sort(VV.begin(), VV.end());
	sort(A+1, A+N+1, [&](const Line &p, const Line &q)
	{
		return p.y1<q.y1;
	});

 
	root=newNode();
	//makeTree(root, 1, SX);
	for(int i=1, j=0; i<=N; i++)
	{
		for(; j<VV.size() && VV[j].first.first<=A[i].y1; j++)
		{
			root=update(root, 1, SX, VV[j].first.second, VV[j].second);
		}
		query(root, 1, SX, A[i].x1, A[i].x2, A[i].p);
	}
 
	VV.clear(); VV.shrink_to_fit();

	sort(adj.begin(), adj.end());
	sort(radj.begin(), radj.end());

	for(int i=1; i<=N+M; i++)
	{
		if(vis[i]) continue;
		dfs(i);
	}
	reverse(S.begin(), S.end());
	for(auto it : S)
	{
		if(scc[it]) continue;
		++scnt;
		dfs2(it);
	}
	
	sort(scc+1, scc+N+M+1);
	C=unique(scc+1, scc+N+M+1)-scc-1;
 
	ll ans=C-V+E;
	printf("%lld\n", ans);
}

Compilation message

2014_ho_t5.cpp: In function 'int update(int, int, int, int, int)':
2014_ho_t5.cpp:63:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   63 |  int mid=tl+tr>>1;
      |          ~~^~~
2014_ho_t5.cpp: In function 'void query(int, int, int, int, int, int)':
2014_ho_t5.cpp:80:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   80 |  int mid=tl+tr>>1;
      |          ~~^~~
2014_ho_t5.cpp: In function 'int main()':
2014_ho_t5.cpp:199:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<long long int, long long int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  199 |   for(; j<VV.size() && VV[j].first.first<=B[i].x1; j++)
      |         ~^~~~~~~~~~
2014_ho_t5.cpp:220:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<long long int, long long int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  220 |   for(; j<VV.size() && VV[j].first.first<=B[i].x1; j++)
      |         ~^~~~~~~~~~
2014_ho_t5.cpp:246:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<long long int, long long int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  246 |   for(; j<VV.size() && VV[j].first.first<=A[i].y1; j++)
      |         ~^~~~~~~~~~
2014_ho_t5.cpp:124:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  124 |  scanf("%d%d%d", &W, &H, &t);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
2014_ho_t5.cpp:128:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  128 |   scanf("%d%d%d%d", &p.x1, &p.y1, &p.x2, &p.y2);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 492 KB Output is correct
6 Correct 1 ms 492 KB Output is correct
7 Correct 5 ms 860 KB Output is correct
8 Correct 10 ms 1508 KB Output is correct
9 Correct 8 ms 1128 KB Output is correct
10 Correct 10 ms 1508 KB Output is correct
11 Correct 10 ms 1508 KB Output is correct
12 Correct 5 ms 876 KB Output is correct
13 Correct 10 ms 1508 KB Output is correct
14 Correct 9 ms 1388 KB Output is correct
15 Correct 9 ms 1292 KB Output is correct
16 Correct 1 ms 364 KB Output is correct
17 Correct 1 ms 492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 492 KB Output is correct
6 Correct 1 ms 492 KB Output is correct
7 Correct 5 ms 860 KB Output is correct
8 Correct 10 ms 1508 KB Output is correct
9 Correct 8 ms 1128 KB Output is correct
10 Correct 10 ms 1508 KB Output is correct
11 Correct 10 ms 1508 KB Output is correct
12 Correct 5 ms 876 KB Output is correct
13 Correct 10 ms 1508 KB Output is correct
14 Correct 9 ms 1388 KB Output is correct
15 Correct 9 ms 1292 KB Output is correct
16 Correct 1 ms 364 KB Output is correct
17 Correct 1 ms 492 KB Output is correct
18 Correct 1 ms 492 KB Output is correct
19 Correct 1 ms 492 KB Output is correct
20 Correct 1 ms 512 KB Output is correct
21 Correct 11 ms 1544 KB Output is correct
22 Correct 10 ms 1380 KB Output is correct
23 Correct 11 ms 1636 KB Output is correct
24 Correct 11 ms 1672 KB Output is correct
25 Correct 11 ms 1636 KB Output is correct
26 Correct 9 ms 1256 KB Output is correct
27 Correct 11 ms 1636 KB Output is correct
28 Correct 11 ms 1636 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 1000 KB Output is correct
2 Correct 6 ms 1000 KB Output is correct
3 Correct 5 ms 876 KB Output is correct
4 Correct 10 ms 1508 KB Output is correct
5 Correct 145 ms 14544 KB Output is correct
6 Correct 898 ms 71540 KB Output is correct
7 Correct 2074 ms 146076 KB Output is correct
8 Correct 2052 ms 147248 KB Output is correct
9 Correct 1801 ms 139516 KB Output is correct
10 Correct 1545 ms 128384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 492 KB Output is correct
2 Correct 11 ms 1636 KB Output is correct
3 Correct 165 ms 16976 KB Output is correct
4 Correct 1 ms 364 KB Output is correct
5 Correct 11 ms 1636 KB Output is correct
6 Correct 2850 ms 193792 KB Output is correct
7 Correct 55 ms 5864 KB Output is correct
8 Correct 738 ms 64200 KB Output is correct
9 Correct 1562 ms 126516 KB Output is correct
10 Correct 1626 ms 131092 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 492 KB Output is correct
6 Correct 1 ms 492 KB Output is correct
7 Correct 5 ms 860 KB Output is correct
8 Correct 10 ms 1508 KB Output is correct
9 Correct 8 ms 1128 KB Output is correct
10 Correct 10 ms 1508 KB Output is correct
11 Correct 10 ms 1508 KB Output is correct
12 Correct 5 ms 876 KB Output is correct
13 Correct 10 ms 1508 KB Output is correct
14 Correct 9 ms 1388 KB Output is correct
15 Correct 9 ms 1292 KB Output is correct
16 Correct 1 ms 364 KB Output is correct
17 Correct 1 ms 492 KB Output is correct
18 Correct 1 ms 492 KB Output is correct
19 Correct 1 ms 492 KB Output is correct
20 Correct 1 ms 512 KB Output is correct
21 Correct 11 ms 1544 KB Output is correct
22 Correct 10 ms 1380 KB Output is correct
23 Correct 11 ms 1636 KB Output is correct
24 Correct 11 ms 1672 KB Output is correct
25 Correct 11 ms 1636 KB Output is correct
26 Correct 9 ms 1256 KB Output is correct
27 Correct 11 ms 1636 KB Output is correct
28 Correct 11 ms 1636 KB Output is correct
29 Correct 6 ms 1000 KB Output is correct
30 Correct 6 ms 1000 KB Output is correct
31 Correct 5 ms 876 KB Output is correct
32 Correct 10 ms 1508 KB Output is correct
33 Correct 145 ms 14544 KB Output is correct
34 Correct 898 ms 71540 KB Output is correct
35 Correct 2074 ms 146076 KB Output is correct
36 Correct 2052 ms 147248 KB Output is correct
37 Correct 1801 ms 139516 KB Output is correct
38 Correct 1545 ms 128384 KB Output is correct
39 Correct 1 ms 492 KB Output is correct
40 Correct 11 ms 1636 KB Output is correct
41 Correct 165 ms 16976 KB Output is correct
42 Correct 1 ms 364 KB Output is correct
43 Correct 11 ms 1636 KB Output is correct
44 Correct 2850 ms 193792 KB Output is correct
45 Correct 55 ms 5864 KB Output is correct
46 Correct 738 ms 64200 KB Output is correct
47 Correct 1562 ms 126516 KB Output is correct
48 Correct 1626 ms 131092 KB Output is correct
49 Correct 10 ms 1380 KB Output is correct
50 Correct 9 ms 1388 KB Output is correct
51 Correct 9 ms 1292 KB Output is correct
52 Correct 1176 ms 90544 KB Output is correct
53 Correct 911 ms 69188 KB Output is correct
54 Correct 1196 ms 93836 KB Output is correct
55 Correct 2764 ms 189600 KB Output is correct
56 Correct 2054 ms 145792 KB Output is correct
57 Correct 2853 ms 196744 KB Output is correct
58 Correct 2798 ms 189700 KB Output is correct
59 Correct 1239 ms 99004 KB Output is correct
60 Correct 1650 ms 131744 KB Output is correct
61 Correct 2177 ms 152860 KB Output is correct
62 Correct 2171 ms 155516 KB Output is correct
63 Correct 2807 ms 193920 KB Output is correct
64 Correct 1792 ms 139660 KB Output is correct
65 Correct 2832 ms 195588 KB Output is correct
66 Correct 2837 ms 194340 KB Output is correct
67 Correct 2511 ms 173168 KB Output is correct
68 Correct 2419 ms 173564 KB Output is correct
69 Correct 2500 ms 173844 KB Output is correct
70 Correct 2500 ms 173572 KB Output is correct
71 Correct 1874 ms 132172 KB Output is correct
72 Correct 1883 ms 133076 KB Output is correct