zoukankan      html  css  js  c++  java
  • 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
    ", ans[Time[i]]);
            else puts("-1");
        }
    }
  • 相关阅读:
    Linux 组管理、权限
    Linux 简单文本处理
    Linux 基础内容
    Python selectors实现socket并发
    Python select实现socket并发
    SOA专博收藏
    高亮显示代码编辑器控件【转】
    WCF开源开发框架Zyan
    ubuntu中文实训手册
    Easy UI treegrid 分页实例
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13271693.html
Copyright © 2011-2022 走看看