[COCI2015]ZGODAN】的更多相关文章

题目大意: 给你一个数$n(n\leq10^1000)$,定义一个数是“美丽数”当且仅当这个数各个数位上的数奇偶性不同. 求最接近$n$的“美丽数”,若有多个,则依次输出. 思路: 贪心+高精度. 首先找出$n$的第一个不符合要求的数位,从这一位开始贪心. 后面几位要么是'8''9'交替(小于$n$的最大的“美丽数”),要么是'0''1'交替(大于$n$的最小的“美丽数”). 然后高精度减法减一下,比较哪个更接近即可. #include<cstdio> #include<cstring&…
3881: [Coci2015]Divljak 题意:添加新文本串,询问某个模式串在多少种文本串里出现过 模式串建AC自动机,考虑添加一个文本串,走到的节点记录下来求树链的并 方法是按dfs序排序去重,每个点+1,相邻点lca-1 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespac…
3810: [Coci2015]Stanovi Description Input 输入一行,三个整数,n, m, k   Output 输出一个数,表示最小不满意度.   Sample Input 3 3 2 Sample Output 1 [Hint] 见描述中的左图的分割方案,最小不满意度为4 * (2 - 2) ^ 2 + (1 - 2) ^ 2 = 1. [数据范围] n, m <= 300 k <= 10000 HINT   Source 鸣谢 Dzy dp f[x][y][u][…
[COCI2015]COCI 题目大意: 有\(n(n\le5\times10^5)\)个人比赛,比赛总共进行\(3\)轮,每一轮得分为\([0,650]\)内的整数.现在已经得知每个人前两轮的成绩.若规定一个人\(A\)在前两轮的成绩均严格高于\(B\),则\(A\)在第\(3\)轮的成绩也一定高于\(B\).求每个人在比赛完成后,最高及最低的可能排名. 思路: 以最高排名为例,对于人\(A\)来言,若\(B\)在前两轮得分的总和\(-A\)在前两轮得分的总和\(\ge 650\),则无论如何…
Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发,把这K个人分别送回去. 请你回答,对于i=1~n,如果在第i个点举行聚会,司机最少需要多少时间把K个人都送回家. (注:一个车可以同时乘坐k个人) HINT [数据规模] K <= N <= 500000 1 <= x,y <= N, 1 <= z <= 1000000…
3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 553  Solved: 176[Submit][Status][Discuss] Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x”,Alice询问Bob,集合T中有多少个字符串包…
[BZOJ3881][Coci2015]Divljak Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x.(我们称串A包含串B,当且仅当B是A的子串) Bob遇到了困难,需要你的帮助. Input 第1行,一个数n: 接下来n行,每行一个字符串表示S_i: 下一行,…
[BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发,把这K个人分别送回去. 请你回答,对于i=1~n,如果在第i个点举行聚会,司机最少需要多少时间把K个人都送回家. Input 第一行两个数,n,K. 接下来n-1行,每行三个数,x,y,z表示x到y之间有一条需要花费z时间的边. 接下来K行,每行一…
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sample Output 109 [数据范围] N <= 500000 1 <= a_i <= 10^8 题解:最近做这种题好像有点多啊~(虽然我基本上都没A). 比较直接的想法就是找出区间的最大值mid,然后分治处理[l,mid-1]和[mi…
3743: [Coci2015]Kamp Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 229[Submit][Status][Discuss] Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发,把这K个人分别送回去. 请你回答,对于i=1~n,如果在第i个点举行聚会,司…
BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组 Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x.(我们称串A包含串B,当且仅当B是A的子串) Bob遇到了困难,需要你的帮助. Input 第1行,一个数n: 接下来n行,每行…
首先树dp求出一个点的答案 然后再一遍dfs换根(是叫做换根吗.. 详见代码 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <algorithm> #define ll long long #define N 500005 #define M 1000006 using name…
Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. 预处理每个位置的数作为最小/大值向左延伸的最大距离,线段树维护序列的前缀的后缀min和后缀max以及这个前缀的后缀对答案的贡献,在前缀末尾加入一个数可以快速维护. #include<cstdio> typedef long long i64; ,P=; ],*ptr=buf-; int _(){ ,c=*++ptr; )c=*++ptr; )x=x…
对Alice的所有串构造AC自动机,并建出Fail树 每当Bob添加一个串时,在AC自动机上走,每走到一个点,就把它到根路径上所有点的答案+1 需要注意的是每次操作,相同的点只能被加一次 所以在需要操作的点构成的虚树上进行修改操作,避免重复修改 对于修改,x到根路径上所有点答案+1等价于在x点打上一个标记,对于所有祖先都有效 由此将问题转化为单点修改,子树查询 树状数组维护 注意到关键点其实只有n个,所以可以一开始先对这n个点求一次虚树来降低常数 时间复杂度$O(L\log L)$,L为所有串的…
题意: 初始数列,每个数都在1~k以内 支持两种操作:1.修改一个数,修改后的数在1~k内                           2.查询一个最短包含1~k的序列的长度 查询100000,数列100000,k是50 题解 考虑压缩状态到一个二进制串. 用一个线段树.每个点维护前缀的状态,后缀的状态.被包含的最短的 然后如果暴力合并子树信息,这样是的,其实有用的状态不超过个.那么时间复杂度就是 合并子树的时候尺取. 就是.卡卡卡卡卡常大概好像就过了 #include <cassert…
Description Solution 考虑分治: 我们要统计跨越 \(mid\) 的区间的贡献 分最大值和最小值所在位置进行讨论: 设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大值为 \(mx\),最小值为 \(mn\) 1.最大值最小值都在左边:\(\sum_{j=mid+1}^{p}mx*mn*(j-i+1)\),可以用等差数列直接算出 2.最大/小值有一个在左边 \(\sum_{j=p}^{q}mx*Mx[j]*(j-i+1)\) 我们可以拆成 \(\sum_{j=p…
题目描述  Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x.(我们称串A包含串B,当且仅当B是A的子串) Bob遇到了困难,需要你的帮助. 题解 多串匹配问题,可以想到用AC自动机维护. 对于这种询问,每个串至多贡献一次的问题. 先是把每个T串在AC自动机上跑一遍,获得了一个点集,那么这…
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x.(我们称串A包含串B,当且仅当B是A的子串) Bob遇到了困难,需要你的帮助. 输入 第1行,一个数n: 接下来n行,每行一个字符串表示S_i: 下一行,一个数q: 接下来q行,每行一个操作,格式见题目描述. 输出 对于每一个Al…
题意 给定一个正整数序列 \(a_1, a_2, \cdots, a_n\) ,求 \[ \sum_{i=1}^{n} \sum_{j=i}^{n} (j - i + 1) \min(a_i,a_{i+1},\cdots,a_j) \max(a_i,a_{i+1},\cdots,a_j) \pmod {10^9} \] \(n \le 5\times 10^5, a_i \le 10^9\) 题解 对于这种求一段区间内所有子区间答案和的东西,我们常常可以考虑分治解决. 通常思路是这样的: 假设我…
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x.(我们称串A包含串B,当且仅当B是A的子串) Bob遇到了困难,需要你的帮助. 输入 第1行,一个数n: 接下来n行,每行一个字符串表示S_i: 下一行,一个数q: 接下来q行,每行一个操作,格式见题目描述. 输出 对于每一个Al…
Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sample Output 109 [数据范围] N <= 500000 1 <= a_i <= 10^8 Solution 这题目好麻烦 考虑所有子区间问题的贡献可以考虑分治 假设当前到达 \(l,r\) 区间,计算跨过 \(mid\) 的贡献 一个指针 \(x\) 从 \(mid\) 往 \(…
传送门 这是一道很有意思的题. 我们把所有的关键点都提出来,当成一棵有边权的虚树. 然后发现虚树上除最后不回到虚根的那条路径外外每条边都会被走两遍. 显然要让答案最优,不走的路径应该在虚树的直径上,于是我们dfs出虚树的直径. 注意对于不在虚树上的节点花费还需要多加dis(i,虚树)∗2dis(i,虚树)*2dis(i,虚树)∗2. 代码: #include<bits/stdc++.h> #define N 500005 #define ll long long using namespace…
题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时递推最靠右的满足最大最小值在左边的位置 \(p_1,p_2\). 根据不同的情况计数即可,注意计算以 \(\rm mid\) 作为右端点的情况. 总时间复杂度为\((nlogn)\). 重点:分治算法降低复杂度的原因:根据极大极小值的不同划分数据以及? 代码 #include<bits/stdc++…
题解 对$S$集合ac建自动机,把$T_{i}$放在里面跑,记录路径上的所有节点并对它们在fail树上求到root的树链并: 这样就得到了$T_{i}$所有的子串: 动态将$T_{i}$加入直接用树状数组维护子树和即可: 另见:喵星球上的点名的ac自动机解法 #include<bits/stdc++.h> #define rg register #define il inline using namespace std; ; ],fl[N],fa[N],head,tail,que[N],o=,…
题目大意,给出两个字符串集合S和T,向T中添加字符串,查询S_i在T中有几个字符串出现过.一看这种多字符串匹配问题,我们联想到了AC自动机,做法就是,对于S集合我们建立一个AC自动机,建出fail树,fail树有一个很好的性质就是,对于一个节点x,它所对应的字符串是它子树中所有节点对应的字符串的后缀.我们考虑如果S_x在P_x 中出现过,他肯定是P_x某一个前缀的后缀,所以我们把P_x在AC自动机上跑,跑到每一个节点我们更新一下他所在的fail树,统计答案的时候只需统计子树的大小就行了.但是这样…
实际上切出来的矩阵在原矩阵上的位置是不重要的...重要的只有矩阵的大小和上下左右是否在边界上. 于是我们可以设f[x][y][l][r][u][d]表示x*y的矩阵上下左右是不是边界的最小代价. 记忆化搜索一下横着切和竖着切. 但是这样会被卡..我们令x>=y l>=r u>=d可以减少很多相同的状态数,而且答案是不变的,这样常数小很多才能过 #include<iostream> #include<cstring> #include<cstdlib>…
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3745 我们对于所有区间,要么在分治的\(mid\)左边,要么在分治的\(mid\)右边,我们可以递归去处理. 所以我们只需要知道怎么快速统计经过\(mid\)的区间的答案即可. 我们从大到小枚举区间的左端点\(x\),然后计算\(\sum\limits_{y=mid+1}^{r}an…
题目大意: 一个$n\times m(n,m\leq500)$的网格图中有若干个标记点,有$q(q\leq10^5)$个操作,每次新加入一个标记点,并询问和新加入点最近的点的距离. 思路: 记录对于每个点$(x,y)$,同一列上在它上面最近的点$u(x,y)$和在它下面最近的点$d(x,y)$. 每次询问时枚举同一行的点的$u(x,j)$和$d(x,j)$,取距离最小值即可,时间复杂度$O(q(n+m))$. #include<cstdio> #include<cctype> #i…
题目大意: 一个$X\times Y(X,Y\leq10^5)$的格子中,每秒钟依次$n(n\leq10^6)$个蘑菇, 告诉你每个蘑菇出现的时间和位置,问何时第一次出现$k(2\leq k\leq n)$点共线,且组成的直线平行于坐标轴,或与坐标轴呈45°夹角的情况? 思路: 开4个数组存一下每条符合要求的直线上的点数, 每次$O(1)$算出这个点所属的4条直线,并加入这个点判断是否符合要求即可. #include<cstdio> #include<cctype> inline…
题目大意: 一个$n\times m(n,m\leq1000)$的格子中有若干金币,从左下角出发,每一步可以进行如下操作: 1.向当前方向前进一格: 2.向上移动一步,并调转当前方向. 一开始的方向是向右,到达一个格子时自动收集当前位置的金币,移动过程中不能离开网格图. 问收集完所有金币至少需要多少步? 思路: 贪心. 首先记录下每一行最左/最右的金币的位置,每次贪心地取完这一行的所有金币, 然后判断上一行最左/最右的金币是否在当前方向上, 如果是,就先往前走到那个位置上,然后再上去,否则就直接…