Processing math: 0%

[研学] 偏序问题的研究

[研学] 偏序问题的研究

时间:2019.04 ~ 2019.09

参加成员:Modem_  Lagoon  _Qijia  mnihyc

备注:第二年就开始混水了啊(笑),只存了自己写的那部分:

  • 高维偏序

至此,k \le 3 的问题已经被我们解决了。

k = 4 呢?CDQ套CDQ?CDQ套树套树?树套树套树?

如果 k 更大,达到 k = 10 呢?十维树状数组?树套树套树套树套………?

很明显 O(n{\log ^{k – 1}}n) 的复杂度是承受不起的,需要从别的方面下手。

注意到在 k 变大的同时,n 也在变小,所以可以考虑复杂度以 n 为主的算法。

首先考虑的,当然是暴力啦)。

可以暴力枚举所有维度,并且按照这个维度(上的数)排序,这些就可以快速找出一个点控制了其它哪一些点。如果把这个信息用一个长度为 n 的二进制数表示,那么对于每个询问,只需要把它在所有维度下的二进制数取“与”运算(即能控制的点取交集),这样答案就是二进制位为 1 的数量了。

维护二进制串?当然是用 std::bitset<>  啦)。

这样复杂度就是 \displaystyle O\left( {\frac{{{n^2}k}}{{32}}} \right) ,足以通过本题了。

 

代码略。

 

这里其实还有一种在时空复杂度上的优化——分块)。

按照分块的那一套理论,把区间分成 \sqrt n 个,每块用一个 std::bitset<>  维护前缀,同时维护一个块最大值。查询的时候在块上二分,找到询问点所在的块,然后暴力加块内的点即可。时间复杂度即可缩小至 \displaystyle O\left( {\frac{{nk\sqrt n }}{{32}}} \right)

 

 …

YZOJ P4643 [BJOI2018] 链上二次求和

[BJOI2018] 链上二次求和

时间限制:4000MS     内存限制:131072KB

难度:6.2

  • 题目描述

YJC 有一棵 n 个节点的树, ii+11 \leq i < n)节点间有一条边,第 i 个点的权值为整数 a_i

现在他有 m 个询问:

操作 1(修改):给定树上两个节点 uv 和一个整数 d,表示将树上 uv 唯一的简单路径上每个点权值都加上 d

操作 2(询问):给定两个正整数 lr ,表示求树上所有节点个数大于等于 l 且小于等于 r 的简单路径节点权值和之和。由于答案很大,只用输出对质数 1000000007 取模的结果即可。

一条节点个数为 k 的简单路径节点权值和为这条上所有 k 个节点(包括端点)的权值之和,而本题中要求是对所有满足要求的简单路径,求这一权值和的和。

树边是无向的,所以路径也是无向的,即点 1 到点 2 的路径与点 2 到点 1 的路径是同一条,不要重复计算。

  • 输入格式

输入第一行包含两个正整数 nm,分别表示节点个数和操作次数。

第二行包含 n 个整数,其中第 i 个数 a_i 为第 i 个点的初始权值。

接下来 m 行,每行为 1 u v d  或 2 l r  的形式,分别表示进行一次操作 1(修改)或操作 2(询问)。

  • 输出格式

对于每次询问,输出一行一个整数,表示答案对 1000000007 取模的余数。…

YZOJ P4611 区间加多项式(YJC 的数组/多项式?)

YZOJ P4611 区间加多项式(YJC 的数组/多项式?)

时间限制:4444MS      内存限制:1048576KB

难度:7.2

  • 题目描述

由于本题之前被*了,所以现在数据就是随便造的,可能会因为太水又被艹     //给出题人留点面子吧qwq

YJC 在 AK 了一场校内之后,对其中的一题(P2036 「A Simple Data Structure Problem II 」)产生了兴趣。

于是他出了一题加强版(P4316 「ASDSP VII —— YJC树」),然而,他还是觉得这个加强版太简单啦!!!

所以,这次,他不仅把 K \leq 5 往后面加了三个零变成了 K \leq 5000 ,还对询问做了一点修改!

