D. Ralph And His Tour in Binary Country
time limit per test

2.5 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

Ralph is in the Binary Country. The Binary Country consists of n cities and (n - 1) bidirectional roads connecting the cities. The roads are numbered from 1 to (n - 1), the i-th road connects the city labeled  (here ⌊ x⌋ denotes the x rounded down to the nearest integer) and the city labeled (i + 1), and the length of the i-th road is Li.

Now Ralph gives you m queries. In each query he tells you some city Ai and an integer Hi. He wants to make some tours starting from this city. He can choose any city in the Binary Country (including Ai) as the terminal city for a tour. He gains happiness (Hi - L) during a tour, where L is the distance between the city Ai and the terminal city.

Ralph is interested in tours from Ai in which he can gain positive happiness. For each query, compute the sum of happiness gains for all such tours.

Ralph will never take the same tour twice or more (in one query), he will never pass the same city twice or more in one tour.

Input

The first line contains two integers n and m (1 ≤ n ≤ 106, 1 ≤ m ≤ 105).

(n - 1) lines follow, each line contains one integer Li (1 ≤ Li ≤ 105), which denotes the length of the i-th road.

m lines follow, each line contains two integers Ai and Hi (1 ≤ Ai ≤ n, 0 ≤ Hi ≤ 107).

Output

Print m lines, on the i-th line print one integer — the answer for the i-th query.

Examples
input
2 2
5
1 8
2 4
output
11
4
input
6 4
2
1
1
3
2
2 4
1 3
3 2
1 7
output
11
6
3
28
Note

Here is the explanation for the second sample.

Ralph's first query is to start tours from city 2 and Hi equals to 4. Here are the options:

  • He can choose city 5 as his terminal city. Since the distance between city 5 and city 2 is 3, he can gain happiness 4 - 3 = 1.
  • He can choose city 4 as his terminal city and gain happiness 3.
  • He can choose city 1 as his terminal city and gain happiness 2.
  • He can choose city 3 as his terminal city and gain happiness 1.
  • Note that Ralph can choose city 2 as his terminal city and gain happiness 4.
  • Ralph won't choose city 6 as his terminal city because the distance between city 6 and city 2 is 5, which leads to negative happiness for Ralph.

So the answer for the first query is 1 + 3 + 2 + 1 + 4 = 11.

大致题意:m次询问,每次给定一个a和h,第i个点的贡献是h减i到a的距离,求大于0的贡献.

分析:非常棒的一道题!改变了我对cf测评机的认识.我一开始错误地认为只需要求出一个点祖先的贡献和它的子树的节点的贡献就好了,没有考虑到还有一种情况:它的父亲的其它儿子的子树可能还有贡献.这样的话就必须求出每个点为根的子树中每个点到根节点的距离.事实上只需要存下距离就够了,因为我们不关心到底是哪一个点.我原本以为内存会爆掉,因为n有10^6,要把每个点都给保存下来,还有保存子树的所有点的距离,数组绝对是开不下的,但是如果不求出这个是无法继续做下去的,于是用vector,竟然没有爆内存,神奇.

因为题目给定的是一个二叉树,每个节点的编号都是有规律的,所以可以从第n号点从下往上更新,利用左右儿子的信息去更新根节点的信息.为了在查询的时候方便一些,可以维护一下前缀和,即第i个点的子树中前j个距离的和,这样可以利用vector的upper_bound来快速查找关键点p,利用公式进行O(1)计算.

接下来的事情就很好办了,每次从查询的点开始,先看看左右子树之前有没有被查询,如果没有就查询一下,完了之后就跳到祖先,并记录上一次查询的是哪一个点,下次就不查询它了.

参考了网上神犇的vector的写法,用得很6,个人认为它最大的用处是关于内存方面的.这道题也纠正了我的一个常识性错误:if (k) ......我一直以为如果k > 0这个判断语句才会成立,万万没想到是k != 0这个语句就成立了,看来还是基本功不扎实,要多多练习.

#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; const int maxn = ;
vector <ll>e[maxn], sum[maxn];
ll n, m, len[maxn], a, h;
ll ans; ll query(ll x, ll h)
{
if (h <= )
return ;
ll p = upper_bound(e[x].begin(), e[x].end(), h) - e[x].begin();
return p * h - sum[x][p - ];
} void init()
{
for (int i = n; i >= ; i--)
{
e[i].push_back();
int lc = i * , rc = i * + ;
if (lc <= n)
{
for (int j = ; j < e[lc].size(); j++)
e[i].push_back(e[lc][j] + len[lc]);
}
if (rc <= n)
{
for (int j = ; j < e[rc].size(); j++)
e[i].push_back(e[rc][j] + len[rc]);
}
sort(e[i].begin(), e[i].end());
sum[i].resize(e[i].size());
for (int j = ; j < sum[i].size(); j++)
sum[i][j] = sum[i][j - ] + e[i][j];
}
} int main()
{
cin >> n >> m;
for (int i = ; i <= n; i++)
scanf("%I64d", &len[i]);
init();
while (m--)
{
ans = ;
scanf("%I64d%I64d", &a, &h);
ll last = ;
while (a && h >= )
{
ans += h;
ll lc = a * , rc = a * + ;
if (last != lc && lc <= n)
ans += query(lc, h - len[lc]);
if (last != rc && rc <= n)
ans += query(rc, h - len[rc]);
last = a;
h -= len[a];
a /= ;
}
printf("%I64d\n", ans);
} return ;
}

