[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​​ 的长度:

  1. ai​​ 互不相同,且为 [1,N] 中的整数;
  2. ai​​ 能直接引爆 ai+1
  3. a1=A,an=B。

那么这个性质可以表述为:若 d(A,B)=3,A 一定能直接引爆 B。

经过进一步研究,Rlc 发现最为安全的方法是这样:首先选出若干个关键炸弹安装监测器,然后慢慢拆除。

因为炸弹的某些特性,安装监测器的炸弹必须组成一个有序序列 a1,a2,...,an​​,且满足:

  1. ai​​ 互不相同,且为 [1,N] 中的整数。
  2. 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 表示炸弹个数。
第二行 N 个整数 X1,X2,...,XN,表示炸弹的坐标。
第三行 N 个整数 R1,R2,...,RN,表示炸弹的爆炸半径。
第四行 N 个整数 v1,v2,...,vN,表示炸弹的特征值。

输出

输出 N 行,每行一个整数,第 i 行表示拆除的最后一个炸弹是 i 时的最大安全程度。

输入示例

6
-3 -2 0 2 3 4
0 1 4 1 0 1
4 1 3 4 2 0

输出示例

19
5
0
19
33
3

数据规模及约定

对于所有数据,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 longLL 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 998244353int 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;
}

我还是第一次写代码让两个函数互相调用。。。

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/7309334.html

[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)相关推荐

  1. [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)

    #521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一 ...

  2. loj 523 「LibreOJ β Round #3」绯色 IOI(悬念) 霍尔定理+基环树+线段树

    题目分析 神仙题(确信) 首先,j−aij-a _ ij−ai​和ai−ja _ i-jai​−j互为相反数,若其中最小值为bib _ ibi​,则一个为bib _ ibi​一个为m−bim-b _ ...

  3. #520. 「LibreOJ β Round #3」绯色 IOI(开端) 贪心

    妈耶,没脸见人了.巨水,想出来不写,人生重来算了. 就是个找规律题,相邻一个连一下,但是我没注意到是IOI赛制,以为是OI赛制所以没打,感觉70分好打但是懒得了.. 证明就是把相邻3个列一下式子就出来 ...

  4. 【LOJ520】「LibreOJ β Round #3」绯色 IOI(开端)

    传送门 题解: 排序. 现在问题是找出两条从111到nnn的路径使得代价最小. 显然路径上点的编号只可能递增. 容易证明iii和i+1i+1i+1不能存在于同一条路径中.考虑p<i<i+1 ...

  5. 「LibreOJ β Round #3」绯色 IOI(抵达)

    [题解] 我们可以发现叶子节点的关联点一定是它的父亲节点,那么我们dfs一遍就可以求出所有节点的关联点,或者判断出无解. 对于每个点i,它的关联点u的危险度肯定比它连接的其他点vi的危险度小,我们从u ...

  6. 【联合选讲】「LibreOJ β Round #3」绯色 IOI(悬念)

    题目 Description 胖头鱼从鱼戏团逃脱后,被主人一路追捕,他慌不择路地跑进了一颗n个节点的池子树,池子树的所有度数为1的点就是出口. 假如他现在在节点i,那么每个时刻他能选择向某个与当前点有 ...

  7. [匹配+拓扑] LibreOJ #521. 「LibreOJ β Round #3」绯色 IOI(抵达)

    题意 戳这里 题解 这题一开始感觉无从下手,所以我们要尝试得到一些结论. 自己画一画可以发现,一定是两两互为对方的庇护所.这样才有可能保证任意两个不同的城市庇护所不同.否则由于原图没有环,到后面必定会 ...

  8. [结论] LibreOJ #520. 「LibreOJ β Round #3」绯色 IOI(开端)

    题意 戳这里 题解 这是一道结论题. 我们先把数放到数轴上考虑.定义两个点的距离为几何上的距离的平方. 我们可以把一个回路看作两条从 11 到 nn 的不相交的路径. 有一种经典的二路取数的 O(n2 ...

  9. loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...

    $ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...

最新文章

  1. 大学 University
  2. sql2008 查询某个表被那些存储过程用到
  3. 初涉c#设计模式-Iterator Pattern
  4. Android--Launcher拖拽事件详解【androidICS4.0--Launcher系列二】
  5. 软件测试的学习之路 ----- 数据库的概要图
  6. 如何检查python是否安装了pip_如何检测和删除通过pip安装的Python包?
  7. truncate table 与delete table区别
  8. .Net----Remoting 激活 激活方式
  9. net-java-php-python-社会福利保障系统计算机毕业设计程序
  10. Carmack平方根函数经典案例
  11. .ipynb_checkpoints报错的解决方法
  12. 行业分析-全球与中国无线键盘和蓝牙耳机市场现状及未来发展趋势
  13. 数据标注软件 【labelimg】
  14. oracle 4098,ORA-04098错误解决方法-数据库专栏,ORACLE
  15. 当台式机能搜索到WiFi,但是连不上WiFi时,如何解决?
  16. 基于单片机的多功能定时器
  17. 关于CPU 和 GPU
  18. word2013图表题注:将图一-1改为图1-1
  19. 怎么在Excel中准确提取出姓名中的姓氏
  20. 交换机原理与配置(理论详解)

热门文章

  1. 基于pfw的web开发平台使用指南
  2. 深入浅出学习透析 Nginx 服务器的基本原理和配置指南「运维操作实战篇」
  3. 如何查询自己名下有几张物联卡_你知道自己用的物联卡的IP是静态还是动态?如果如何查询物联卡的IP?...
  4. steam客户端打不开_如何在Steam客户端中启用家庭选项(又称父母控制)
  5. 详解fiddler抓包工具
  6. unity第三天:物体的碰撞器与触发器
  7. D01_ 国债逆回购
  8. snap 无法卸载_ubuntu中snap包的安装、更新删除与简单使用
  9. I2C E2PROM通信
  10. ——致远互联渠道伙伴系列访谈之四川凤凰世纪