Submission #134843

# Submission time Handle Problem Language Result Execution time Memory
134843 2019-07-23T10:01:26 Z E869120 Port Facility (JOI17_port_facility) C++14
100 / 100
4158 ms 440128 KB
// 
// Notice:
//
// This is official writer's solution, because I have doubt that writer's solution may fail TLE.

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<set>
#include<queue>
using namespace std;
#pragma warning (disable: 4996)

#define SIZE (1<<21)
int toz[SIZE];
class segtree
{
public:
	int seg1[22][SIZE];
	int seg2[22][SIZE];
	int low[SIZE * 2], u1[SIZE * 2], u2[SIZE * 2];
	int x[SIZE * 2];
	int pt;
	void init()
	{
		for (int i = 0; i < SIZE; i++)low[i + SIZE] = u1[i + SIZE] = u2[i + SIZE] = i;
		for (int i = SIZE - 1; i >= 1; i--)low[i] = low[i * 2], u1[i] = u1[i * 2], u2[i] = u2[i * 2];
	}
	void add1(int beg, int end)
	{
		int node = 1;
		int lb = 0, ub = SIZE - 1;
		int dep = 0;
		for (;;)
		{
			seg1[dep][u1[node]++] = end;
			if (lb == ub)break;
			node *= 2;
			dep++;
			if (beg <= (lb + ub) / 2)ub = (lb + ub) / 2;
			else lb = (lb + ub) / 2 + 1, node++;
		}
	}
	void add2(int beg, int end)
	{
		int node = 1;
		int lb = 0, ub = SIZE - 1;
		int dep = 0;
		for (;;)
		{
			seg2[dep][u2[node]++] = beg;
			if (lb == ub)break;
			node *= 2;
			dep++;
			if (end <= (lb + ub) / 2)ub = (lb + ub) / 2;
			else lb = (lb + ub) / 2 + 1, node++;
		}
	}
	void get(int beg, int end, int node, int lb, int ub, int dep)
	{
		if (end < lb || ub < beg)return;
		if (beg <= lb && ub <= end)
		{
			for (;;)
			{
				if (low[node] == u1[node])break;
				int z = seg1[dep][u1[node] - 1];
				if (z <= end)break;
				x[pt++] = toz[z];
				u1[node]--;
			}
			for (;;)
			{
				if (low[node] == u2[node])break;
				int z = seg2[dep][u2[node] - 1];
				if (z >= beg)break;
				x[pt++] = toz[z];
				u2[node]--;
			}
			return;
		}
		get(beg, end, node * 2, lb, (lb + ub) / 2, dep + 1);
		get(beg, end, node * 2 + 1, (lb + ub) / 2 + 1, ub, dep + 1);
	}
};
segtree tree;
int a[1000000], b[1000000];
int col[2000000];
typedef pair<int, int>pii;
int main()
{
	int num;
	scanf("%d", &num);
	for (int i = 0; i < num; i++)scanf("%d%d", &a[i], &b[i]), a[i]--, b[i]--, toz[a[i]] = toz[b[i]] = i;
	tree.init();
	for (int i = 0; i < num + num; i++)if (b[toz[i]] == i)tree.add1(a[toz[i]], b[toz[i]]);
	for (int i = num + num - 1; i >= 0; i--)if (a[toz[i]] == i)tree.add2(a[toz[i]], b[toz[i]]);
	int ans = 1;
	for (int i = 0; i < num; i++)
	{
		if (col[i] == 0)
		{
			ans = ans * 2 % 1000000007;
			queue<pii>que;
			que.push(make_pair(i, 1));
			for (;;)
			{
				if (que.empty())break;
				pii z = que.front();
				que.pop();
				if (col[z.first] != 0)
				{
					if (col[z.first] != z.second)
					{
						printf("0\n");
						return 0;
					}
					continue;
				}
				col[z.first] = z.second;
				tree.pt = 0;
				tree.get(a[z.first], b[z.first], 1, 0, SIZE - 1, 0);
				for (int j = 0; j < tree.pt; j++)que.push(make_pair(tree.x[j], -z.second));
			}
		}
	}
	vector<int>va, vb;
	for (int i = 0; i < num + num; i++)
	{
		if (a[toz[i]] == i)
		{
			if (col[toz[i]] == 1)va.push_back(toz[i]);
			else vb.push_back(toz[i]);
		}
		else
		{
			if (col[toz[i]] == 1)
			{
				if (va[va.size() - 1] != toz[i])ans = 0;
				else va.pop_back();
			}
			else
			{
				if (vb[vb.size() - 1] != toz[i])ans = 0;
				else vb.pop_back();
			}
		}
	}
	printf("%d\n", ans);
}

