[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
试题描述
IOI 的比赛开始了。Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 ……
接着他们发现自己收到了一封电子邮件:
我们在考场上放置了 N 个炸弹。如果建立一个直线坐标系(数轴)的话,第 i 个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:
Xi−Ri≤Xj≤Xi+Ri
那么,炸弹 j 也会被引爆。
若 i 和 j 满足上述关系式,称 i 能直接引爆 j。若 i 不能直接引爆 j,但引爆 i 会导致 j 爆炸,则称 i 能间接引爆 j。
我可以告诉你们,这些炸弹满足一个性质:若引爆炸弹 A 会直接或间接地引爆炸弹 B,则引爆炸弹 B 一定不会直接或间接地引爆炸弹 A。
有能耐就拆掉炸弹吧!记住,如果其它选手有所动作的话,后果你们应该知道!
吃惊的 Jsp 和 Rlc 开始了调(报)查(警)。之后,这些话被证实了。并且两人还发现了另一个性质:
定义炸弹 A 到 B 的“引爆距离”(用 d(A,B) 表示)为最长的满足以下条件的序列 a1,a2,...,an 的长度:
- ai 互不相同,且为 [1,N] 中的整数;
- ai 能直接引爆 ai+1;
- a1=A,an=B。
那么这个性质可以表述为:若 d(A,B)=3,A 一定能直接引爆 B。
经过进一步研究,Rlc 发现最为安全的方法是这样:首先选出若干个关键炸弹安装监测器,然后慢慢拆除。
因为炸弹的某些特性,安装监测器的炸弹必须组成一个有序序列 a1,a2,...,an,且满足:
- ai 互不相同,且为 [1,N] 中的整数。
- ai 能直接或间接引爆 ai+1。
Rlc 设计了一个衡量监测器安装方案的安全程度的方法:
首先可以测出每个炸弹的特征值 vi。
那么监测器安装方案的安全程度为:∑i=1~n−1F(va_i,va_(i+1)),其中 F(x,y)=(x⊕y+xy) mod 998244353(⊕ 表示二进制按位异或,本题中按位异或的优先级高于乘法和加法)。
现在她想知道,对于 [1,N] 中的每个整数 i,如果她安装监测器的最后一个炸弹是 i(即 an=i),安全程度最大是多少。
请特别注意,题面中大写的 N 表示炸弹总数,小写 n 表示上下文中的序列长度,请勿混淆。
输入
第二行 N 个整数 X1,X2,...,XN,表示炸弹的坐标。
第三行 N 个整数 R1,R2,...,RN,表示炸弹的爆炸半径。
第四行 N 个整数 v1,v2,...,vN,表示炸弹的特征值。
输出
输入示例
- -
输出示例
数据规模及约定
对于所有数据,1≤N≤3×105,0≤vi<998244353,0≤Ri≤1018,∣Xi∣≤1018。
题解
这道题题意如此长,其实是想方设法创造条件让暴力 AC。。。
首先根据性质 1,它是个 DAG,自然会想到 dp。
然后根据性质 1&3,因为两个炸弹不能互相炸到对方,假设炸弹 A 的范围包含了 B,那么 B 的半径(记做 B_r)一定小于 A_r 的一半,以此类推,会发现对于任意两个炸弹 u, v,如果 u 直接炸到了 v,那么从 v 向 u 连边,那么这个图的最长路径长度不会超过 log max{ Ri }。
发现直接连边数太多了,过不了(大概有 45 分),那么我们直连哪些直接炸到的并且离得最近的边(这个可以从左到右、从右到左扫一遍分别维护 Xi + Ri 和 Xi - Ri 递减和递增的单调栈),这样边数就是 O(n) 的了(证明比较简单,详见 LOJ 官方题解)。
dp 转移的时候暴力沿着路径 dfs 一下,沿途中遇到所有的 dp 值都用来更新一下就好了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define LL long long LL read() {
LL x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 300010
#define maxm 600010
#define LL long long
#define hzt1 998244353 int n, m, head[maxn], nxt[maxm], to[maxm], perm[maxn];
LL X[maxn], R[maxn], v[maxn]; void AddEdge(int a, int b) {
to[++m] = b; nxt[m] = head[a]; head[a] = m;
return ;
} int S[maxn], top;
LL f[maxn];
void dfs(int st, int u);
LL search(int u);
void dfs(int st, int u) {
// printf("u: %d\n", u);
f[st] = max(f[st], search(u) + ((v[st] ^ v[u]) + v[st] * v[u]) % hzt1);
for(int e = head[u]; e; e = nxt[e]) dfs(st, to[e]);
return ;
}
LL search(int u) {
if(f[u] >= 0) return f[u];
f[u] = 0;
for(int e = head[u]; e; e = nxt[e]) dfs(u, to[e]);
return f[u];
} bool cmp(int a, int b) { return X[a] < X[b]; } int main() {
n = read();
for(int i = 1; i <= n; i++) X[i] = read(), perm[i] = i;
for(int i = 1; i <= n; i++) R[i] = read();
for(int i = 1; i <= n; i++) v[i] = read();
sort(perm + 1, perm + n + 1, cmp); // for(int i = 1; i <= n; i++) printf("%lld %lld [%d]\n", X[perm[i]], R[perm[i]], perm[i]);
for(int i = 1; i <= n; i++) {
while(top && X[S[top]] + R[S[top]] < X[perm[i]]) top--;
if(top) AddEdge(perm[i], S[top]); // , printf("type1: %d -> %d\n", perm[i], S[top]);
while(top && X[S[top]] + R[S[top]] <= X[perm[i]] + R[perm[i]]) top--;
S[++top] = perm[i];
}
top = 0;
for(int i = n; i; i--) {
while(top && X[S[top]] - R[S[top]] > X[perm[i]]) top--;
if(top) AddEdge(perm[i], S[top]); // , printf("type2: %d -> %d\n", perm[i], S[top]);
while(top && X[S[top]] - R[S[top]] >= X[perm[i]] - R[perm[i]]) top--;
S[++top] = perm[i];
}
memset(f, -1, sizeof(f));
for(int i = 1; i <= n; i++) printf("%lld\n", search(i)); return 0;
}
我还是第一次写代码让两个函数互相调用。。。
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)的更多相关文章
- 「LibreOJ β Round #3」绯色 IOI(抵达)
[题解] 我们可以发现叶子节点的关联点一定是它的父亲节点,那么我们dfs一遍就可以求出所有节点的关联点,或者判断出无解. 对于每个点i,它的关联点u的危险度肯定比它连接的其他点vi的危险度小,我们从u ...
- [LOJ#531]「LibreOJ β Round #5」游戏
[LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...
- [LOJ#530]「LibreOJ β Round #5」最小倍数
[LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...
- [LOJ#516]「LibreOJ β Round #2」DP 一般看规律
[LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- [LOJ#525]「LibreOJ β Round #4」多项式
[LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...
- [LOJ#526]「LibreOJ β Round #4」子集
[LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...
- loj #547. 「LibreOJ β Round #7」匹配字符串
#547. 「LibreOJ β Round #7」匹配字符串 题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
随机推荐
- [opencv] applyColorMap
applyColorMap 功能 转化为热力图,因为热力图我们看的变化更加细微,在很多地方都用到了热力图. 最近在看CAM,所以记一记这个函数. 感觉还是很有用的. 代码 >>> i ...
- [论文理解] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 简介 Faster R-CNN是很经典的t ...
- React 官方脚手架 create-react-app快速生成新项目
进入新公司已经半年了,各个业务线,技术栈都已经熟悉,工作也已经游刃有余,决定慢下脚步,沉淀积累,回顾一下所用技术栈所包含的基本知识,以及再公司中的实战. 首先回顾新项目搭建 react脚手架目前使用较 ...
- PAT (Basic Level) Practise (中文)- 1007. 素数对猜想 (20)
http://www.patest.cn/contests/pat-b-practise/1007 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对 ...
- python-下拉框
首先,从selenium.webdriver.support.ui里调用Select类,如下: 其次,找到下拉框元素,再找下拉框里要最终选择的元素,如下: 注意:调用Select类后,不必再加clic ...
- WinForm中Timer倒计时
添加一个Timer控件: 在初始化代码中 public Form1() { InitializeComponent(); button_Read.Enabled = false; button_Sta ...
- iOS--UIScrollView基本用法和代理方法
主要是为了记录下UIScrollView的代理方法吧 在帮信息学院的学长做东西的时候需要大量用到分块浏览,所以就涉及到很多的关于scrollview,所以也就有了这篇文章 - (void)view ...
- cocos2d-x之CCCardinalSplineBy
CCCardinalSplineBy概念 这个类是样条曲线动作,其创建函数CCCardinalSplineBy::create(float duration, cocos2d::CCPointArra ...
- 【Git版本控制】GitHub上fork项目和clone项目的区别
fork:在github页面,点击fork按钮,将别人的仓库复制一份到自己的仓库. clone:直接将github中的仓库克隆到自己本地电脑中 问题1:pull request的作用 比如在仓库的主人 ...
- vtigercrm安装
vtigercrm是一个用户关系管理系统. 本以为安装只用半个小时就可以完成,结果花了两天时间.. 后来因为不想其他的因素影响,重新装了个纯净的系统.(系统为ubuntu16,安装过程略) 在系统基础 ...