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"); } }