Compilation message

port_facility.cpp:12:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (disable: 4996)
 
port_facility.cpp: In function 'int main()':
port_facility.cpp:93:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &num);
  ~~~~~^~~~~~~~~~~~
port_facility.cpp:94:74: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for (int i = 0; i < num; i++)scanf("%d%d", &a[i], &b[i]), a[i]--, b[i]--, toz[a[i]] = toz[b[i]] = i;
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 49 ms 50168 KB Output is correct
2 Correct 52 ms 50168 KB Output is correct
3 Correct 48 ms 50092 KB Output is correct
4 Correct 49 ms 50040 KB Output is correct
5 Correct 57 ms 50168 KB Output is correct
6 Correct 58 ms 50168 KB Output is correct
7 Correct 49 ms 50040 KB Output is correct
8 Correct 49 ms 50040 KB Output is correct
9 Correct 49 ms 50040 KB Output is correct
10 Correct 50 ms 50168 KB Output is correct
11 Correct 49 ms 50168 KB Output is correct
12 Correct 49 ms 50168 KB Output is correct
13 Correct 49 ms 50168 KB Output is correct
14 Correct 50 ms 50040 KB Output is correct
15 Correct 49 ms 50176 KB Output is correct
16 Correct 49 ms 50116 KB Output is correct
17 Correct 49 ms 50168 KB Output is correct
18 Correct 48 ms 50168 KB Output is correct
19 Correct 58 ms 49912 KB Output is correct
20 Correct 54 ms 49916 KB Output is correct
21 Correct 58 ms 49912 KB Output is correct
22 Correct 49 ms 49912 KB Output is correct
23 Correct 64 ms 49916 KB Output is correct
24 Correct 57 ms 50040 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 49 ms 50168 KB Output is correct
2 Correct 52 ms 50168 KB Output is correct
3 Correct 48 ms 50092 KB Output is correct
4 Correct 49 ms 50040 KB Output is correct
5 Correct 57 ms 50168 KB Output is correct
6 Correct 58 ms 50168 KB Output is correct
7 Correct 49 ms 50040 KB Output is correct
8 Correct 49 ms 50040 KB Output is correct
9 Correct 49 ms 50040 KB Output is correct
10 Correct 50 ms 50168 KB Output is correct
11 Correct 49 ms 50168 KB Output is correct
12 Correct 49 ms 50168 KB Output is correct
13 Correct 49 ms 50168 KB Output is correct
14 Correct 50 ms 50040 KB Output is correct
15 Correct 49 ms 50176 KB Output is correct
16 Correct 49 ms 50116 KB Output is correct
17 Correct 49 ms 50168 KB Output is correct
18 Correct 48 ms 50168 KB Output is correct
19 Correct 58 ms 49912 KB Output is correct
20 Correct 54 ms 49916 KB Output is correct
21 Correct 58 ms 49912 KB Output is correct
22 Correct 49 ms 49912 KB Output is correct
23 Correct 64 ms 49916 KB Output is correct
24 Correct 57 ms 50040 KB Output is correct
25 Correct 51 ms 50552 KB Output is correct
26 Correct 51 ms 50424 KB Output is correct
27 Correct 51 ms 50552 KB Output is correct
28 Correct 52 ms 50552 KB Output is correct
29 Correct 61 ms 50552 KB Output is correct
30 Correct 61 ms 50452 KB Output is correct
31 Correct 55 ms 50552 KB Output is correct
32 Correct 65 ms 50552 KB Output is correct
33 Correct 51 ms 50572 KB Output is correct
34 Correct 50 ms 50552 KB Output is correct
35 Correct 51 ms 50552 KB Output is correct
36 Correct 53 ms 50296 KB Output is correct
37 Correct 61 ms 50552 KB Output is correct
38 Correct 51 ms 50552 KB Output is correct
39 Correct 51 ms 50552 KB Output is correct
40 Correct 52 ms 50552 KB Output is correct
41 Correct 51 ms 50396 KB Output is correct
42 Correct 52 ms 50424 KB Output is correct
43 Correct 50 ms 50552 KB Output is correct
44 Correct 53 ms 50552 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 49 ms 50168 KB Output is correct
2 Correct 52 ms 50168 KB Output is correct
3 Correct 48 ms 50092 KB Output is correct
4 Correct 49 ms 50040 KB Output is correct
5 Correct 57 ms 50168 KB Output is correct
6 Correct 58 ms 50168 KB Output is correct
7 Correct 49 ms 50040 KB Output is correct
8 Correct 49 ms 50040 KB Output is correct
9 Correct 49 ms 50040 KB Output is correct
10 Correct 50 ms 50168 KB Output is correct
11 Correct 49 ms 50168 KB Output is correct
12 Correct 49 ms 50168 KB Output is correct
13 Correct 49 ms 50168 KB Output is correct
14 Correct 50 ms 50040 KB Output is correct
15 Correct 49 ms 50176 KB Output is correct
16 Correct 49 ms 50116 KB Output is correct
17 Correct 49 ms 50168 KB Output is correct
18 Correct 48 ms 50168 KB Output is correct
19 Correct 58 ms 49912 KB Output is correct
20 Correct 54 ms 49916 KB Output is correct
21 Correct 58 ms 49912 KB Output is correct
22 Correct 49 ms 49912 KB Output is correct
23 Correct 64 ms 49916 KB Output is correct
24 Correct 57 ms 50040 KB Output is correct
25 Correct 51 ms 50552 KB Output is correct
26 Correct 51 ms 50424 KB Output is correct
27 Correct 51 ms 50552 KB Output is correct
28 Correct 52 ms 50552 KB Output is correct
29 Correct 61 ms 50552 KB Output is correct
30 Correct 61 ms 50452 KB Output is correct
31 Correct 55 ms 50552 KB Output is correct
32 Correct 65 ms 50552 KB Output is correct
33 Correct 51 ms 50572 KB Output is correct
34 Correct 50 ms 50552 KB Output is correct
35 Correct 51 ms 50552 KB Output is correct
36 Correct 53 ms 50296 KB Output is correct
37 Correct 61 ms 50552 KB Output is correct
38 Correct 51 ms 50552 KB Output is correct
39 Correct 51 ms 50552 KB Output is correct
40 Correct 52 ms 50552 KB Output is correct
41 Correct 51 ms 50396 KB Output is correct
42 Correct 52 ms 50424 KB Output is correct
43 Correct 50 ms 50552 KB Output is correct
44 Correct 53 ms 50552 KB Output is correct
45 Correct 207 ms 79768 KB Output is correct
46 Correct 213 ms 79864 KB Output is correct
47 Correct 211 ms 79836 KB Output is correct
48 Correct 201 ms 79872 KB Output is correct
49 Correct 249 ms 79740 KB Output is correct
50 Correct 162 ms 79612 KB Output is correct
51 Correct 143 ms 79608 KB Output is correct
52 Correct 183 ms 79224 KB Output is correct
53 Correct 229 ms 69800 KB Output is correct
54 Correct 216 ms 83212 KB Output is correct
55 Correct 172 ms 75768 KB Output is correct
56 Correct 194 ms 76152 KB Output is correct
57 Correct 196 ms 79352 KB Output is correct
58 Correct 212 ms 79328 KB Output is correct
59 Correct 277 ms 80084 KB Output is correct
60 Correct 247 ms 79988 KB Output is correct
61 Correct 251 ms 79868 KB Output is correct
62 Correct 146 ms 79864 KB Output is correct
63 Correct 168 ms 79692 KB Output is correct
64 Correct 143 ms 79840 KB Output is correct
65 Correct 249 ms 85924 KB Output is correct
66 Correct 254 ms 87428 KB Output is correct
67 Correct 196 ms 80376 KB Output is correct
68 Correct 197 ms 79288 KB Output is correct
69 Correct 239 ms 79836 KB Output is correct
70 Correct 202 ms 80888 KB Output is correct
71 Correct 178 ms 71440 KB Output is correct
72 Correct 179 ms 71620 KB Output is correct
73 Correct 179 ms 71188 KB Output is correct
74 Correct 182 ms 71416 KB Output is correct
75 Correct 174 ms 79456 KB Output is correct
76 Correct 171 ms 79352 KB Output is correct
77 Correct 171 ms 79224 KB Output is correct
78 Correct 202 ms 79864 KB Output is correct
79 Correct 200 ms 79832 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 49 ms 50168 KB Output is correct
2 Correct 52 ms 50168 KB Output is correct
3 Correct 48 ms 50092 KB Output is correct
4 Correct 49 ms 50040 KB Output is correct
5 Correct 57 ms 50168 KB Output is correct
6 Correct 58 ms 50168 KB Output is correct
7 Correct 49 ms 50040 KB Output is correct
8 Correct 49 ms 50040 KB Output is correct
9 Correct 49 ms 50040 KB Output is correct
10 Correct 50 ms 50168 KB Output is correct
11 Correct 49 ms 50168 KB Output is correct
12 Correct 49 ms 50168 KB Output is correct
13 Correct 49 ms 50168 KB Output is correct
14 Correct 50 ms 50040 KB Output is correct
15 Correct 49 ms 50176 KB Output is correct
16 Correct 49 ms 50116 KB Output is correct
17 Correct 49 ms 50168 KB Output is correct
18 Correct 48 ms 50168 KB Output is correct
19 Correct 58 ms 49912 KB Output is correct
20 Correct 54 ms 49916 KB Output is correct
21 Correct 58 ms 49912 KB Output is correct
22 Correct 49 ms 49912 KB Output is correct
23 Correct 64 ms 49916 KB Output is correct
24 Correct 57 ms 50040 KB Output is correct
25 Correct 51 ms 50552 KB Output is correct
26 Correct 51 ms 50424 KB Output is correct
27 Correct 51 ms 50552 KB Output is correct
28 Correct 52 ms 50552 KB Output is correct
29 Correct 61 ms 50552 KB Output is correct
30 Correct 61 ms 50452 KB Output is correct
31 Correct 55 ms 50552 KB Output is correct
32 Correct 65 ms 50552 KB Output is correct
33 Correct 51 ms 50572 KB Output is correct
34 Correct 50 ms 50552 KB Output is correct
35 Correct 51 ms 50552 KB Output is correct
36 Correct 53 ms 50296 KB Output is correct
37 Correct 61 ms 50552 KB Output is correct
38 Correct 51 ms 50552 KB Output is correct
39 Correct 51 ms 50552 KB Output is correct
40 Correct 52 ms 50552 KB Output is correct
41 Correct 51 ms 50396 KB Output is correct
42 Correct 52 ms 50424 KB Output is correct
43 Correct 50 ms 50552 KB Output is correct
44 Correct 53 ms 50552 KB Output is correct
45 Correct 207 ms 79768 KB Output is correct
46 Correct 213 ms 79864 KB Output is correct
47 Correct 211 ms 79836 KB Output is correct
48 Correct 201 ms 79872 KB Output is correct
49 Correct 249 ms 79740 KB Output is correct
50 Correct 162 ms 79612 KB Output is correct
51 Correct 143 ms 79608 KB Output is correct
52 Correct 183 ms 79224 KB Output is correct
53 Correct 229 ms 69800 KB Output is correct
54 Correct 216 ms 83212 KB Output is correct
55 Correct 172 ms 75768 KB Output is correct
56 Correct 194 ms 76152 KB Output is correct
57 Correct 196 ms 79352 KB Output is correct
58 Correct 212 ms 79328 KB Output is correct
59 Correct 277 ms 80084 KB Output is correct
60 Correct 247 ms 79988 KB Output is correct
61 Correct 251 ms 79868 KB Output is correct
62 Correct 146 ms 79864 KB Output is correct
63 Correct 168 ms 79692 KB Output is correct
64 Correct 143 ms 79840 KB Output is correct
65 Correct 249 ms 85924 KB Output is correct
66 Correct 254 ms 87428 KB Output is correct
67 Correct 196 ms 80376 KB Output is correct
68 Correct 197 ms 79288 KB Output is correct
69 Correct 239 ms 79836 KB Output is correct
70 Correct 202 ms 80888 KB Output is correct
71 Correct 178 ms 71440 KB Output is correct
72 Correct 179 ms 71620 KB Output is correct
73 Correct 179 ms 71188 KB Output is correct
74 Correct 182 ms 71416 KB Output is correct
75 Correct 174 ms 79456 KB Output is correct
76 Correct 171 ms 79352 KB Output is correct
77 Correct 171 ms 79224 KB Output is correct
78 Correct 202 ms 79864 KB Output is correct
79 Correct 200 ms 79832 KB Output is correct
80 Correct 2133 ms 347976 KB Output is correct
81 Correct 2086 ms 347992 KB Output is correct
82 Correct 2458 ms 347948 KB Output is correct
83 Correct 2033 ms 347964 KB Output is correct
84 Correct 2012 ms 347944 KB Output is correct
85 Correct 1253 ms 347128 KB Output is correct
86 Correct 1280 ms 344992 KB Output is correct
87 Correct 1879 ms 343720 KB Output is correct
88 Correct 2879 ms 246060 KB Output is correct
89 Correct 2297 ms 403324 KB Output is correct
90 Correct 1678 ms 318852 KB Output is correct
91 Correct 1661 ms 318772 KB Output is correct
92 Correct 2009 ms 343668 KB Output is correct
93 Correct 1842 ms 343672 KB Output is correct
94 Correct 2437 ms 350340 KB Output is correct
95 Correct 2132 ms 349384 KB Output is correct
96 Correct 2001 ms 349196 KB Output is correct
97 Correct 1272 ms 346972 KB Output is correct
98 Correct 1246 ms 345720 KB Output is correct
99 Correct 1256 ms 349688 KB Output is correct
100 Correct 4158 ms 437388 KB Output is correct
101 Correct 4043 ms 440128 KB Output is correct
102 Correct 2017 ms 378340 KB Output is correct
103 Correct 2031 ms 368084 KB Output is correct
104 Correct 2109 ms 372712 KB Output is correct
105 Correct 2121 ms 362656 KB Output is correct
106 Correct 1753 ms 275328 KB Output is correct
107 Correct 1744 ms 275244 KB Output is correct
108 Correct 2033 ms 279116 KB Output is correct
109 Correct 2004 ms 278568 KB Output is correct
110 Correct 1670 ms 358076 KB Output is correct
111 Correct 1667 ms 358136 KB Output is correct
112 Correct 1582 ms 358292 KB Output is correct
113 Correct 2001 ms 362796 KB Output is correct
114 Correct 1997 ms 362636 KB Output is correct