题目大意

给定一条数轴. 数轴上有\(n\)个点, 它们的初始位置给定, 移动速度也给定. 从0时刻开始, 所有点都从其初始位置按照其移动速度向数轴正方向移动. 这些点开始时可能是红色的, 也可能是黑色的, 这由你来决定, 也就是说这些点的颜色状态有\(2^n\)种; 假如某一时刻一个黑色的点与一个红色的点处于同一位置时, 则这个黑色的点会变成红色. 问有这\(2^n\)中状态中有多少满足最终所有点都变成红色.

\(n \le 10^5\), 点的速度和位置\(\le 10^9\)

题解

开始时我们默认所有点都是黑色的.

考虑把一个点变成红色会有什么样的影响: 首先是速度比他快并且起始位置在它后面的点会追上它, 因而变成红色; 同时速度比它慢且起始位置在它前面的点会被它追上, 因此也会变成红色; 但我们发现还有一些点也会变成红色: 比如说一个起始位置在后面的点追及后变成红色, 这之后可能继续追及一些点, 因此一些起始位置在这个点前面且速度比它快的点也有可能变成红色.

我们考虑把所有点按照其速度从小到大排序, 对于一个点我们把它变成红色, 那么我们找到最左边的一个起始位置大于等于它的点, 再找到最右边的起始位置小于等于它的点, 则我们发现这两个点之间的区间中, 所有点都能与之一起变成红色. 线段树优化DP即可.

这份代码目前还是WA的, 问题主要在于题目没有说清楚对于位置相同以及速度相同的点应该怎么处理.

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cstring> namespace Zeonfai
{
inline int getInt()
{
int a = 0, sgn = 1; char c;
while(! isdigit(c = getchar())) if(c == '-') sgn *= -1;
while(isdigit(c)) a = a * 10 + c - '0', c = getchar();
return a * sgn;
}
}
using namespace std;
const int N = (int)2e5, MOD = (int)1e9 + 7;
int n;
int mn[N + 1], mx[N + 1];
struct point
{
int v, pos;
inline int operator <(const point &a) const {return v == a.v ? pos < a.pos : v < a.v;} // 注意速度相同的处理
}p[N + 1];
struct section
{
int L, R;
inline int operator <(const section &a) const {return R == a.R ? L < a.L : R < a.R;}
}sec[N + 1];
struct binaryIndexedTree
{
int a[N + 2];
inline binaryIndexedTree() {memset(a, 0, sizeof(a));}
inline void modify(int pos, int x)
{
for(int i = pos + 1; i <= n + 1; i += i & - i) a[i] = (a[i] + x) % MOD;
}
int query(int pos)
{
int res = 0;
for(int i = pos + 1; i; i -= i & - i) res = (res + a[i]) % MOD;
return res;
}
inline int query(int L, int R) {return (query(R) - query(L - 1) + MOD) % MOD;}
}BIT;
int main()
{ #ifndef ONLINE_JUDGE freopen("incubator.in", "r", stdin);
freopen("incubator.out", "w", stdout); #endif using namespace Zeonfai;
n = getInt();
for(int i = 1; i <= n; ++ i) p[i].pos = getInt(), p[i].v = getInt();
sort(p + 1, p + n + 1);
for(int i = 1; i <= n; ++ i) mx[i] = i == 1 ? p[i].pos : max(mx[i - 1], p[i].pos);
for(int i = n; i; -- i) mn[i] = i == n ? p[i].pos : min(mn[i + 1], p[i].pos);
for(int i = 1; i <= n; ++ i)
{
int L = 1, R = i - 1, pos = i;
while(L <= R) if((mx[L + R >> 1] > p[i].pos) & (p[L + R >> 1].v != p[i].v)) {pos = L + R >> 1; R = (L + R >> 1) - 1;} else L = (L + R >> 1) + 1;
sec[i].L = pos;
L = i + 1; R = n; pos = i;
while(L <= R) if((mn[L + R >> 1] < p[i].pos) & (p[L + R >> 1].v != p[i].v)) {pos = L + R >> 1; L = (L + R >> 1) + 1;} else R = (L + R >> 1) - 1;
sec[i].R = pos;
}
sort(sec + 1, sec + n + 1);
BIT.modify(0, 1);
for(int i = 1; i <= n; ++ i)
BIT.modify(sec[i].R, BIT.query(sec[i].L - 1, sec[i].R));
printf("%d\n", BIT.query(n, n));
} /*
5
4 9
3 6
8 1
9 2
5 1
*/