喜欢差分的 YJC 有一个长度为 N 的数组 c,初始值都为 0,下标编号为 1, 2, \cdots, N

现在 YJC 忙着 AK CSP-S2019,没空验证数据的正确性,所以只能把这个重任交给了你 —— ******,希望你能写一个程序帮他实现以下的几个操作:

opt=1,给定 L, R,输出 \sum\limits_{i=L}^R c_i 的值对 998244353 取模后的结果;

opt=0,给定 L, R 以及 K 次多项式 f(x)=\sum\limits_{k=0}^K a_kx^k,对 c_L, c_{L+1}, \cdots, c_R 分别加上 f(1), f(2), \cdots, f(R-L+1) 的值。

  • 输入格式

第一行两个正整数 N, Q ,分别表示区间范围 [1, N] 及询问数 Q

接下来,每行(除了每个 opt=0 操作的下一行)的第一个数 opt 表示操作类型。

opt=0,则接下来有两个正整数 L, R 表示操作的区间 [L, R]。紧接着下一行的第一个整数 K 表示多项式的最高次数为 K ,接下来 K+1 个整数 a_0, a_1, \cdots, a_K 分别表示多项式 f(x)= \displaystyle\sum\limits_{k=0}^K a_kx^k 的系数;

opt=1,则接下来有两个正整数 L, R 表示询问的区间 [L, R]

因为 YJC 忙着 AK CSP-S2019(之前说过了),所以他一不小心把数据给加密了。

记 …

YZOJ P4637 [CSP-S 2019 五校联训 Round 2]由比滨结衣(sqrt)

YZOJ P4637 [CSP-S 2019 五校联训 Round 2]由比滨结衣(sqrt)

时间限制:2000MS      内存限制:524288KB

难度:6.5

  • 题目描述

给定一个长度为 n 的正整数序列 \{a_i\},有 m 次操作。格式如下:

1 l r x 将区间 [l,r] 中的所有数变为 x

2 l r x 查询区间 [l,r] 中数字 x 的出现次数。

  • 输入格式

第一行两个正整数 n,m,表示序列长度和操作次数。

第二行 n 个正整数,第 i 个数为 a_i,表示序列初始值。

接下来 m 行每行四个正整数,表示操作,含义如题目所示。

  • 输出格式

对于每个询问,输出一行一个正整数表示答案。

  • 样例 1 输入

  • 样例 1 输出

  • 数据规模与约定

