对最终答案取对数,得到$\ln(Ans)=\frac{1}{c}\sum \ln(v_i)$,典型的分数规划问题.二分答案后,对所有咒语串建立AC自动机,然后套路地$f[i][j]$表示走到T的第i个字符,当前在自动机的第j个位置,能得到的最大收益.注意二分的r初始不能设太大,25就可以了,二分终止的eps最好设到1e-5,否则会WA或者TLE. #include<cmath> #include<cstdio> #include<cstring> #include<…
luoguP5319 [BJOI2019]奥术神杖(分数规划,AC自动机DP) Luogu 题解时间 难点在于式子转化,设有c个满足的子串,即求最大的 $ ans = \sqrt[c]{\prod_{ i = 1 }^{ c } w_{i} } $ . 取个对数变成 $ \ln Ans = \frac{1}{c} \sum_{ i = 1 } ^ { c } \ln w_{i} $ . 很明显是0/1分数规划. 二分mid倒腾一下式子变成 $ \sum_{ i = 1 }^{ c } ( \ln…
题面 传送门 思路 首先,看到这个乘起来开根号的形式,应该能想到用取$\log$的方式做一个转化: $\sqrt[n]{\prod_i a_i}=\frac{1}{n}\sum_i \log_b a_i$ 这里我们把$b$取到$e$,就是$\ln a_i$了,不过实际上$b$取什么都没有问题 那么,这个问题就转化为了求所有匹配的宝石序列的最大平均值 遇到这种多模式串.单模板串的情况,应当第一时间想到AC自动机 我们建立模式串的AC自动机,并在上面跑dp即可完成题目的求解 建立AC自动机的时候,注…
题解:很显然可以对权值取对数,然后把几何平均值转为算术平均值,然后很显然是分数规划.先对每个模式串建立AC自动机,每个节点w[i],sz[i]分别表示以其为前缀的字符串,然后再二分最优解k,然后w[i]-=k*sz[i],然后枚举T,在AC自动机上DP一遍,求最大值是否大于0即可. #include<bits/stdc++.h> using namespace std; ; ],fail[N],sz[N],g[N][N],h[N][N]; double w[N],f[N][N]; char T…
正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为\(n\)的串\(T\),用\(0\sim 9\)填充所有的\(.\). 然后给出\(m\)个串和它们的价值. 一个填充方案的价值等于:若\(T\)中出现了\(c\)个给出的串,那价值等于它们的价值乘积开\(c\)次根. \(1\leq m\leq 1501,1\leq V_i\leq 10^9\) 解题思路 \[ans=\sqrt[c]{\prod V_i} \] \[\ln an…
[BJOI2019]奥术神杖(分数规划,动态规划,AC自动机) 题面 洛谷 题解 首先乘法取\(log\)变加法,开\(c\)次根变成除\(c\). 于是问题等价于最大化\(\displaystyle \frac{\sum val_i}{c}\).典型的分数规划的形式. 二分权值\(k\),每个点的点权变成\(val_i-k\),转为求最值,那么直接在\(AC\)自动机上\(dp\)就行了. 注意精度问题. #include<iostream> #include<cstdio> #…
题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这样不大好求,我们将这个式子取$ln$,变成$ln\ ans=\frac{1}{c}\sum_{i=1}^{c}ln\ v_{i}$. 这显然是一个分数规划,每次二分一个答案$mid$,将每个串的权值都减去$mid$,那么只需要求最大价值是否大于$0$即可. 剩下的问题就是一个在$AC$自动机上的$D…
题目大意: 给出一个长度 $n$ 的字符串 $T$,只由数字和点组成.你可以把每个点替换成一个任意的数字.再给出 $m$ 个数字串 $S_i$,第 $i$ 个权值为 $t_i$. 对于一个替换方案,这样定义它的价值: 如果数字串 $S_i$ 在 $T$ 中出现了,那么将 $t_i$ 加入多重集.如果出现多次也要加多次. 它的价值就是这个多重集元素的几何平均数(所有 $c$ 个数的乘积开 $c$ 次方根). 请构造出一个替换方案,使得这个值最大.不用输出这个价值. $1\le n\le 1500,…
传送门 要求的东西带个根号,这玩意叫几何平均数,说到平均数,我们就能想到算术平均数(就是一般意义下的平均数),而这个东西是一堆数之积开根号,所以如果每个数取对数,那么乘法会变成加法,开根号变成除法,所以我们只要最大化\(\frac{\sum_i ln_{a_i}}{c}\)就行了 这是一个分数规划的形式,首先二分最终答案\(mid\),然后我们要求最大答案,所以要检查\(\frac{\sum_i ln_{a_i}}{c}\)是否可以\(\ge mid\),可以改成\[\sum_i ln_{a_i…
卡精度好题 最关键的一步是几何平均数的\(ln\)等于所有数字取\(ln\)后的算术平均值 那么现在就变成了一个很裸的01分数规划问题,一个通用的思路就是二分答案 现在来考虑二分答案的底层怎么写 把所有串拉出来造ac自动机,那么ac自动机上一个点的权值就是 fail树上这个点到祖先的树链上的字符串的权值之和 那么接下来设\(f(i,j)\)表示决策到了第\(i\)个字符,走到自动机节点\(j\)的最大收益大力dp即可 由于我们不希望均值是0,因此额外记录下有没有匹配上模式串即可 二分完了之后把m…
原题传送门 题目让我们最大化\(val=\sqrt[k]{\prod_{i=1}^k w_i}\),其中\(k\)是咒语的个数,\(w_i\)是第\(i\)个咒语的神力 看着根号和累乘不爽,我们两边同取\(\ln\) \[\ln val=\frac{1}{k}\sum_{i=1}^k \ln w_i\] 易知当\(\ln val\)最大化时,\(val\)也最大化.所以我们将问题转化成了最大化\(\frac{1}{k}\sum_{i=1}^k \ln w_i\),我们发现这是算数平均数.我们珂以…
https://www.luogu.org/problemnew/show/P5319 题解 首先观察我们要求的答案的形式: \[ \biggl(\prod V_i \biggr)^x\ \ \ x=\frac{1}{c} \] 这个东西貌似还不能最优化,根据套路论,把这个东西整体取个\(ln\),于是就变成了: \[ ln\biggl(\biggl(\prod V_i \biggr)^x\biggr)=\frac{1}{x}\sum ln(V_i) \] 然后这个东西就可以分数规划了,验证的话…
题目传送门 题目大意 给出一个残缺的字符串,每个位置都 \(\in[0,9]\).有 \(m\) 中贡献,即 \(s,k\),表示该字符串中没出现一次 \(s\),贡献便乘上 \(k\).最后对贡献求 \(c\) 次根,其中 \(c\) 是总出现次数.求贡献的最大值. 字符串长度以及贡献字符串长度之和 \(\le 1500\) 思路 首先你需要想到我们可以全部取 \(\ln\),然后每次贡献就是 \(+k\),求根就是 \(/c\),于是问题就是最大化: \[\frac{\sum k}{c} \…
题目:https://loj.ac/problem/3089 没想到把根号之类的求对数变成算数平均值.写了个只能得15分的暴力. #include<cstdio> #include<cstring> #include<algorithm> #define db double using namespace std; ,K=; ; ,c[N][K],fl[N]; db ans; ],nxt[N<<],vl[N],sm[N]; int l[N],v[N],dy[…
LOJ#3089. 「BJOI2019」奥术神杖 看见乘积就取log,开根号就是除法,很容易发现这就是一道01分数规划.. 然后建出AC自动机直接dp就行,判断条件要设成>0,因为起点的值是1,取完ln后是0 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define…
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的神器,试图借助神器的神秘 力量帮助她们战胜地灾军团. 在付出了惨痛的代价后,精灵们从步步凶险的远古战场取回了一件保存尚完好的神杖.但在经历过那场所有史书都视为禁忌的"诸神黄昏之战"后,神杖上镶嵌的奥术宝石 已经残缺,神力也几乎消耗殆尽.精灵高层在至高会议中决定以举国之力收集残存至今的奥术宝…
题目传送门:LOJ #3089. 题意简述: 有一个长度为 \(n\) 的母串,其中某些位置已固定,另一些位置可以任意填. 同时给定 \(m\) 个小串,第 \(i\) 个为 \(S_i\),所有位置都已固定,它的价值为 \(V_i\). 每次每个小串在母串中出现一次,便会给答案的多重集贡献一个 \(V_i\). 最终的答案为多重集的几何平均数,定义空集的几何平均数为 \(1\). 请你求出一个合法母串(往可以填的位置填合法字符)使得答案最大. \(1\le n,s\le 1501\),\(1\…
目录 写在前面 定义 引入 构造 暴力 字典图优化 匹配 在线 离线 复杂度 完整代码 例题 P3796 [模板]AC 自动机(加强版) P3808 [模板]AC 自动机(简单版) 「JSOI2007」文本生成器 「BJOI2019」奥术神杖 「SDOI2014」数数 「NOI2011」阿狸的打字机 写在最后 写在前面 这篇文章的主体是在没网的悲惨状况下完成的. 前置知识:Trie 树,DFA,KMP 字符串匹配算法. 请务必深刻理解! 定义 \(|\sum|\):字符集大小,在大多数题目中都等…
题意 你有一个长度为 $n$ 的模板串(由 $0-9$ 这 $10$ 个数字和通配符 $.$ 组成),还有 $m$ 个匹配串(只由 $0-9$ 这 $10$ 个数字组成),每个匹配串有一个魔力值 $v_i$.你要把模板串的每个 $.$ 都换成一个数字,使得模板串的魔力值最大.模板串的魔力值定义为:模板串中每出现一次任意一个匹配串 $s_i$,字符串的魔力就 $\times v_i$.最终魔力值开 $c$ 次方根,$c$ 为模板串中出现的匹配串的总数. $1\le n,m,s\le 1501,\s…
这是BC上的一道题,当时比赛没有做,回头看看题解,说是AC自动机,想着没有写过AC自动机,于是便试着抄抄白书的模板,硬是搞了我数个小时2000ms时限1800过了= = ! 这里就直接贴上BC的结题报告(#27):http://bestcoder.hdu.edu.cn/solutions.php 1003 Matching on Array 首先我们考虑m=1的情况.给定两个数组A={a1,a2,…,an}和B={b1,b2,…,bk},问B在A中出现了几次.令ci=ai+1ai,1≤i<n,同…
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3536 Accepted Submission(s): 1153 Problem Description For the hope of a forever love, Steven is planning to send a ring to Jane with a romantic…
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 学校组织了一次新生舞会,Cathy 作为经验丰富的老学姐,负责为同学们安排舞伴. 有 n nn 个男生和 n nn 个女生参加舞会,一个男生和一个女生一起跳舞,互为舞伴.Cathy 收集了这些同学之间的关系,比如两个人之前是否认识,计算得出 ai,j a_{i, j}a​i,j​​,表示第 i ii…
---题面--- 题解: 0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久 中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流 这个题面也很直白啊--- 我们令C>=x, 然后二分求出最大的x即可, 每次跑费用流前重新定义边权 a[i] - mid * b[i] 然后跑最大费用最大流看看跑出来能不能有大于0的费用就可以了 #include<bits/stdc++.h> using namespace std; #defi…
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11526   Accepted: 3930 Description Farmer John has decided to reward his cows for their hard work by taking them on a tour of the big ci…
链接:https://www.nowcoder.com/acm/contest/143/A来源:牛客网 Kanade selected n courses in the university. The academic credit of the i-th course is s[i] and the score of the i-th course is c[i]. At the university where she attended, the final score of her is …
[HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v),b[i]=1\),问题转化为\(min(\frac{\sum^{k}_{i=1}a[i]}{\sum^{k}_{j=1}b[j]})\) 分数规划考虑二分答案,当前\(mid\)可能为答案当且仅当: \[ \frac{\sum^{k}_{i=1}a[i]}{\sum^{k}_{j=1}b[j]}…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4898 https://loj.ac/problem/2308 题解 发现我们可以把整个环路分成很多段,每一段都携带着一个物品. 那么从 \(x\) 到 \(y\) 的这一段,我们可以预处理出应该选择什么物品.可以发现这个是不会变化的. 于是我们可以视为问题转化为了这样一个问题:给定一个有向完全图,每一条边有一个价值 \(w\),还有一个费用 \(t\),选择一个环,使得 \(\frac{\s…
题意:给你若干个串和一个填了一部分的串.补完这个串使得 (每个串的匹配次数 * 权值) ^ (1 / 所有串匹配次数) 最大. 解:把这个东西随便取一个对数,就变成了分数规划. 二分.然后在AC自动机上DP判定. #include <bits/stdc++.h> ; ; ], tot(), cnt[N], g[N][N], gt[N][N], tans, fail[N], n; double ed[N], f[N][N]; char str[N], ss[N]; inline void get…
传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的结尾). 设dp[i][j]代表长度为i到trie树上的j号节点所得的最大分数,显然有dp[i+1][j的字符k儿子] = max{dp[i+1][j的字符k儿子], dp[i][j] + sum[j的字符k儿子]} memset(dp, -, sizeof(dp)); dp[][] = ; ; i…
看到平均值一眼分数规划,二分答案mid,边权变为w[i]-mid,看是否有长度在[L,R]的正权路径.设f[i][j]表示以i为根向下j步最长路径,用长链剖分可以优化到O(1),查询答案线段树即可,复杂度O(nlog2n) 不知为什么bzoj上RE,luogu上AC,暂时不管了. #include<bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace st…