JZOJ 5460. 士兵训练
题目

\(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. 士兵训练的更多相关文章
- 【题解】士兵训练-C++
题目DescriptionN个士兵排成一队进行军事训练,每个士兵的等级用1…K范围内的数来表示,长官每隔1小时就随便说出M个等级a1,a2…am(1≤ai≤K,M个等级中允许有重复),如果这M个等级组 ...
- python操作三大主流数据库(13)python操作redis之新闻项目实战①新闻数据的导入
1.新闻处理页面redis_news.py #coding:utf-8 import math import redis class RedisNews(object): def __init__(s ...
- python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战
python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...
- 【BZOJ2874】训练士兵(主席树)
题意:有一个N*M的矩阵,给出一些形如(x1,y1,x2,y2,s)的操作,代表(x1,y1)到(x2,y2)都被加上了s这个数 现在有一些强制在线的询问,询问(x1,y1)到(x2,y2)的和 对于 ...
- 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] ...
- 2019.01.22 bzoj2874: 训练士兵(主席树)
传送门 题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线. 思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空 ...
- fzyzojP3618 -- [校内训练-互测20180412]士兵的游戏
二分图匈牙利也可以 判断必须点就看能不能通过偶数长度的增广路翻过去 代码: (最后一个点4s多才行,,,卡不过算了) 开始边数写少了RE,应该是4*N*N M-R随手开了一堆int?都要是long l ...
- BZOJ2874 训练士兵 主席树
[啊 首先 这是道权限题,然后本人显然是没有权限的 23咳3] 最近数据结构做的越来越少..然后 就跟上次一样 ,一做就是三四种不同写法. 等价的题面: 最近GY大神在sc2的天梯中被神族虐得很惨, ...
- 暑假集训(1)第一弹 -----士兵队列训练问题(Hdu1276)
Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报 ...
- hdoj 1276 士兵队列训练问题【模拟】
士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- 打印三位数的水仙花数Java
public class Flower{ //水仙花数就是一个 个位数的立方+十位数的立方+百位数的立方=这个三位数 //153 = 1*1*1+5*5*5+3*3*3 public static v ...
- base64解析爬取糗百
一.缘由 这是我之前刚开始学习的时候爬取糗百的练习内容,主要练习的是bs64解析.虽然现在用的不是特别的多,但是当初的时候用起来还是非常的顺手的. 二.代码实现 #coding:utf-8 impor ...
- Logseq001笔记类--视频悬浮插件--Helium
这是我准备新开的学习记录系列之一 今天写一个插件的介绍吧-- Helium -- 视频悬浮插件 youtube/b站/本地视频都可以导入 主要功能就是你在看视频时,要记一些学习笔记,随着不断往下写,视 ...
- 【转载】SQL 2012以上版本分页查询更简单
2012以上版本分页查询更简单 注意:以下都是先执行排序,再取行数据 select* from t_workers order by worker_id desc offset 3 rows -- ...
- Ajax+WCF+MySQL实现数据库部署并调用
最近的数据库课程要求将MySQL数据库部署在服务器上,参考了大佬们的博客后,总结一下. 先放上参考的大佬们的博客. [原创经验分享]JQuery(Ajax)调用WCF服务 - 南宫萧尘 - 博客园 ...
- vulnhub靶场之IA: KEYRING (1.0.1)
准备: 攻击机:虚拟机kali.本机win10. 靶机:IA: KEYRING (1.0.1),下载地址:https://download.vulnhub.com/ia/keyring-v1.01.o ...
- python之路39 前端开始 各种标签
前端前夕 前端三剑客 HTML 网页的骨架 CSS 网页的样式 JavaScript 网页的动态 1.编写服务端 2.浏览器充当客户端访问服务端 3.浏览器无法正常展示服务端内容(因为服务端得数据没用 ...
- python 之路 37 Navicat 可视化软件使用、 pymysql模块使用
多表查询的两种方法 方式1:连表操作 inner join 内连接 select * from emp inner join dep on emp.dep_id=dep.id; 只连接两张表中公有的数 ...
- [数据结构]克鲁斯卡尔(Kruskal)算法
算法的概念 与Prim算法从顶点开始扩展最小生成树不同,Kruskal算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法.假设N=(V,E)是连通网,对应的最小生成树T=(Vt,Et),Kr ...
- Ubuntu 安装配置 Java 环境
下载 Java 官网 https://www.oracle.com/java/technologies/downloads/ https://www.oracle.com/cn/java/techno ...