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...