题目大意

给定一条数轴. 数轴上有\(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. input框中的必填项之取消当前input框为必填项

    html5新增了一个required属性,可以使用这个属性对文本框设置必填项,直接在input文本框上添加required即可 . 效果如图:   

  2. CMD命令简介

    cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一般Wind ...

  3. 【Palindrome Partitioning】cpp

    题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return ...

  4. 【Partition List】cpp

    题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...

  5. 最少的硬币数量组合出1到m之间的任意面值(贪心算法)

    题目描述: 你有n种不同面值的硬币,每种面值的硬币都有无限多个,为了方便购物,你希望带尽量少的硬币,并且要能组合出 1 到 m 之间(包含1和m)的所有面值. 输入描述: 第一行包含两个整数:m ,n ...

  6. 【Part1】用JS写一个Blog(node + vue + mongoDB)

    学习JS也有一段时间了,准备试着写一个博客项目,前后端分离开发,后端用node只提供数据接口,前端用vue-cli脚手架搭建,路由也由前端控制,数据异步交互用vue的一个插件vue-resourse来 ...

  7. struts ValueStack 详解

    一.ValueStack     1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用        ...

  8. ALPHA(四)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:何家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员:何宇恒 展示组内最新 ...

  9. MySql数据库 - 3.利用MySql Workbench 对数据库进行操作

    打开MySql Workbench 选择呢一个数据库 查看数据库: 创建数据库 在SCHEMAS下的空白位置右键 - 选择 Create Schema... 如果数据库名字中有大写字母,会出现如下提示 ...

  10. 解决云服务器ECS,windows server 2012不能安装SQL Server 2012,不能安装.NET Fromework 3.5

    在云服务器上安装SQL Server 2012 时出现“启用windows功能NetFx3时出错”的问题:NetFx3指的是.NET Framework 3.5,SQL Server 2012数据库系 ...