题意:给出n个孩子的初始位置,和每个孩子开始的朝向(左或者右),然后孩子的行走规则是,速度始终为1,两人相遇则两人立即转身背向而行。

现在有q次询问,每次问编号为i的孩子在时间t距离原点的距离。返回所有询问之和。

分析:我们现在用另一种方式思考这个行走模式。我们认为,当两个孩子相遇时,他们并没有背向而行,而是交换了身份,并继续保持自己的行进方向和速度。

这样以来,我们就可以认为所有人都始终保持匀速直线运动。每次询问就变成了:设询问编号为i的孩子开始所处的排名(即初始时从左往右数第几个人是他)为x,问现在排名为x的人的坐标。

这个问题可以使用二分查找来解决,用两个数组分别存储向左走的人的坐标和向右走的人的坐标。

每次二分查找这个坐标值。对于一个给定的坐标值我们分别在两个数组中找到它左边有多少人,两组在其左边的人数之和应为排名-1。

当然,在两个数组中数人数的时候有两点需要注意。一个是根据时间平移所有人的坐标。由于坐标是相对的所以不需要平移每个人,只需要反向平移我们枚举的坐标点即可。

二是在数人数的时候仍然要用到二分查找,但是可以直接调用upper_bound进行处理。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime> using namespace std; const int MOD = (int)(1e9) + ;
const int MAX_N = (int)(2e5) + ; class FindingKids {
public:
long long getSum(int, int, int, int, int);
}; long long a, b, c;
long long lkid[MAX_N];
long long rkid[MAX_N];
int lcnt, rcnt;
pair<int, int> pos[MAX_N];
int ranks[MAX_N]; void generate(int n)
{
long long p;
lcnt = rcnt = ;
set<long long> my_set;
for (int i = ; i < n; i++)
{
a = (a * b % MOD + c) % MOD;
p = a % (MOD - n + i + );
if (my_set.count(p) > )
p = MOD - n + i;
my_set.insert(p);
pos[i] = make_pair(p, i);
if (p % == )
{
rkid[rcnt++] = p;
}else
{
lkid[lcnt++] = p;
}
}
} long long work(int id, long long x)
{
long long l = min(lkid[] - x, rkid[] + x);
long long r = max(lkid[lcnt - ] - x, rkid[rcnt - ] + x);
while (l < r)
{
long long mid = l + (r - l) / ;
long long lnum = upper_bound(lkid, lkid + lcnt, mid + x) - lkid;
long long rnum = upper_bound(rkid, rkid + rcnt, mid - x) - rkid;
if (lnum + rnum < id + )
l = mid + ;
else
r = mid;
}
return abs(l);
} long long FindingKids::getSum(int n, int q, int A, int B, int C) {
a = A;
b = B;
c = C;
generate(n);
sort(pos, pos + n);
for (int i = ; i < n; i++)
{
ranks[pos[i].second] = i;
}
sort(lkid, lkid + lcnt);
sort(rkid, rkid + rcnt);
long long ret = ;
for (int i = ; i < q; i++)
{
a = (a * b % MOD + c) % MOD;
int kid = ranks[a % n];
a = (a * b % MOD + c) % MOD;
long long my_time = a;
long long temp = work(kid, my_time);
ret += temp;
}
return ret;
}

tc674div1b的更多相关文章

随机推荐

  1. GHOST急速安装win10或win7

    首先说说写这篇博客的原因,我自己曾经被装各种系统弄得焦头烂额,各种刻光盘光驱安装,写优盘安装以及pe盘恢复系统等等,每次都各种方式尝试一下,太浪费时间了,所以天真的想着能不能有一个类似"一劳 ...

  2. docker搭建ros-indigo-arm交叉编译环境

    ROS运行环境:ARM ubuntu14.04 + ROS indigo在arm环境下编译ros应用程序,速度极慢,无法忍受,尝试在x86机器上搭建docker+ros交叉编译环境. 交叉编译环境的搭 ...

  3. 搭建TFS 2015 Build Agent环境(三)

    在配置时,一定要注意下面的几个地方: 1.项目集合生成服务账号 中一定要包含: 2.Build Agent机器上防止Agent的路径一定要短,不要出现特殊字符,比如:C:\Agent 3.一定要安装V ...

  4. FineUI(专业版)新增 5 款 Metro 皮肤,邀您共赏!

    http://fineui.com/demo_pro/ 顺应当前流行趋势,五款Metro皮肤闪亮登场,她们分别是: Metro Blue Metro Dark Blue Metro Gray Metr ...

  5. knockoutJS学习笔记05:控制文本和外观绑定

    测试数据: function Person(name,age){ var self = this; self.name = ko.observable(name); self.age = ko.obs ...

  6. Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

    Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详 ...

  7. PHP7中php.ini、php-fpm和www.conf的配置

    引自:https://typecodes.com/web/php7configure.html 1 配置php.ini php.ini是php运行核心配置文件: ######避免PHP信息暴露在htt ...

  8. prototype 原型

    在我刚学习javascript的时候对于原型的概念很模糊,现在也不是很懂,希望下面的文章对有相同问题的朋友有帮助,如果有误希望指正: prototype用于通常用于构造函数中,公用方法的继承上.构造函 ...

  9. 移动端浏览器和微信浏览器上禁止body的滚动条

    一般禁止body滚动的做法就是设置overflow:hidden. 但是很奇怪的发现在移动端浏览器和微信浏览器上这个不起作用,然后我分析了我的写法,就是在body上加了一个class去定义属性,然后改 ...

  10. POJ1091跳蚤(容斥 + 唯一分解 + 快速幂)

      题意:规定每次跳的单位 a1, a2, a3 …… , an, M,次数可以为b1, b2, b3 …… bn, bn + 1, 正好表示往左,负号表示往右, 求能否调到左边一位,即 a1* b1 ...