题目

\(1\le n,q \le 2\cdot {10}^5,0\le b_i,l_i \le {10}^9,b_i \ge 1,1 \le S_i \le n\)

\(Solution\)

这题很好想

总之要维护子树内 \(b\) 值的严格最大(包括数量),次大,次次大,\(l\) 值的严格最大,次大

然后分类讨论,注意相等的情况,接下来就是码的事了

注意要打人工栈!!

\(Code\)

#include<cstdio>
#include<iostream>
#define ls (p << 1)
#define rs (ls | 1)
using namespace std; const int N = 2e5 + 5, INF = 2e9;
int n, q, dfc, tot, h[N], fa[N], dfn[N], rev[N], siz[N], B[N], L[N];
struct edge{int to, nxt;}e[N];
struct node{int mx, cmx, cnt, cc, mxl, cmxl;}seg[N << 2]; inline int add(int x, int y){e[++tot] = edge{y, h[x]}, h[x] = tot;} int st[N], top;
void dfs(int x)
{
st[++top] = 1, dfn[x] = ++dfc, rev[dfc] = x, siz[x] = 1;
while (top)
{
int x = st[top], v = e[h[x]].to;
int bz = 0;
if (h[x]){st[++top] = v, dfn[v] = ++dfc, rev[dfc] = v, siz[v] = 1, h[x] = e[h[x]].nxt, bz = 1;}
if (!bz) top--, siz[fa[x]] += siz[x];
}
} inline node get1(node x, node y)
{
if (x.mx == y.mx)
{
if (x.cmx == y.cmx) return node{x.mx, x.cmx, x.cnt + y.cnt, max(x.cc, y.cc)};
else if (x.cmx > y.cmx) return node{x.mx, x.cmx, x.cnt + y.cnt, max(x.cc, y.cmx)};
return node{x.mx, y.cmx, x.cnt + y.cnt, max(x.cmx, y.cc)};
}
else if (x.mx > y.mx)
{
if (x.cmx == y.mx) return node{x.mx, x.cmx, x.cnt, max(x.cc, y.cmx)};
else if (x.cmx > y.mx) return node{x.mx, x.cmx, x.cnt, max(x.cc, y.mx)};
return node{x.mx, y.mx, x.cnt, max(x.cmx, y.cmx)};
}
else{
if (x.mx == y.cmx) return node{y.mx, x.mx, y.cnt, max(x.cmx, y.cc)};
else if (x.mx > y.cmx) return node{y.mx, x.mx, y.cnt, max(x.cmx, y.cmx)};
return node{y.mx, y.cmx, y.cnt, max(x.mx, y.cc)};
}
}
inline node get2(node x, node y)
{
if (x.mxl == y.mxl) return node{0, 0, 0, 0, x.mxl, max(x.cmxl, y.cmxl)};
else if (x.mxl > y.mxl) return node{0, 0, 0, 0, x.mxl, max(x.cmxl, y.mxl)};
return node{0, 0, 0, 0, y.mxl, max(x.mxl, y.cmxl)};
} void build(int l, int r, int p)
{
if (l == r)
{
seg[p].mx = B[rev[l]], seg[p].mxl = L[rev[l]], seg[p].cnt = 1;
seg[p].cmx = seg[p].cmxl = seg[p].cc = -INF;
return;
}
int mid = (l + r) >> 1;
build(l, mid, ls), build(mid + 1, r, rs);
seg[p] = get1(seg[ls], seg[rs]);
node K = get2(seg[ls], seg[rs]);
seg[p].mxl = K.mxl, seg[p].cmxl = K.cmxl;
}
node query1(int l, int r, int p, int x, int y)
{
if (x > y) return node{-INF, -INF, 0, -INF, -INF, -INF};
if (x <= l && r <= y) return seg[p];
int mid = (l + r) >> 1;
node K1, K2;
K1 = K2 = node{-INF, -INF, 0, -INF, -INF, -INF};
if (x <= mid) K1 = query1(l, mid, ls, x, y);
if (y > mid) K2 = query1(mid + 1, r, rs, x, y);
return get1(K1, K2);
}
node query2(int l, int r, int p, int x, int y)
{
if (x > y) return node{-INF, -INF, 0, -INF, -INF, -INF};
if (x <= l && r <= y) return seg[p];
int mid = (l + r) >> 1;
node K1, K2, K;
K1 = K2 = node{-INF, -INF, 0, -INF, -INF, -INF};
if (x <= mid) K1 = query2(l, mid, ls, x, y);
if (y > mid) K2 = query2(mid + 1, r, rs, x, y);
return get2(K1, K2);
} int main()
{
freopen("soldier.in", "r", stdin);
freopen("soldier.out", "w", stdout);
scanf("%d%d", &n, &q);
for(int i = 1; i < n; i++) scanf("%d", &fa[i + 1]), add(fa[i + 1], i + 1);
for(int i = 1; i <= n; i++) scanf("%d%d", &B[i], &L[i]);
dfs(1), build(1, n, 1);
for(; q; --q)
{
int s, ans = 0; node K1, K2, K, Kl;
scanf("%d", &s);
K = query1(1, n, 1, dfn[s], dfn[s] + siz[s] - 1);
if (siz[s] == 1){printf("0\n"); continue;}
K1 = query2(1, n, 1, 1, dfn[s] - 1), K2 = query2(1, n, 1, dfn[s] + siz[s], n), Kl = get2(K1, K2);
if ((K.cnt > 1 && K.mx + Kl.mxl > K.mx) || (K.cmx + Kl.mxl > K.mx)) ans = K.mx;
else{
ans = K.cmx + Kl.mxl;
if (ans == K.mx) ans = max(K.cmx + Kl.cmxl, K.cc + Kl.mxl);
if (ans < 0) ans = K.cmx;
}
printf("%d\n", ans);
}
}

