Content

有 \(T\) 组询问,每组询问给定一个有 \(n\) 个节点的数,编号为 \(1\sim n\),每个节点一开始都有权值 \(a_i\)。现有 \(m\) 次操作,每次操作选择树上所有节点中权值最大的一个点(如果有多个选择编号最小的),然后将所有和这个点在树上直接相连的点的权值加 \(1\)。求 \(m\) 次操作以后权值最大的点的编号(如果有多个输出编号最小的)。

数据范围:\(1\leqslant n\leqslant 2\times 10^6,1\leqslant m\leqslant 10^{18},1\leqslant a_i\leqslant 2^{31}-1,1\leqslant T\leqslant 10\)。

Solution

比较具有启发性的题目。

我们先把 \(30\) 分的暴力(本人亲测)写完以后,看能不能找到一些规律。

我们接下来以这个图为例来找一下规律,下图是一个拥有 \(12\) 个节点的树,其中每个节点旁边红色的数字代表着它的权值。(图画得可能不是太好,请见谅)

你也可以直接复制下面的对应数据来 \(\texttt{debug}\) 一下:

1
12 x //这里的 x 可以变成任何数
7 2 5 3 3 10 1 6 5 5 6 8
1 2
1 3
1 4
3 5
3 6
6 8
6 9
4 7
4 10
10 11
11 12

我们来模拟一下每次操作:

第一次,选择权值最大的节点 \(6\),然后让与之直接相连的每个节点的权值增加 \(1\),这样,与之直接相连的节点 \(3,8,9\) 的权值分别变成了 \(6,7,6\)。

第二次,第三次,第四次操作都是选择权值最大的节点 \(6\),就不再赘述了。第四次操作完成以后,节点 \(3,8,9\) 的权值分别变成了 \(9,10,9\)。

第五次,选择权值最大的节点,这是我们发现这样的节点有 \(2\) 个,分别是 \(6\) 和 \(8\),然而由于 \(6<8\),所以我们还是选择节点 \(6\),然后让与之直接相连的每个节点的权值增加 \(1\),这样,与之直接相连的节点 \(3,8,9\) 的权值分别变成了 \(10,11,10\)。

第六次,选择权值最大的节点 \(8\),然后让与之直接相连的每个节点的权值增加 \(1\),与之相连的节点 \(6\) 的权值变成了 \(11\)。

第七次,选择权值最大的节点,这是我们发现这样的节点有 \(2\) 个,分别是 \(6\) 和 \(8\),然而由于 \(6<8\),所以我们还是选择节点 \(6\),然后让与之直接相连的每个节点的权值增加 \(1\),这样,与之直接相连的节点 \(3,8,9\) 的权值分别变成了 \(11,12,11\)。

第八次,选择权值最大的节点 \(8\),然后让与之直接相连的每个节点的权值增加 \(1\),与之相连的节点 \(6\) 的权值变成了 \(12\)。

……