Atcoder Contest 015 E的更多相关文章

  1. [atcoder contest 010] F - Tree Game

    [atcoder contest 010] F - Tree Game Time limit : 2sec / Memory limit : 256MB Score : 1600 points Pro ...

  2. AtCoder Grand Contest 015 C - Nuske vs Phantom Thnook

    题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_c 题目大意: 现有一个\(N×M\)的矩阵\(S\),若\(S_{i,j}=1\),则该处为 ...

  3. AtCoder Grand Contest 015 E - Mr.Aoki Incubator

    题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_e 题目大意: 数轴上有\(N\)个点,每个点初始时在位置\(X_i\),以\(V_i\)的速 ...

  4. Atcoder Grand Contest 015 F - Kenus the Ancient Greek(找性质+乱搞)

    洛谷题面传送门 & Atcoder 题面传送门 一道难度 Au 的 AGC F,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的. 首先第一问很简单,只要每次尽量让"辗转相除 ...

  5. AtCoder Grand Contest 015

    传送门 A - A+...+B Problem 题意:n个数最大值a,最小值b,求和的可能数量. #include<cstdio> #include<algorithm> us ...

  6. AtCoder Grand Contest 015 题解

    A - A+...+B Problem 常识 Problem Statement Snuke has N integers. Among them, the smallest is A, and th ...

  7. AtCoder Grand Contest 015题解

    传送门 \(A\) 找到能达到的最大的和最小的,那么中间任意一个都可以被表示出来 typedef long long ll; int n,a,b;ll res; int main(){ scanf(& ...

  8. Petrozavodsk Winter-2018. AtCoder Contest. Problem I. ADD, DIV, MAX 吉司机线段树

    题意:给你一个序列,需要支持以下操作:1:区间内的所有数加上某个值.2:区间内的所有数除以某个数(向下取整).3:询问某个区间内的最大值. 思路(从未见过的套路):维护区间最大值和区间最小值,执行2操 ...

  9. HZOI20190813 B,任(duty)

    题面:去一个神奇的网页:https://www.cnblogs.com/Juve/articles/11352426.html 听说打O(nmq)有70 但是显然博主只有50分 考点:前缀和的综合应用 ...

随机推荐

  1. System.AccessViolationException”类型的第一次机会异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    管理员cmd中运行  netsh winsock reset

  2. WinRM和WinRS

    1.6.2 新远程工具:WinRM和WinRS 2012-05-14 10:18 张杰良 译 清华大学出版社 字号:T | T 综合评级: 想读(18)  在读(5)  已读(0)   品书斋鉴(0) ...

  3. 设计模式之第2章-抽象工厂模式(Java实现)

    设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...

  4. IOS开发---菜鸟学习之路--(十七)-利用UITableView实现个人信息界面

    首先来看下我们要实现的效果 需要实现这样的效果 然后我们开始动手吧. 首先选择添加一个新的ViewController 然后打开XIB文件,添加一UITableView 并将样式设置为分组 同时将按住 ...

  5. w3wp CPU 100%问题解决

    问题: web服务器w3wp CPU占用率非常高,导致整个服务器CPU 100%占用,问题无法正常重现 解决方法: --问题尚未解决,此处记录目前的解决状态 1)下载windbg 参考https:// ...

  6. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛

    拖了好久了 链接:https://www.nowcoder.com/acm/contest/90/A来源:牛客网 跳台阶 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K, ...

  7. PHP排序的几种方法

    // 冒泡排序 function BubbleSort($arr) { // 获得数组总长度 $num = count($arr); // 正向遍历数组 for ($i = 1; $i < $n ...

  8. Unity3D 绘制扇形/环形

    using UnityEngine; using System.Collections; using System.Collections.Generic; public class Cone : M ...

  9. HexEdit Linux下命令集

    HexEdit Linux下命令集 HexEdit是一款十六进制的编辑器. 移动(Moving) , 移动到文件首部/尾部(go to start/end of the file) → 下一个字符(n ...

  10. BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集

    好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个 ...