Submission #472110

#TimeUsernameProblemLanguageResultExecution timeMemory
472110Cross_RatioRoller Coaster Railroad (IOI16_railroad)C++14
0 / 100
423 ms45660 KiB
#include <bits/stdc++.h> //#include "railroad.h" using namespace std; const int INF = 1e9; struct SegTree { struct Node { int ma, sum; Node(int m1, int m2) : ma(m1), sum(m2) {} Node(int v) : ma(v), sum(v) {} Node() : ma(-INF),sum(0) {} }; vector<Node> seg; int MAX; SegTree(int N) { int i; for(i=1;i<2*N;i*=2) {} seg.resize(i); MAX = i; } Node f(Node x, Node y) { return Node(max(x.ma,y.ma),x.sum+y.sum); } void cons() { for(register int i = MAX/2-1; i>0; i--) { seg[i] = f(seg[2*i],seg[2*i+1]); } } Node sum(int s, int e, int n, int ns, int ne) { if(e<=ns||ne<=s) return Node(); if(s<=ns&&ne<=e) return seg[n]; int mid = ns + ne >> 1; return f(sum(s,e,2*n,ns,mid),sum(s,e,2*n+1,mid,ne)); } void update(int n) { n += MAX/2; n /= 2; while(n) { seg[n] = f(seg[2*n],seg[2*n+1]); n /= 2; } } void Plus(int n, int a) { int b = seg[n+MAX/2].ma; seg[n+MAX/2] = Node(b+a); update(n); } void Edit(int n, int a) { seg[n+MAX/2] = Node(a); update(n); } Node sum(int s, int e) { if(s >= e) return Node(); return sum(s, e, 1, 0, MAX/2); } int FindLeft(int s, int e) { if(s == e) return INF; if(s + 1 == e) { if(seg[s+MAX/2].ma==1) return s; else return INF; } int mid = s + e >> 1; if(sum(s, mid).ma == 1) return FindLeft(s, mid); return FindLeft(mid, e); } }; typedef pair<int,int> P; vector<int> B; int getidx(int n) { return lower_bound(B.begin(),B.end(),n) - B.begin(); } long long plan_roller_coaster(vector<int> s,vector<int> t) { int N = s.size(); int i; for(i=0;i<N;i++) { B.push_back(s[i]); B.push_back(t[i]); } sort(B.begin(),B.end()); B.erase(unique(B.begin(),B.end()),B.end()); vector<vector<int> > Q1, Q2; Q1.resize(B.size()); Q2.resize(B.size()); for(i=0;i<N;i++) { int n = getidx(s[i]); Q1[n].push_back(i); int m = getidx(t[i]); Q2[m].push_back(i); } int cnt1 = 0; int cnt2 = 0; set<int> S; for(i=B.size()-1;i>=0;i--) { for(int n : Q1[i]) { cnt1++; S.insert(i); } for(int n : Q2[i]) { cnt2++; if(S.find(i) != S.end()) { cnt1++; } } if(cnt2 > cnt1 + 1) return 1; } return 0; }

Compilation message (stderr)

railroad.cpp: In member function 'SegTree::Node SegTree::sum(int, int, int, int, int)':
railroad.cpp:31:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   31 |         int mid = ns + ne >> 1;
      |                   ~~~^~~~
railroad.cpp: In member function 'int SegTree::FindLeft(int, int)':
railroad.cpp:61:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   61 |         int mid = s + e >> 1;
      |                   ~~^~~
railroad.cpp: In function 'long long int plan_roller_coaster(std::vector<int>, std::vector<int>)':
railroad.cpp:93:17: warning: unused variable 'n' [-Wunused-variable]
   93 |         for(int n : Q1[i]) {
      |                 ^
railroad.cpp:97:17: warning: unused variable 'n' [-Wunused-variable]
   97 |         for(int n : Q2[i]) {
      |                 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...