继续这样推下去的话你就能够发现,我们后面所选择的节点一定会在 \(6,8\) 之间反复循环,而这两个点又分别是一开始权值最大的点中编号最小的点和与之直接相连的节点中权值最大的点中编号最小的点。所以,我们可以得到以下思路:

  • 记录下来所有与一开始权值最大的点中编号最小的点直接相连的所有点并取当中权值最大的点中编号最小的点。设我们选出来的点的编号分别是 \(k,k'\)。
  • 如果 \(a_k-a_{k'}>m\),那么我们的节点 \(k\) 肯定是最后权值最大的点。
  • 否则,由于最后的答案肯定在两个点之间反复横跳,我们只需要判断一下 \(m-(a_k-a_{k'})\) 的奇偶性即可。如果是奇数,那么答案肯定就是这两个点当中编号更大的,否则肯定就是这两个点当中编号更小的。这里请读者自己思考。

而且我们惊奇地发现,这个做法成功的越过了全网大部分人跳进去的 \(n=1\) 的坑,所以这个做法从某种意义上来讲是很优越的。

Code

int t, n, a[2000007], num[2000007];
long long m; int main() {
//This program is written by Eason_AC
scanf("%d", &t);
while(t--) {
memset(num, 0, sizeof(num));
int ans = 0;
scanf("%d%lld", &n, &m);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
if((a[i] > a[ans]) || (a[i] == a[ans] && ans > i)) ans = i;
}
for(int i = 1; i < n; ++i) {
int x, y;
scanf("%d%d", &x, &y);
if(x == ans) num[++num[0]] = y;
else if(y == ans) num[++num[0]] = x;
}
if(!num[0]) {printf("%d\n", ans); continue;}
int kk = 1;
for(int i = 1; i <= num[0]; ++i)
if(a[num[i]] > a[num[kk]]) kk = i;
if(a[ans] - a[num[kk]] > m) printf("%d\n", ans);
else if((m - (a[ans] - a[num[kk]])) % 2) printf("%d\n", max(num[kk], ans));
else printf("%d\n", min(num[kk], ans));
}
return 0;
}

LuoguP7043 「MCOI-03」村国 题解的更多相关文章

  1. 「MCOI-03」村国题解

    第二篇题解! 可能是退役之前的最后一篇题解了 (好像总共都只写了两篇) 不说了,讲题: 题面 题意: 有T个数据 有一颗树(保证所有的的节点都是相连的),有n个节点,每个节点都有相应的权值与序号,现在 ...

  2. LuoguP7127 「RdOI R1」一次函数(function) 题解

    Content 设 \(S_k\) 为直线 \(f(x)=kx+k-1\),直线 \(f(x)=(k+1)x+k\) 与 \(x\) 轴围成的三角形的面积.现在给出 \(t\) 组询问,每组询问给定一 ...

  3. LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)

    题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...

  4. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  5. 「GXOI / GZOI2019」简要题解

    「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...

  6. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

  7. 「POJ 3666」Making the Grade 题解(两种做法)

    0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...

  8. FileUpload控件「批次上传 / 多档案同时上传」的范例--以「流水号」产生「变量名称」

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/19/multiple_fileupload_asp_net_20130819. ...

  9. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

随机推荐

  1. mybatis一对多查询resultMap只返回了一条记录

    问题描述:因为领导的一个需求,需要用到使用resultMap,很久没使用了,结果就除了点意外.就记录下这个问题 准备两个类:author(作者)和book(书),数据库创建对应的author-> ...

  2. JOI 2020 Final 题解

    T1. 只不过是长的领带 大水题,把 \(a_i,b_i\) 从小到大排序. 发现最优方案只可能是大的 \(a_i\) 跟大的 \(b_i\) 匹配,小的 \(a_i\) 与小的 \(b_i\) 匹配 ...

  3. P2336 [SCOI2012]喵星球上的点名(SA+莫队)

    题面传送门 一道还算有点含金量的 SA 罢-- 首先按照套路我们把读入的所有字符串都粘在一起,中间用分隔符隔开并建出后缀数组出来. 我们考虑对于一个固定的字符串 \(s\),什么样的字符串 \(t\) ...

  4. 洛谷 P3750 - [六省联考2017]分手是祝愿(期望 dp)

    题面传送门 首先我们需注意到这样一个性质:那就是对于任何一种状态,将其变为全 \(0\) 所用的最小步数的方案是唯一的--考虑编号为 \(n\) 的灯,显然如果它原本是暗着的就不用管它了,如果它是亮着 ...

  5. Codeforces 193E - Fibonacci Number(打表找规律+乱搞)

    Codeforces 题目传送门 & 洛谷题目传送门 蠢蠢的我竟然第一眼想套通项公式?然鹅显然 \(5\) 在 \(\bmod 10^{13}\) 意义下并没有二次剩余--我真是活回去了... ...

  6. 洛谷 P4646 - [IOI2007] flood 洪水(拆点+bfs)

    题面传送门 一道挺有意思的题(?) orz djq yyds %%%%%%%%%%%%%%%%%% 首先一个很直观的想法是将每个房间看作一个节点,在有墙的房间旁边连边权为 \(1\) 的边然后 bfs ...

  7. 使用Rainbond实现离线环境软件交付

    一.离线交付的痛点 在传统行业,如政府.能源.军工.公安.工业.交通等行业,为了防止数据泄露和运行安全考虑,一般情况下网络会采取内外网隔离的策略,以防范不必要的风险,毕竟在安全防护方面,网络物理隔离是 ...

  8. 学习java 7.13

    学习内容: 一个汉字存储:如果是GBK编码,占用2个字节:如果是UTF-8编码,占用3个字节 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数 字符流=字节流+编码表 采用何种规则编码,就要 ...

  9. A Child's History of England.16

    CHAPTER 5 ENGLAND UNDER CANUTE THE DANE Canute reigned eighteen years. He was a merciless King at fi ...

  10. Hive(三)【DDL 数据定义】

    目录 一.DDL数据定义 1.库的DDL 1.1创建数据库 1.2查询数据库 1.3查看数据库详情 1.4切换数据库 1.5修改数据库 1.6删除数据库 2.表的DDL 2.1创建表 2.2管理表(内 ...