Submission #209832

# Submission time Handle Problem Language Result Execution time Memory
209832 2020-03-15T16:30:34 Z stefdasca Port Facility (JOI17_port_facility) C++14
100 / 100
3768 ms 163516 KB
/*

        JOISC 17-port_facility

    Let's define a graph where each container is a vertex and we draw edges between two containers which can't be put in the same area.
Therefore, the answer will be 2^(number of connected components) or 0 if the graph isn't bipartite(this can be checked beforehand with some simulation).

    Since the number of edges can be really big, we need segment tree to reduce the number of edges we are going to use.

*/
#include<bits/stdc++.h>
#define god dimasi5eks
#pragma GCC optimize("O3")
#define fi first
#define se second
#define pb push_back
#define pf push_front
#define mod 1000000007
#define dancila 3.14159265359
#define eps 1e-9

// #define fisier 1

using namespace std;

typedef long long ll;

int n;
pair<int, int> bk[1000002];

int poz[2000002];

bool chk(vector <pair <int, int> > v)
{
	sort(v.begin(), v.end());
	deque<pair <int, int> > d;
	for(int i = 0; i < v.size(); i++)
    {
		while(!d.empty() && d.back().se < v[i].fi)
			d.pop_back();
		if(!d.empty() && d.back().se < v[i].se)
			return 0;
		d.push_back(v[i]);
	}
	return 1;
}


int aint[8000002], aint2[8000002];
void upd(int nod, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        aint[nod] = val;
        return;
    }
    int mid = (st + dr) / 2;
    if(poz <= mid)
        upd(nod << 1, st, mid, poz, val);
    else
        upd(nod << 1|1, mid+1, dr, poz, val);
    aint[nod] = max(aint[nod << 1], aint[nod << 1|1]);
}
int query(int nod, int st, int dr, int L, int R)
{
    if(dr < L || st > R)
        return -(1<<30);
    if(L <= st && dr <= R)
        return aint[nod];
    int mid = (st + dr) / 2;
    return max(query(nod << 1, st, mid, L, R), query(nod << 1|1, mid+1, dr, L, R));
}
void upd2(int nod, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        aint2[nod] = val;
        return;
    }
    int mid = (st + dr) / 2;
    if(poz <= mid)
        upd2(nod << 1, st, mid, poz, val);
    else
        upd2(nod << 1|1, mid+1, dr, poz, val);
    aint2[nod] = min(aint2[nod << 1], aint2[nod << 1|1]);
}
int query2(int nod, int st, int dr, int L, int R)
{
    if(dr < L || st > R)
        return (1<<30);
    if(L <= st && dr <= R)
        return aint2[nod];
    int mid = (st + dr) / 2;
    return min(query2(nod << 1, st, mid, L, R), query2(nod << 1|1, mid+1, dr, L, R));
}
bool viz[1000002];
bool col[1000002];
void dfs(int nod, int c)
{
    viz[nod] = 1;
    col[nod] = c;
    upd(1, 1, n+n, bk[nod].fi, -(1<<30));
    upd2(1, 1, n+n, bk[nod].se, (1<<30));
    while(1)
    {
        int val = (1<<30);
        if(bk[nod].fi + 1 <= bk[nod].se - 1)
            val = query2(1, 1, n+n, bk[nod].fi + 1, bk[nod].se - 1);
       // cout << "A " << nod << " " << val << '\n';
        if(val < bk[nod].fi)
            dfs(poz[val], c ^ 1);
        else
            break;
    }
    while(1)
    {
        int val = -(1<<30);
        if(bk[nod].fi + 1 <= bk[nod].se - 1)
            val = query(1, 1, n+n, bk[nod].fi + 1, bk[nod].se - 1);
       // cout << "B " << nod << " " << val << '\n';
        if(val > bk[nod].se)
            dfs(poz[val], c ^ 1);
        else
            break;
    }
}
int main()
{

    #ifdef fisier
        ifstream f("input.in");
        ofstream g("output.out");
    #endif

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    for(int i = 1; i <= n+n; ++i)
    {
        upd(1, 1, n+n, i, -(1<<30));
        upd2(1, 1, n+n, i, (1<<30));
    }
    for(int i = 1; i <= n; ++i)
    {
        cin >> bk[i].fi >> bk[i].se;
        poz[bk[i].fi] = poz[bk[i].se] = i;
        upd(1, 1, n+n, bk[i].fi, bk[i].se);
        upd2(1, 1, n+n, bk[i].se, bk[i].fi);
    }
    int ans = 1;
    for(int i = 1; i <= n; ++i)
        if(!viz[i])
        {
            ans = (ans * 2) % mod;
            dfs(i, 0);
        }
    vector<pair<int, int> >a, b;
	for(int i = 1; i <= n; i++)
    {
		if(col[i])
            a.pb({bk[i].fi, bk[i].se});
		else
            b.pb({bk[i].fi, bk[i].se});
	}
    if(!chk(a) || !chk(b))
    {
        cout << 0 << '\n';
        return 0;
    }
    cout << ans << '\n';
    return 0;
}

