Loading

IIT(ISM) Virtual Farewell E Dictator's plan for Valentine's day! 二分

有N个学生决定去看电影,途中有M个守卫。 学生的运行速度每秒1米,若途中正好到达守卫的地方则会停止。

守卫的作用时间只与客观时间有关。 [L,R)

下面给出M个询问,每个询问代表一个学生出发时的时间。 问该学生最终位置(可能是正无穷,输出-1)

分析:

 

 假设学生开始的时间是0,则若 X 在区间内,则会停止。 假设开始的时间是T,则在  T+X 在区间内时,停止。 也就是说 L - X <= T < R -X ,当T满足这一不等式的时候,就会在X处停止。

如果我们对每个询问进行遍历,复杂度O(NM) 必然超时 ,故只需对pair L-X, R-X 排序  而非查找区间即可。

STD使用了 STL的tuple 可以学习学习。

int main() {
    int n, m;
    scanf("%d%d", &m, &n);
    vector<tuple<int, int, int> > v;
    for (int i = 0; i < m; i++) {
        int l, r, x;
        scanf("%d%d%d", &l, &r, &x);
        v.emplace_back(x, l - x, r - x);
    }
    vector<int> Time(n);
    set<int> st;
    for (int i = 0; i < n; i++) {
        scanf("%d", &Time[i]);
        st.insert(Time[i]);
    }
    sort(v.begin(), v.end());
    map<int, int> ans;
    for (int i = 0; i < m; i++) {
        int cor = get<0>(v[i]), l = get<1>(v[i]), r = get<2>(v[i]);
        auto it1 = st.lower_bound(l);
        auto it2 = st.lower_bound(r);
        vector<int> done;
        while (it1 != it2) {
            ans[*it1] = cor;
            done.push_back(*it1);
            it1++;
        }
        for (auto it = done.begin(); it != done.end(); it++) st.erase(*it);
    }
    for (int i = 0; i < n; i++) {
        if (ans.count(Time[i])) printf("%d\n", ans[Time[i]]);
        else puts("-1");
    }
}

 

posted @ 2020-07-09 09:22  MQFLLY  阅读(334)  评论(2编辑  收藏  举报