对于 20\% 的数据,\(1 \leq …

YZOJ P2967 收割

YZOJ P2967 收割

时间限制:4000MS      内存限制:524288KB

难度:7.0

  • 题目描述

兔有 n 个甘蔗,兔将它们种成一排。

每天早上,第 i 个甘蔗会长高 a_i 米,但如果达到 b_i 米,就不会继续长高,而是维持在 b_i 米。

兔收割了 m 次甘蔗,第 i 次收割在第 t_i 天的晚上,他收割了 [l_i, r_i] 中的所有甘蔗。收割后,这些甘蔗的高度变为 0 米,但第二天还会继续按照原来的规则生长。

请你求出兔每天收割了多少甘蔗。

  • 输入格式

第一行 n, m

接下来 n 行,每一行 a_i, b_i

接下来 m 行,每一行 t_i, l_i, r_i,保证输入的 t_i 严格递增。

  • 输出格式

输出 m 行表示兔每次收割的甘蔗的高度之和。

  • 样例输入

  • 样例输出

  • 数据规模与约定

存在 30\% 数据,保证所有甘蔗都不会长到 b_i 米;

存在 30\% 数据,保证每次收取的是所有萝卜;

存在 60\% 数据,n \leq 50000

对于所有数据 n \leq 300000m \leq 100000t_i,a_i,b_i \leq 10^9

 

 

 …

YZOJ P3942 gss2加强版

YZOJ P3942 gss2加强版

时间限制:2000MS      内存限制:524288KB

难度:7.0

  • 题目描述

给你 n 个数,你需要支持一下两种操作。

U x y:将第 x 个数修改成 y

Q x y:计算从第 x 个数至第 y 个数中不同数的和并输出。如对于一段数 1,2,3,2,7,它的值是 13=1+2+3+7

  • 输入格式

第一行 n 表示数的个数;

第二行包含这 n 个数;

第三行 m 表示操作次数;

接下来 m 行每行三个数表示题目描述的操作。

  • 输出格式

对于每个 Q 操作返回一个值。

  • 样例输入

  • 样例输出

  • 数据规模与约定

所有的输入均在 int  以内。

n \leq 100000 , m \leq 100000

 

 

Source: BZOJ 2883…

YZOJ P2905 [PA2014]Druzyny

YZOJ P2905 [PA2014]Druzyny

时间限制:1000MS      内存限制:131072KB

难度:8.0

  • 题目描述

在之前的某次校内训练中,zzx 出了一道神奇的题目:给出 n 个人,要求将所有人分成若干个组,第 i 个人所在的组的人数必须在 [l_i, r_i] 之间,判断是否存在可行解。

OI组的神犇们决定把这题改造一下:

dick32165401:改成只有编号连续的的一段才可以分一组。

runzhe2000:判定可行解可能会被爆搜水过,最大化分的组数就不那么容易水过了。

E.Space:不仅要最大化组数,还要求出最大化组数的方案数。

ct:数据范围就出100万好了。

于是这题就被这么造好了。

  • 输入格式

第一行 n1 \leq n \leq 1000000

接下来 n 行,每行 l_i,r_i1 \leq l_i \leq r_i \leq 1000000

  • 输出格式

若不存在合法的方案,仅输出一行 -1

否则输出一行两个整数,分别表示组数的最大值和组数取最大值的方案数模 10^9+7

  • 样例输入

  • 样例输出

 

 

 

Source: BZOJ 3711

膜拜上方所有dalao %%%%%%%%%%%%%%%%%%

像我这种菜鸡看到这种神仙题只会爆零QAQ…

YZOJ P3706 [APIO2018]新家

YZOJ P3706 [APIO2018]新家

时间限制:5000MS      内存限制:1048576KB

难度:7.0

  • 题目描述

五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示。

小明是一位时光旅行者,他知道在这条街上,在过去现在和未来共有 n 个商店出现。第 i 个商店可 以使用四个整数 x_i , t_i , a_i , b_i 描述,它们分别表示:商店的坐标、商店的类型、商店开业的年份、商店关闭的年份。

小明希望通过时光旅行,选择一个合适的时间,住在五福街上的某个地方。他给出了一份他可能选择的列表,上面包括了 q 个询问,每个询问用二元组 (坐标,时间)表示。第 i 对二元组用两个整数 l_i , y_i 描述,分别表示选择的地点 l_i 和年份 y_i

现在,他想计算出在这些时间和地点居住的生活质量。他定义居住的不方便指数为:在居住的年份,离 居住点最远的商店类型到居住点的距离。类型 t 的商店到居住点的距离定义为:在指定的年份,类型 t 的所有营业的商店中,到居住点距离最近的一家到居住点的距离。我们说编号为 i 的商店在第 y 年在营业当且仅当 a_i \leq y \leq b_i 。注意,在某些年份中,可能在五福街上并非所有 k 种类型的商店都有至少一家在营业。在这种情况下,不方便指数定义为 -1

你的任务是帮助小明求出每对(坐标,时间)二元组居住的不方便指数。

  • 输入格式

第一行包含三个整数 n,kq ,分别表示商店的数量、商店类型的数量和(坐标,时间)二元组的数量(1 \le n, q \le 3 \times 10^5 , 1 \le k \le n

接下来 n 行,每行包含四个整数 x_i , t_i , a_ib_i 用于描述一家商店,意义如题面所述 (1 \le x_i , a_i , b_i \le 10^8 , 1 \le t_i \le k, a_i \le b_i)。

接下来 q 行,每行包含两个整数 l_iy_i ,表示一组(坐标,时间)查询 (1 \le l_i , y_i \leq 10^8 )。

  • 输出格式

输出一行,包含 q 个整数,依次表示对于 q 组(坐标,时间)询问求出的结果。…

[校内训练20161216] T2 版本管理git

[校内训练20161216] T2 版本管理git

时间限制:2000MS      内存限制:1048576KB

难度:7.0

  • 题目描述

在工程的开发中,我们常常用 Git 进行版本的管理。这个方式具体来说是这样的:刚开始只有一个版本 0,表示最初始的情况,也就是空的项目;接下来一个用户可以对某一个版本 p 的项目进行修改,得到一个新的版本 i。这样,一个工程就产生了许多不同的版本,而管理员可以选择一些优秀的,将其合并到主版本中。

F 公司有一个项目 U,这个项目由一个字符串构成。版本 0 为空串。有 n 个开发者按顺序对这个项目进行了修改,其中第 i 个开发者将第 p_i ( 0 \le p_i < i) 个版本的开头添加上一个字符 c_i (1 \le c_i \le m) 作为新的版本 i

作为项目的总负责人,你希望对这些版本进行评价。对一个字符串 S,称串 S 是串 T 的超前缀,当且仅当串 S 是串 T^{*} 的前缀。 T^{*} 表示 T 重复无限次得到的一个无限长度的串,如若 T = abcd,则 T^{*} = abcdabcdabcd \cdots。我们称串 S 的 “kitty 长度” 为 l,当且仅当存在一个长度为 l 的串 T 使得 ST 的超前缀,且不存在小于 l 的串 T’ 使得 ST’ 的超前缀(定义空串的 kitty 长度为 0)。你需要做的就是对每一个版本求出其的 kitty 长度(设版本 ikitty 长度为 kitty(i))。

在实际运营中,有两种情况,我们用一个数 k \in \{0,1\} 表示。在 k = 0 的情况中, 你可以等候开发者进行所有修改后,再进行计算;但在 k = 1 的情况中,开发者希望能够实时得到自己修改得到的版本的 kitty 长度,你需要实时计算出每个版本的 kitty 长度。

  • 输入格式

第一行包含三个整数 n,m,k

接下来 n 行,其中第 i 行包含两个整数 p^{′}_{i}; c^{′}_{i},其中:

如果 k = 0 ,则 p_i = p^{′}_{i}c_i = c^{′}_{i}

如果 k = 1,则 \(p_i = p^{′}_{i} \oplus kitty(i …

YZOJ P3791 餐馆

YZOJ P3791 餐馆

时间限制:2000MS      内存限制:524288KB

难度:6.0

  • 题目描述

在一条东西向的街道上有 n 个餐馆,从西向东编号为 1n,第 i 个餐馆和第 i+1 个餐馆的距离为 a_i

吃货小W喜欢到这条街道的餐馆里吃饭。现在,小W得到了 m 张餐票,每张餐票可以用于在街道上的任一餐馆里吃一餐。在第 i 个餐馆中,使用第 j 张餐票吃饭,可以获得的美味度为 b_{i,j} 。注意,每张餐票最多用一次,但在同一餐馆内可以使用任意多张餐票。

小W打算用完这 m 张餐票。他可以选择任一餐馆作为起点,每次吃饭时,可以选择一个餐馆,然后从当前位置(上次吃饭的地点,如果不存在则为起点)出发前往该餐馆并用任意一张未用过的餐票吃一餐,直到吃完 m 餐为止。小W希望最大化每次吃饭的美味度之和减去路上经过的总路程的值。

  • 输入格式

输入第一行包含两个正整数 n,m

第二行包含 n-1 个正整数 a_1,a_2,\cdots,a_{n-1}

接下来 n 行,每行包含 m 个正整数,其中第 i 行第 j 个数为 b_{i,j}

  • 输出格式

输出一行一个整数,表示所求的最大值。

  • 样例输入

  • 样例输出

  • 样例说明

最优方案如下:以餐馆 1 为起点,在餐馆 1 使用第 1 张餐票、第 3 张餐票,然后前往餐馆 2 使用第 2 张餐票、第 4 张餐票。

  • 数据规模与约定

对于所有数据,nm \leq 10^6n \geq 2a_i, b_{i, j} \leq 10^9

 

 

 

Source:ARC067 F – Yakiniku