2019HDU多校第一场 String 贪心】的更多相关文章

题意:给你一个字符串,问是否存在一个长度为m的子序列,子序列中对应字符的数目必须在一个范围内,问是否存在这样的字符串?如果存在,输出字典序最小的那个. 思路:贪心,先构造一个序列自动机,序列自动机指向在它后面离它最近的某个字符的位置.对于当前位置,从a开始枚举字符,如果答案串的下个位置填这个字符可以,就立马填上这个字符,最后看一下贪心构造的字符串长度是不是m就可以了. 代码: #include <bits/stdc++.h> using namespace std; const int max…
2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能有x个不同的数字,计算序列构造方案数 思路 1.首先考虑最暴力的做法,直接dfs暴力构造,碰到区间的右端点就开始判断当前构造是否满足,如果不满足就回溯,很显然,复杂度爆炸O(4^n) 2.考虑怎么优化暴力算法,从(n<=100)不难猜出这是一个dp,考虑这种字符串构造形式的dp,肯定是一位一位有序构造,…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题目大意:长度为\(n\)的数组要求分别填入\(\{0,1,2,3\}\)四个数中的任意一个,有\(m\)个限制条件:区间\([l,r]\)中出现的数字种数恰好为\(x\),求方案数 题解:f[i][j][k][cur]表示四个数最后出现的位置经过排序后为\(i,j,k,cur\)的方案数,暴力转移即可,其中最后一维需要滚动数组节省空间 对于限制条件可以用vector存下来,每次循环对右端点为…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6580 题目大意:\(n\times m\)大小的方格上有\(k\)瓶水,喝完每瓶水都需要一定的时间.初始点在\((1,1)\),每次可以向左或者向右走一步,如果当前的纵坐标为\(\frac{m+1}{2}\)则可以向下走一步.对所有的\(i \in [1,k]\),求喝恰好\(i\)瓶水需要花费的时间.\(n,m\leq 10^9, k\leq 10^4\) 题解:首先对瓶子的横坐标离散化处理,一行…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6584 题目大意:求所有满足\(0<\frac{p}{q}\leq1, gcd(p,q)=1,p\leq n,q\leq n\)的分数中,第\(k\)小的分数 题解:考虑二分答案,并用分数形式记录.假设当前二分的分数为\(\frac{p}{q}\),则小于等于这个分数的个数为 $$\sum_{i=1}^{n}\sum_{j=1}^{\left \lfloor \frac{pi}{q} \right \…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6590 题目大意(来自队友):二维平面上有\(n\)个点,每个点要么是黑色要么是白色,问能否找到一条直线将平面分割成黑白两部分 题解:分别对每种颜色的点求凸包,判断是否相交即可. (有模板真好) #include<bits/stdc++.h> //#include<cstdio> //#include<cmath> //#include<algorithm> us…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6588 题目大意:求\(\sum_{i=1}^{n}gcd(\left \lfloor \sqrt[3]{i} \right \rfloor,i),\ n\leq 10^{21}\) 题解:考虑对\(\left \lfloor \sqrt[3]{i} \right \rfloor\)分块,将式子转换成\(\sum_{i=1}^{\left \lfloor \sqrt[3]{n} \right \rfl…
题意:有四种数字,现在有若干个限制条件:每个区间中不同的数字种类必须是多少种,问合法的方案数. 思路: 定义 dp[i][j][k][t] 代表填完前 t 个位置后,{0,1,2,3} 这 4 个数字最后一次出现的位置, 排序后为 i,j,k,t(i < j < k < t) 的方案数目,则按照第 t+1 位的数字的四种选择,可以得 到四种转移. 对于限制可以按照限制区间的右端点分类,求出 dp[i][j][k][t] 后,找到所有以 t 为区间 右端点的限制条件,如果当前状态不满足所有…
一.题目 Path 二.分析 首先肯定要求最短路,然后如何确定所有的最短路其实有多种方法. 1 根据最短路,那么最短路上的边肯定是可以满足$dist[from] + e.cost = dist[to]$.所以可以求一遍后根据这个公式再向网络图中的加边即可. 2 可以从源点和汇点分别求最短路,然后根据每条边肯定满足$dist1[e.from] + e.cost + dist2[e.to] = dij$,再加边就行了. 确定最短路后,由于是求最小割,直接跑$Dinic$求出最大流就可以了. 三.AC…
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有两个属性a,b 需要将点划分为两堆,划分依据是对于在A划分中的任意点a和在B划分中的任意点b满足 不存在当a.x>b.x时,a.y<b.y 的情况 在A划分中的点可以给出其a属性的贡献,在B划分中的点可以给出其b属性的贡献 求最大贡献和 题解: 根据题意,我们可以得出结论,我们需要找的是一根折线,…