Codeforces 894.D Ralph And His Tour in Binary Country的更多相关文章

  1. 【Codeforces】894D. Ralph And His Tour in Binary Country 思维+二分

    题意 给定一棵$n$个节点完全二叉树,$m$次询问,每次询问从$a$节点到其它所有节点(包括自身)的距离$L$与给定$H_a$之差$H_a-L$大于$0$的值之和 对整棵树从叶子节点到父节点从上往下预 ...

  2. [codeforces 894 E] Ralph and Mushrooms 解题报告 (SCC+拓扑排序+DP)

    题目链接:http://codeforces.com/problemset/problem/894/E 题目大意: $n$个点$m$条边的有向图,每条边有一个权值,可以重复走. 第$i$次走过某条边权 ...

  3. Codeforces 894.E Ralph and Mushrooms

    E. Ralph and Mushrooms time limit per test 2.5 seconds memory limit per test 512 megabytes input sta ...

  4. Codeforces 894.B Ralph And His Magic Field

    B. Ralph And His Magic Field time limit per test 1 second memory limit per test 256 megabytes input ...

  5. Codeforces 894.C Marco and GCD Sequence

    C. Marco and GCD Sequence time limit per test 1 second memory limit per test 256 megabytes input sta ...

  6. 【Codeforces】894E.Ralph and Mushrooms Tarjan缩点+DP

    题意 给定$n$个点$m$条边有向图及边权$w$,第$i$次经过一条边边权为$w-1-2.-..-i$,$w\ge 0$给定起点$s$问从起点出发最多能够得到权和,某条边可重复经过 有向图能够重复经过 ...

  7. Codeforces 894.A QAQ

    A. QAQ time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  8. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)

    题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...

  9. Educational Codeforces Round 75 (Rated for Div. 2) B. Binary Palindromes

    链接: https://codeforces.com/contest/1251/problem/B 题意: A palindrome is a string t which reads the sam ...

随机推荐

  1. 413. Reverse Integer【LintCode java】

    Description Reverse digits of an integer. Returns 0 when the reversed integer overflows (signed 32-b ...

  2. RyuBook1.0案例三:REST Linkage

    REST Linkage 该小结主要介绍如何添加一个REST Link 函数 RYU本身提供了一个类似WSGI的web服务器功能.借助这个功能,我们可以创建一个REST API. 基于创建的REST ...

  3. Visionpro学习网

    重码网是一个在线机器视觉学习网站,推出了Halcon,Visionpro机器视觉学习视频教程,视频内容通俗易懂,没有编程基础的同学,照着视频练习,也同样可以学会. 学机器视觉,拿高薪,成就技术大拿.重 ...

  4. [redis] linux下哨兵篇(3)

    一.前言1.为何部署sentinel哨兵前文redis主从架构中,当主服务故障时,需要手动将从服务切换为主服务,sentinel服务就是将这个过程自动化.主要功能有:1)不时监控主从服务正常运行2)可 ...

  5. Transparent Flow Migration for NFV

    Transparent Flow Migration for NFV 摘要 因为SDN提供的灵活性,NF之间存在着流量的迁入和迁出问题.而且NF也要根据相关的状态信息处理数据包,所以流量迁移必须满足以 ...

  6. 解决CentOS安装redis局域网内无法访问的问题

    redis4.0版本安装教程晚上非常多,随便贴出来一个:http://www.cnblogs.com/web424/p/6796993.html 安装完成后,在局域网内发现无法访问到redis.cen ...

  7. React.js + LiveReload配置详解

    一.介绍一下LiveReload: LiveReload monitors changes in the file system. As soon as you save a file, it is ...

  8. 【第八周】beta阶段事后诸葛亮会议

    本文由宫成荣,武志远共同编写 组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 会议时间:2016.11.15 18:00~18:40 会议地点: ...

  9. KeyBoard 操作 !

    键盘操作:tab/ enter/ crtl+c ,crtl+v ; import java.awt.*; import java.awt.datatransfer.StringSelection; i ...

  10. gearman参数说明

    -b, –backlog=BACKLOG 连接请求队列的最大值 -d, –daemon Daemon 守护进程化 -f, –file-descriptors=FDS 可打开的文件描述符数量 -h, – ...