Compilation message

port_facility.cpp: In function 'bool chk(std::vector<std::pair<int, int> >)':
port_facility.cpp:37:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < v.size(); i++)
                 ~~^~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 5 ms 376 KB Output is correct
2 Correct 5 ms 380 KB Output is correct
3 Correct 4 ms 376 KB Output is correct
4 Correct 5 ms 376 KB Output is correct
5 Correct 5 ms 376 KB Output is correct
6 Correct 5 ms 376 KB Output is correct
7 Correct 5 ms 376 KB Output is correct
8 Correct 5 ms 376 KB Output is correct
9 Correct 5 ms 376 KB Output is correct
10 Correct 5 ms 376 KB Output is correct
11 Correct 5 ms 376 KB Output is correct
12 Correct 5 ms 376 KB Output is correct
13 Correct 5 ms 376 KB Output is correct
14 Correct 5 ms 376 KB Output is correct
15 Correct 8 ms 376 KB Output is correct
16 Correct 5 ms 376 KB Output is correct
17 Correct 5 ms 376 KB Output is correct
18 Correct 5 ms 376 KB Output is correct
19 Correct 5 ms 376 KB Output is correct
20 Correct 5 ms 376 KB Output is correct
21 Correct 5 ms 380 KB Output is correct
22 Correct 5 ms 376 KB Output is correct
23 Correct 5 ms 376 KB Output is correct
24 Correct 5 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 376 KB Output is correct
2 Correct 5 ms 380 KB Output is correct
3 Correct 4 ms 376 KB Output is correct
4 Correct 5 ms 376 KB Output is correct
5 Correct 5 ms 376 KB Output is correct
6 Correct 5 ms 376 KB Output is correct
7 Correct 5 ms 376 KB Output is correct
8 Correct 5 ms 376 KB Output is correct
9 Correct 5 ms 376 KB Output is correct
10 Correct 5 ms 376 KB Output is correct
11 Correct 5 ms 376 KB Output is correct
12 Correct 5 ms 376 KB Output is correct
13 Correct 5 ms 376 KB Output is correct
14 Correct 5 ms 376 KB Output is correct
15 Correct 8 ms 376 KB Output is correct
16 Correct 5 ms 376 KB Output is correct
17 Correct 5 ms 376 KB Output is correct
18 Correct 5 ms 376 KB Output is correct
19 Correct 5 ms 376 KB Output is correct
20 Correct 5 ms 376 KB Output is correct
21 Correct 5 ms 380 KB Output is correct
22 Correct 5 ms 376 KB Output is correct
23 Correct 5 ms 376 KB Output is correct
24 Correct 5 ms 376 KB Output is correct
25 Correct 8 ms 632 KB Output is correct
26 Correct 8 ms 632 KB Output is correct
27 Correct 8 ms 632 KB Output is correct
28 Correct 8 ms 632 KB Output is correct
29 Correct 9 ms 632 KB Output is correct
30 Correct 8 ms 632 KB Output is correct
31 Correct 8 ms 632 KB Output is correct
32 Correct 8 ms 632 KB Output is correct
33 Correct 8 ms 504 KB Output is correct
34 Correct 9 ms 632 KB Output is correct
35 Correct 7 ms 504 KB Output is correct
36 Correct 8 ms 504 KB Output is correct
37 Correct 8 ms 632 KB Output is correct
38 Correct 7 ms 632 KB Output is correct
39 Correct 7 ms 504 KB Output is correct
40 Correct 7 ms 504 KB Output is correct
41 Correct 8 ms 632 KB Output is correct
42 Correct 8 ms 632 KB Output is correct
43 Correct 8 ms 632 KB Output is correct
44 Correct 7 ms 760 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 376 KB Output is correct
2 Correct 5 ms 380 KB Output is correct
3 Correct 4 ms 376 KB Output is correct
4 Correct 5 ms 376 KB Output is correct
5 Correct 5 ms 376 KB Output is correct
6 Correct 5 ms 376 KB Output is correct
7 Correct 5 ms 376 KB Output is correct
8 Correct 5 ms 376 KB Output is correct
9 Correct 5 ms 376 KB Output is correct
10 Correct 5 ms 376 KB Output is correct
11 Correct 5 ms 376 KB Output is correct
12 Correct 5 ms 376 KB Output is correct
13 Correct 5 ms 376 KB Output is correct
14 Correct 5 ms 376 KB Output is correct
15 Correct 8 ms 376 KB Output is correct
16 Correct 5 ms 376 KB Output is correct
17 Correct 5 ms 376 KB Output is correct
18 Correct 5 ms 376 KB Output is correct
19 Correct 5 ms 376 KB Output is correct
20 Correct 5 ms 376 KB Output is correct
21 Correct 5 ms 380 KB Output is correct
22 Correct 5 ms 376 KB Output is correct
23 Correct 5 ms 376 KB Output is correct
24 Correct 5 ms 376 KB Output is correct
25 Correct 8 ms 632 KB Output is correct
26 Correct 8 ms 632 KB Output is correct
27 Correct 8 ms 632 KB Output is correct
28 Correct 8 ms 632 KB Output is correct
29 Correct 9 ms 632 KB Output is correct
30 Correct 8 ms 632 KB Output is correct
31 Correct 8 ms 632 KB Output is correct
32 Correct 8 ms 632 KB Output is correct
33 Correct 8 ms 504 KB Output is correct
34 Correct 9 ms 632 KB Output is correct
35 Correct 7 ms 504 KB Output is correct
36 Correct 8 ms 504 KB Output is correct
37 Correct 8 ms 632 KB Output is correct
38 Correct 7 ms 632 KB Output is correct
39 Correct 7 ms 504 KB Output is correct
40 Correct 7 ms 504 KB Output is correct
41 Correct 8 ms 632 KB Output is correct
42 Correct 8 ms 632 KB Output is correct
43 Correct 8 ms 632 KB Output is correct
44 Correct 7 ms 760 KB Output is correct
45 Correct 206 ms 10476 KB Output is correct
46 Correct 212 ms 11500 KB Output is correct
47 Correct 207 ms 9708 KB Output is correct
48 Correct 210 ms 11372 KB Output is correct
49 Correct 211 ms 9832 KB Output is correct
50 Correct 202 ms 10688 KB Output is correct
51 Correct 198 ms 10600 KB Output is correct
52 Correct 160 ms 9196 KB Output is correct
53 Correct 218 ms 9840 KB Output is correct
54 Correct 206 ms 16744 KB Output is correct
55 Correct 205 ms 12684 KB Output is correct
56 Correct 206 ms 12760 KB Output is correct
57 Correct 202 ms 9328 KB Output is correct
58 Correct 179 ms 9192 KB Output is correct
59 Correct 202 ms 9328 KB Output is correct
60 Correct 213 ms 9356 KB Output is correct
61 Correct 213 ms 9204 KB Output is correct
62 Correct 190 ms 9072 KB Output is correct
63 Correct 198 ms 9072 KB Output is correct
64 Correct 204 ms 8688 KB Output is correct
65 Correct 277 ms 16748 KB Output is correct
66 Correct 249 ms 16664 KB Output is correct
67 Correct 211 ms 13388 KB Output is correct
68 Correct 224 ms 13396 KB Output is correct
69 Correct 221 ms 13164 KB Output is correct
70 Correct 233 ms 13004 KB Output is correct
71 Correct 211 ms 17356 KB Output is correct
72 Correct 206 ms 17296 KB Output is correct
73 Correct 217 ms 14548 KB Output is correct
74 Correct 205 ms 14800 KB Output is correct
75 Correct 188 ms 13932 KB Output is correct
76 Correct 197 ms 17112 KB Output is correct
77 Correct 189 ms 17084 KB Output is correct
78 Correct 209 ms 11244 KB Output is correct
79 Correct 216 ms 10476 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 376 KB Output is correct
2 Correct 5 ms 380 KB Output is correct
3 Correct 4 ms 376 KB Output is correct
4 Correct 5 ms 376 KB Output is correct
5 Correct 5 ms 376 KB Output is correct
6 Correct 5 ms 376 KB Output is correct
7 Correct 5 ms 376 KB Output is correct
8 Correct 5 ms 376 KB Output is correct
9 Correct 5 ms 376 KB Output is correct
10 Correct 5 ms 376 KB Output is correct
11 Correct 5 ms 376 KB Output is correct
12 Correct 5 ms 376 KB Output is correct
13 Correct 5 ms 376 KB Output is correct
14 Correct 5 ms 376 KB Output is correct
15 Correct 8 ms 376 KB Output is correct
16 Correct 5 ms 376 KB Output is correct
17 Correct 5 ms 376 KB Output is correct
18 Correct 5 ms 376 KB Output is correct
19 Correct 5 ms 376 KB Output is correct
20 Correct 5 ms 376 KB Output is correct
21 Correct 5 ms 380 KB Output is correct
22 Correct 5 ms 376 KB Output is correct
23 Correct 5 ms 376 KB Output is correct
24 Correct 5 ms 376 KB Output is correct
25 Correct 8 ms 632 KB Output is correct
26 Correct 8 ms 632 KB Output is correct
27 Correct 8 ms 632 KB Output is correct
28 Correct 8 ms 632 KB Output is correct
29 Correct 9 ms 632 KB Output is correct
30 Correct 8 ms 632 KB Output is correct
31 Correct 8 ms 632 KB Output is correct
32 Correct 8 ms 632 KB Output is correct
33 Correct 8 ms 504 KB Output is correct
34 Correct 9 ms 632 KB Output is correct
35 Correct 7 ms 504 KB Output is correct
36 Correct 8 ms 504 KB Output is correct
37 Correct 8 ms 632 KB Output is correct
38 Correct 7 ms 632 KB Output is correct
39 Correct 7 ms 504 KB Output is correct
40 Correct 7 ms 504 KB Output is correct
41 Correct 8 ms 632 KB Output is correct
42 Correct 8 ms 632 KB Output is correct
43 Correct 8 ms 632 KB Output is correct
44 Correct 7 ms 760 KB Output is correct
45 Correct 206 ms 10476 KB Output is correct
46 Correct 212 ms 11500 KB Output is correct
47 Correct 207 ms 9708 KB Output is correct
48 Correct 210 ms 11372 KB Output is correct
49 Correct 211 ms 9832 KB Output is correct
50 Correct 202 ms 10688 KB Output is correct
51 Correct 198 ms 10600 KB Output is correct
52 Correct 160 ms 9196 KB Output is correct
53 Correct 218 ms 9840 KB Output is correct
54 Correct 206 ms 16744 KB Output is correct
55 Correct 205 ms 12684 KB Output is correct
56 Correct 206 ms 12760 KB Output is correct
57 Correct 202 ms 9328 KB Output is correct
58 Correct 179 ms 9192 KB Output is correct
59 Correct 202 ms 9328 KB Output is correct
60 Correct 213 ms 9356 KB Output is correct
61 Correct 213 ms 9204 KB Output is correct
62 Correct 190 ms 9072 KB Output is correct
63 Correct 198 ms 9072 KB Output is correct
64 Correct 204 ms 8688 KB Output is correct
65 Correct 277 ms 16748 KB Output is correct
66 Correct 249 ms 16664 KB Output is correct
67 Correct 211 ms 13388 KB Output is correct
68 Correct 224 ms 13396 KB Output is correct
69 Correct 221 ms 13164 KB Output is correct
70 Correct 233 ms 13004 KB Output is correct
71 Correct 211 ms 17356 KB Output is correct
72 Correct 206 ms 17296 KB Output is correct
73 Correct 217 ms 14548 KB Output is correct
74 Correct 205 ms 14800 KB Output is correct
75 Correct 188 ms 13932 KB Output is correct
76 Correct 197 ms 17112 KB Output is correct
77 Correct 189 ms 17084 KB Output is correct
78 Correct 209 ms 11244 KB Output is correct
79 Correct 216 ms 10476 KB Output is correct
80 Correct 2682 ms 88000 KB Output is correct
81 Correct 2754 ms 86964 KB Output is correct
82 Correct 2613 ms 83864 KB Output is correct
83 Correct 2631 ms 87100 KB Output is correct
84 Correct 2657 ms 87900 KB Output is correct
85 Correct 2604 ms 79044 KB Output is correct
86 Correct 2636 ms 82112 KB Output is correct
87 Correct 2213 ms 81108 KB Output is correct
88 Correct 3364 ms 89304 KB Output is correct
89 Correct 2786 ms 155612 KB Output is correct
90 Correct 2776 ms 116352 KB Output is correct
91 Correct 2745 ms 116404 KB Output is correct
92 Correct 2761 ms 81160 KB Output is correct
93 Correct 2427 ms 81112 KB Output is correct
94 Correct 2835 ms 83208 KB Output is correct
95 Correct 2800 ms 82736 KB Output is correct
96 Correct 2648 ms 82496 KB Output is correct
97 Correct 2594 ms 75268 KB Output is correct
98 Correct 2707 ms 82320 KB Output is correct
99 Correct 2564 ms 76612 KB Output is correct
100 Correct 3696 ms 155524 KB Output is correct
101 Correct 3768 ms 155596 KB Output is correct
102 Correct 2801 ms 124472 KB Output is correct
103 Correct 2888 ms 124344 KB Output is correct
104 Correct 2774 ms 118700 KB Output is correct
105 Correct 2777 ms 121300 KB Output is correct
106 Correct 2742 ms 163516 KB Output is correct
107 Correct 2725 ms 163516 KB Output is correct
108 Correct 2651 ms 138676 KB Output is correct
109 Correct 2713 ms 138680 KB Output is correct
110 Correct 2478 ms 157876 KB Output is correct
111 Correct 2415 ms 159456 KB Output is correct
112 Correct 2479 ms 159648 KB Output is correct
113 Correct 2645 ms 83864 KB Output is correct
114 Correct 2727 ms 86844 KB Output is correct