JZOJ 5460. 士兵训练的更多相关文章

  1. 【题解】士兵训练-C++

    题目DescriptionN个士兵排成一队进行军事训练,每个士兵的等级用1…K范围内的数来表示,长官每隔1小时就随便说出M个等级a1,a2…am(1≤ai≤K,M个等级中允许有重复),如果这M个等级组 ...

  2. python操作三大主流数据库(13)python操作redis之新闻项目实战①新闻数据的导入

    1.新闻处理页面redis_news.py #coding:utf-8 import math import redis class RedisNews(object): def __init__(s ...

  3. python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战

    python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...

  4. 【BZOJ2874】训练士兵(主席树)

    题意:有一个N*M的矩阵,给出一些形如(x1,y1,x2,y2,s)的操作,代表(x1,y1)到(x2,y2)都被加上了s这个数 现在有一些强制在线的询问,询问(x1,y1)到(x2,y2)的和 对于 ...

  5. BZOJ2874 : 训练士兵

    设$a[i][j]$表示$(i,j)$右下角要增加多少 $aj[i][j]=a[i][j]\times j$ $ai[i][j]=a[i][j]\times i$ $aij[i][j]=a[i][j] ...

  6. 2019.01.22 bzoj2874: 训练士兵(主席树)

    传送门 题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线. 思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空 ...

  7. fzyzojP3618 -- [校内训练-互测20180412]士兵的游戏

    二分图匈牙利也可以 判断必须点就看能不能通过偶数长度的增广路翻过去 代码: (最后一个点4s多才行,,,卡不过算了) 开始边数写少了RE,应该是4*N*N M-R随手开了一堆int?都要是long l ...

  8. BZOJ2874 训练士兵 主席树

    [啊 首先 这是道权限题,然后本人显然是没有权限的  23咳3] 最近数据结构做的越来越少..然后 就跟上次一样 ,一做就是三四种不同写法. 等价的题面: 最近GY大神在sc2的天梯中被神族虐得很惨, ...

  9. 暑假集训(1)第一弹 -----士兵队列训练问题(Hdu1276)

    Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报 ...

  10. hdoj 1276 士兵队列训练问题【模拟】

    士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. 关于linux建立u盘legacy启动方式引导

    前言 我一直在用linux,但是我在linux制作pe启动盘无法实现,windows有很多制作pe启动盘的软件,如大白菜,u深度什么的,但是linux没有对应的软件,所以我想写一个类似的工具,那么就有 ...

  2. MySQL库,表,数据的操作

    数据库的操作 1. 创建数据库 create database [if not exists] `数据库名` charset=字符编码(utf8mb4); 如果多次创建会报错 如果不指定字符编码,默认 ...

  3. nuxt作为主应用接入qiankun的实践(附代码)

    上半年一直在倒腾qiankun,在使用nuxtjs接入qiankun时遇到了一些坑,记录并分享出来,希望能帮助到大家. 代码地址:nuxtjs-qiankun-demo Nuxtjs接入qiankun ...

  4. 数电第8周周结_by_yc

    基本知识: 1.有限状态机的分类: Moore型:输出仅与电路的状态有关: Mealy型:输出与当前电路状态和当前电路输入有关. 2.有限状态机的描述方法: 状态转换图:节点:状态(Moore输出): ...

  5. 18V转5V,15V转5V的LDO和DC芯片方案

    18V 转 5V, 15V 转 5V 的 LDO:芯片的选择,特别是输入电压,在低电平 5V 以下的,基本上都是接近也可以.但是 5V 以上,如现在的 18V 和 15 的话,就不一样了.我们需要在选 ...

  6. Scanner例题讲解

    Scanner例题讲解 题:输入多个平均数,求其总和与平均数;每输入一个数用回车确认,通过输入非数字来结束输入并输出执行结果  public class Demo05 {     //输入多个平均数, ...

  7. Python Excel 处理模块 : OpenPyXL

    OpenPyXL模块使用方法 以下是介绍OpenPyXL的基本使用,不涉及样式和合并单元格的跨行操作 一般来说,对于大名鼎鼎的xlrd,xlwt和xlutils三个模块,Excel操作有3个基本状态 ...

  8. 《MySQL必知必会》之快速入门游标和触发器

    第二十四章 使用游标 本章将介绍什么是游标以及如何使用游标 游标 之前的select语句检索出来的数据,没有办法得到第一行或者下一行 有时,需要在检索出来的行中前进或后退一行或多行.这就是使用游标的原 ...

  9. 线程、GIL全局解释器锁、进程池与线程池

    目录 多进程实现TCP服务端并发 互斥锁代码实操 线程理论 创建线程的两种方式 多线程实现TCP服务端并发 线程的诸多特性 GIL全局解释器锁 验证GIL的存在 GIL与普通互斥锁 python多线程 ...

  10. 封装一个python的pymysql操作类

    最近使用pymysql写脚本的情况越来越多了,刚好整理,简单封装一个pymysql的操作类 import pymysql class MysqlDB: def __init__( self, host ...