题目背景

下发压缩包链接: https://pan.baidu.com/s/1geC4ooz 密码: 3vpt(同T1)

正在想这么说的时候——

突然涌出一种强烈的晕眩感。

这是,什么……?

眼花吗?不对……

由佳也失去平衡快摔倒了。

连平常的呼吸都难以保持。

这时——空间更大幅度的扭曲了。

这种感觉,就像失去了身体和空间的境界线,渐渐,渐渐的被扭曲着……

昏过去,也只是时间的……问题……罢了……

————?

感觉到——有什么发生了崩坏?

这是……什么?

这到底是,怎么回事……?

赤夜——

照亮了我们,不,照亮了整条街道。

本应悬挂在西边的天空的夕阳……不见了?

我条件反射地抬头仰望天穹。

啊啊啊啊啊——!!!

目睹了不可能存在的景色,我不禁大声喊叫起来……

在我们头顶上的,那是……

漆黑——漆黑之月

比黄昏更为黑暗,应该被称为“赤夜”的世界,在我们的周围蔓延。

题目描述

数据结构大师ddd给你出了一道题:

给你一棵树,最开始点权为0,每次将与一个点x树上距离<=1的所有点点权+1,之后询问这些点修改后的点权和

输入输出格式

输入输出格式

输入格式:

第一行两个数n和m

之后一行n-1个数,第i个数fa[i + 1]表示i + 1点的父亲编号,保证fa[i + 1]<i + 1

之后一行m个数,每个数x依次表示这次操作的点是x

输出格式:

输出一个数,即这m次询问的答案的和

保证答案在有符号64位整数范围内

输入输出样例

输入样例#1:

6 3
1 1 2 3 3
1 2 3
输出样例#1:

15
输入样例#2:

6 10
1 1 2 3 3
1 4 6 5 2 3 3 3 3 3
输出样例#2:

115

说明

样例#3,#4,#5,#6见下发的文件

【子任务】

子任务会给出部分测试数据的特点。

如果你在解决题目中遇到了困难, 可以尝试只解决一部分测试数据。

每个测试点的数据规模及特点如下表:

测试点编号   n的范围   m的范围   特殊性质 
测试点1 n = 1000 m = 1000 数据随机
测试点2 n = 1000 m = 1000 数据随机
测试点3 n = 100000 m = 100000
测试点4 n = 100000 m = 100000
测试点5 n = 100000 m = 1000000 树是一条链
测试点6 n = 100000 m = 1000000
测试点7 n = 100000 m = 1000000
测试点8 n = 100000 m = 3000000
测试点9 n = 100000 m = 3000000
测试点10 n = 100000 m = 10000000

【由乃暖心的小提示】

由于这个题最大读入量有约45MB,非常巨大,顺便为了教你们怎么写读入优化,在这里附送上一个fread膜版,在下发文件中。(真正NOIP的时候如果你记得住可以用的,或许就是AK和595的差别哦~)

【说明】

【样例1说明】

原树结构:

第一次操作后:

这次操作的答案为1+1+1=3

第二次操作后:

这次操作的答案为2+2+1=5

第三次操作后:

这次操作的答案为3+2+1+1=7

所有操作的答案总和为3+5+7=15,故输出15.

分析:一类修改+查询问题.m高达10000000,显然不能直接操作,而由于它每次操作都是一个点对多个点产生贡献,每次也是查询一些点,我们就可以计算每个点对答案的贡献,不用实际操作,打上标记就好了.

如果当前操作的点是x,那么x的答案就+=x所连的点+1,对x的父亲的贡献是2(x+1,fa[x] + 1),对x的父亲的父亲的贡献是1,对x的儿子的贡献是2,对x的儿子的儿子的贡献是1.枚举每个点的儿子是很费时间的,所以我们只记录父节点和父节点的父节点的贡献,就能推出当前的答案.

维护两个数组:pushup,tag,son,tag表示是操作的次数,pushup是其它点对当前点的贡献和,son是当前点的子节点一共修改了多少次.修改点x:

   tag[x]++,pushup[fa[x]] +=2,pushup[fa[fa[x]]]++,son[fa[x]]++,pushup[x] += du[x] + 1.

查询点x: 

   ans = pushup[x] + tag[fa[x]] * 2 + tag[fa[fa[x]]] + son[fa[x]] - tag[x].

(子节点对x的贡献+父节点的贡献+父节点的父节点的贡献+和x同一深度其它点的贡献).

当操作很费事,并且操作对询问有影响时,可以试试能不能对操作打个标记而不去实际操作来计算对答案的贡献.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, m; int fa[];
long long ans, tag[], pushup[], son[], du[]; long long read()
{
long long res = ;
char ch = ;
while (ch < '' || ch > '')
ch = getchar();
while (ch >= '' && ch <= '')
{
res = res * + ch - '';
ch = getchar();
}
return res;
} int main()
{
n = read();
m = read();
for (int i = ; i <= n; i++)
{
fa[i] = read();
du[i]++;
du[fa[i]]++;
}
while (m--)
{
long long x;
x = read();
pushup[x] += du[x] + ;
pushup[fa[x]] += ;
pushup[fa[fa[x]]]++;
tag[x]++;
son[fa[x]]++;
long long temp = pushup[x];
temp += tag[fa[x]] * ;
temp += tag[fa[fa[x]]];
temp += son[fa[x]] - tag[x];
ans += temp;
}
printf("%lld\n", ans); return ;
}

noip模拟赛 赤の夜的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. iOS通讯录(纯纯的干货)

    一.iOS8.0 1.访问用户通讯录的两个框架 (1)AddressBookUI.framework 提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人 (2)AddressB ...

  2. PCB MS SQL SERVER 字段含小写字母更新为大写字母

    今天在预审完成时报如下错误,此错误原因是由于SQL Server数据字段存在小写,而Oracle数据库需大写导致的, 怎么解决这个问题了,非常简单 .这里将SQL贴出来 . 1.将生产型号中含有小写字 ...

  3. php使用163邮箱发送邮件

    email.class.php文件 <? class smtp { /* Public Variables */ var $smtp_port; var $time_out; var $host ...

  4. oracle 误删数据

    insert into hr.job_history select * from hr.job_history as of timestamp to_timestamp('2007-07-23 10: ...

  5. PHP电影小爬虫(2)

    学习了别人的爬虫后自己改的一个,算是又回顾了一下php的使用 我们来利用simple_html_dom的采集数据实例,这是一个PHP的库,上手很容易.simple_html_dom 可以很好的帮助我们 ...

  6. Android内存管理(13)常见产生内存泄漏的原因

    1.集合类泄漏 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用.如果这个集合类是全局性的变量 (比如类中的静态属性,全局性的 map 等即有静态引用或 final 一直指向它), ...

  7. MVC系列学习(一)-新语法

    本篇内容: 1.自动属性 2.隐式类型 3.对象初始化器和集合初始化器 4.匿名类型 5.扩展方法 6.Lambda表达式 1.自动属性 使用: class Student { public stri ...

  8. (转)44 道 JavaScript 难题

    JavaScript Puzzlers原文 1. ["1", "2", "3"].map(parseInt)   答案:[1, NaN, N ...

  9. MySQL 执行计划中Extra的浅薄理解

    1.using where: Extra中出现“Using where”,通常来说,意味着全表扫描或者在查找使用索引的情况下,但是还有查询条件不在索引字段当中. 如果需要回表也是用这个. 2.usin ...

  10. 查询数据表行数 然后循环查找表 添加数据到ITEMS

    ;i<tbBiao.Rows.Count;i++) { string TableName = (tbBiao.Rows[i]["Table"]).ToString(); tb ...