Submission #373294

#TimeUsernameProblemLanguageResultExecution timeMemory
3732948e7Port Facility (JOI17_port_facility)C++14
0 / 100
25 ms24428 KiB
//Challenge: Accepted #include <iostream> #include <algorithm> #include <utility> #include <vector> #include <map> #include <set> #include <stack> #define ll long long #define maxn 1000005 #define mod 1000000007 #define pii pair<int, int> #define ff first #define ss second using namespace std; struct obj{ int l, r, id; obj() { l = 0, r = 0, id = 0; } obj(int a, int b, int c) { l = a, r = b, id = c; } }; obj a[maxn]; int ma[maxn]; inline bool cmp1(obj x, obj y) { return x.l < y.l; } inline bool cmp2(obj x, obj y) { return x.r > y.r; } int bit[2 * maxn]; void modify(int ind, int val) { for (;ind < 2 * maxn;ind += ind & (-ind)) bit[ind] = max(bit[ind], val); } int query(int ind) { int ret = 0; for (;ind > 0;ind -= ind & (-ind)) ret = max(ret, bit[ind]); return ret; } vector<set<int> > v; inline bool sc(int x, int y) { return *v[x].begin() < *v[y].begin(); } set<int, decltype(&sc) > se(sc); int main() { ios_base::sync_with_stdio(0);cin.tie(0); int n; cin >> n; for (int i = 0;i < n;i++) cin >> a[i].l >> a[i].r, a[i].id = i; sort(a, a + n, cmp1); int poss = 1; for (int i = 0;i < n;i++) { ma[a[i].id] = query(a[i].r); //cout << a[i].l << " " << a[i].r << " " << ma[a[i].id] << endl; modify(a[i].r, a[i].r); } sort(a, a + n, cmp2); for (int i = 0;i < n;i++) { int val = query(2 * maxn - a[i].l); if (2 * maxn - val < ma[a[i].id]) { poss = 0; break; } modify(2 * maxn - a[i].l, 2 * maxn - a[i].l); } if (poss) { sort(a, a + n, cmp1); ll ans = 1; for (int i = 0;i < n;i++) { while (se.size() && *v[*se.begin()].begin() < a[i].l) { v[*se.begin()].erase(v[*se.begin()].begin()); if (v[*se.begin()].size() == 0) { se.erase(se.begin()); ans = (ans * 2) % mod; } } vector<int> me; for (int j:se) { if (a[i].r > *v[j].begin()) { me.push_back(j); } else { break; } } if (me.size() == 0) { set<int> add; add.insert(a[i].r); v.push_back(add); se.insert(v.size() - 1); } else { v[*se.begin()].insert(a[i].r); for (int j = 1;j < me.size();j++) { for (int k:v[me[j]]) { v[me[0]].insert(k); } v[me[j]].clear(); se.erase(se.find(me[j])); } } } for (int i = 0;i < se.size();i++) ans = ans * 2 % mod; cout << ans << "\n"; } else { cout << 0 << "\n"; } } /* 4 1 3 2 5 4 8 6 7 3 1 4 2 5 3 6 5 1 4 2 10 6 9 7 8 3 5 8 1 15 2 5 3 8 4 6 14 16 7 9 10 13 11 12 */

Compilation message (stderr)

port_facility.cpp: In function 'int main()':
port_facility.cpp:100:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |        for (int j = 1;j < me.size();j++) {
      |                       ~~^~~~~~~~~~~
port_facility.cpp:109:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::set<int, bool (*)(int, int)>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |      for (int i = 0;i < se.size();i++) ans = ans * 2 % mod;
      |                     ~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...