[题解向] CF#536Div2の题解 E&F
\(0x01~~Preface\)
\(emmm\)这次CF本身打的很顺畅,但是居然unrated了……咕咕咕咕
这是头一次CF有比赛我全部题目都做了……可喜可贺可喜可贺233
简单总结一下前面四道题\(\color{red}{Link}\):
A题:sb题,\(O(n^2)\)枚举的红题(或许都不到),但是我\(check\)的时候太粗心WA了一次身败名裂XD
B题:sb题,一个模拟,需要一个可以处理优先级的数据结构(其实就是堆但是我一开始想的是线段树)
C题:sb题,一个贪心(其实是数学上可proof的数学题但被我当贪心题做了XD),大概就是你胡乱排个序之后胡搞一下就好。
D题:水题,思考一下可得,我们只需要写一个BFS+一个优先队列即可,因为无向图+随便走=胡搞八搞
下面两道题就好像不是那么水了qaq
\(0x02~~E\cdot \text{Lunar New Year and Red Envelopes}\)
\(\color{red}{Link}\)
简单来说就是给\(k\)个区间,每个区间一个左端点\(s\)一个右端点\(e\),同时还有一个蜜汁·右端点\(t\)。顺着时间线\(1\)~\(n\),可以从\(s_i\)到\(e_i\)的时间内选择获得\(w_i\)的收益,但同时下次的选择必须在\(t_i\)之后。
最大化收益的思路下,有\(m\)次机会让选择者在某个时间点啥都不干。求最小的收益。
\(\mathfrak {Solution}\)
呃,其实比较容易的发现就是个时间线\(DP\)。根据"\(n\)不大就DP\(n\)"的是指导思想(瞎扯的),我们应该按时间\(DP\)。那么第一步就是把每个区间的信息映射到时间线上去。这个时候有一个比较妙的\(idea\)。首先我们给每个区间的\(s\)和\(e+1\)在时间线上分别打上不同的标记,之后我们考虑沿时间线从前向后扫描每一段区间,每当遇到一个区间的\(s\)时就丢到一个\(multiset\)里面,反之遇到\(e+1\)时就\(erase\)。然后这样我们只顺便乱搞一下就可以得出每个时间点最优的方案。
之后?之后就直接\(nm\)的DP啊,毕竟\(nm\)只有\(20million\)那么大。
Ps:由于STL中multiset一删删一串的zz性质,改用map惹qaq
#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#define MAXM 233
#define MAXN 100010
using namespace std ;
struct time_node{
int mark, d, w ;
bool operator < (const time_node &T) const {
return w > T.w || (w == T.w && d > T.d);
}
} base[MAXN] ;
map <time_node, int> M_set ;
vector<time_node>Time[MAXN] ; long long Ans ;
int N, M, K, A, B, C, D, i, j ; long long dp[MAXN][MAXM] ;
int main(){
cin >> N >> M >> K ;
memset(dp, 63, sizeof(dp)) ;
for (i = 1 ; i <= K ; ++ i){
scanf("%d%d%d%d", &A, &B, &C, &D),
Time[A].push_back((time_node){1, C, D}) ;
Time[B + 1].push_back((time_node){2, C, D}) ;
}
for (i = 1 ; i <= N ; ++ i){
register int tot = Time[i].size() ;
for (j = 0 ; j < tot ; ++ j)
if (Time[i][j].mark == 1) ++ M_set[Time[i][j]] ;
else M_set[Time[i][j]] > 1 ? M_set[Time[i][j]] -- : M_set.erase(Time[i][j]) ;
if (M_set.size()) base[i] = (*M_set.begin()).first ; else base[i] = (time_node){0, i, 0} ;
}dp[0][0] = 0, Ans = dp[1][1] ;
for (i = 1 ; i <= N ; ++ i){
for (j = 0 ; j <= M ; ++ j){
j > 0 ? dp[i][j] = min(dp[i - 1][j - 1], dp[i][j]) : 1 ;
dp[base[i].d][j] = min(dp[base[i].d][j], dp[i - 1][j] + base[i].w) ;
}
}
for (i = 0 ; i <= M ; ++ i) Ans = min(Ans, dp[N][i]) ; cout << Ans << endl ; return 0 ;
}
\(0x03~~F\cdot \text{Lunar New Year and a Recursive Sequence}\)
简单来说就是给你一个序列\(F_x\)的\(k\)项的递推法则(幂次积式递推),在认定前\(k-1\)项都满足\(F_x=1\)的基础上给定\(F_n\),让你倒推出\(F_k\)来。
\(\mathfrak {Solution}\)
恕我直言…这道题我考场上是不可能会的…(已扑街
首先我们观察一般形式:$$F_x = \begin{cases}1~, &\rm{x<k} \newline ?~, & \rm{x = k} \newline \prod\limits_{j=1}kF_{x-j}{b_j} , & \rm{x>k}\end{cases}~ (\mod 998,244,353)$$
大体上这个式子是没法做的,因为毕竟是乘积+幂次方递推的形式。但是这个地方有个我没想出来、想出来也不会用的\(Idea\),就是我们既然要把乘积转化成求和的形式,那就只能在指数上乱搞。换句话说,我们可以考虑把它的每一项都写成同一个数的幂次,那么递推的时候只需要做加法就可以了。
次我们选择\(998,244,353\)的原根作为底数。因为原根有一个很优美的性质,就是\(p\)的原根的幂次可以遍历\(p\)的简化剩余系。而由\(NTT\)里得到的经验,这个模数的最小原根是\(3\)。
原根的基本定义:设\(g\)为\(p\)的一个原根,则满足:
[题解向] CF#536Div2の题解 E&F的更多相关文章
- 【题解】PKUWC2018简要题解
[题解]PKUWC2018简要题解 Minimax 定义结点x的权值为: 1.若x没有子结点,那么它的权值会在输入里给出,保证这类点中每个结点的权值互不相同. 2.若x有子结点,那么它的权值有p的概率 ...
- 【题解】CF#713 E-Sonya Partymaker
这题真的想了挺久的,然而到最后也还是没想到怎样处理环的情况……网上竟然也完全没有题解,无奈之下到 CF 的 AC 代码里面去找了一份膜拜了一下.感谢~ 由于觉得这题有一定的难度,自己看代码也看了比较久 ...
- 【AtCoder】ARC094(C-F)题解
C - Same Integers 题解 要么三个都达到最大的数,要么三个都到达最大的数+1,判断是前一种情况的方法是不断垫高前两大的,看之后最小的那个和最大的那个差值是不是2的倍数 否则就是第二种情 ...
- [题解向] CF#Global Round 1の题解(A $\to$ G)
这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...
- 【题解】CF#983 E-NN country
首先,我们从 u -> v 有一个明显的贪心,即能向上跳的时候尽量向深度最浅的节点跳.这个我们可以用树上倍增来维护.我们可以认为 u 贪心向上跳后不超过 lca 能跳到 u' 的位置, v 跳到 ...
- 【题解】CF#280 C-Game on Tree
感觉对期望也一无所知……(:′⌒`)╮(╯﹏╰)╭ 一直在考虑怎么dp,最后看了题解——竟然是这样的???[震惊]但是看了题解之后,觉得确实很有道理…… 我们可以考虑最后答案的组成,可以分开计算不同的 ...
- CF 449D 题解(状压+容斥)
状压妙啊... 本题的主体思路:状压+容斥原理(或状压+数位dp) 记g[i]表示按位与后结果所有位上至少有i个1的方案数 那么根据容斥原理,ans=g[0]-g[1]+g[2]-g[3]+g[4]. ...
- 【题解】CF#611 H-New Year and Forgotten Tree
有趣啊~手玩一下这棵树,发现因为连边只对相连点的位数有限制,我们可以认为是在往一棵已经有 m 个结点的树上挂叶子结点直到满足要求.(m = log(10) n).注意由于 m 超级无敌小,我们可以直接 ...
- 【题解】CF#24 D-Broken Robots
在某次考试的时候用过的办法,懒人必备……[笑哭] 一个非常显然的 dp,我们用 \(f[i][j]\) 表示第 \(i\) 行第 \(j\) 列的格子走到最后一排的期望步数转移即为 \(f[i][j] ...
随机推荐
- C语言的指针用法:输入一堆字符,把非字母的删去。
char *p,a[20]; int i; gets(a); //这个语句不同于getchar(),后者只能一次输入一个,而前者可以一次输完所有的字符!!! p=a; //这个语句 ...
- 解决java poi导出excel2003不能超过65536行的问题
java poi在导出数据到excel2003工作表中时一个工作表只能存储65536行数据,如果超过这个数据就会失败,excel2007并没有这个问题,但是为了兼容性我们通常都是导出到2003版本上的 ...
- 关于unittest单元测试框架中常用的几种用例加载方法
unittest模块是Python自带的一个单元测试模块,我们可以用来做单元测试.unittest模块包含了如下几个子模块: 测试用例:TestCase 测试集:TestSuite 加载用例:Test ...
- JDBC释放数据库连接
try(){}写法会自动关闭连接 String sql = "select password from user where name = ?"; try(Connection c ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- day01(无用)
第一讲:1,基本理论知识 第一天内容:抽象.枯燥. 2,工具的操作: 三个工具: 2个发包工具: Jmeter.PostMan 1个抓包工具: Fiddler 3,安全测试的内容: 初级,工具的使用: ...
- D - Ugly Problem HDU - 5920
D - Ugly Problem HDU - 5920 Everyone hates ugly problems. You are given a positive integer. You must ...
- UTF-8和BOM的一些说明
BOM的含义 BOM即Byte Order Mark字节序标记.BOM是为UTF-16和UTF-32准备的,用户标记字节序(byte order).拿UTF-16来举例,其是以两个字节为编码单元,在解 ...
- Oracle - 如何查找指定字符串所出现的表
需求:举个例子,oracle测试库的scott用户下面的有张emp表,emp表的ename列中有一行数据为'CLARK'.红色标记部分. SQL> select * from scott.emp ...
- Idea导出jar包运行报错:找不到主清单属性解决方法
解决方法 1.打开项目结构 2.创建一个Artifact 3.设置 我这里使用的maven,所以有resources文件夹 4.创建lib文件夹 右键output diretory,选择创建文件夹,名 ...