[题解向] 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] ...
随机推荐
- python logging模块“另一个程序正在使用此文件,进程无法访问。”问题解决办法
在多进程下使用python的logging模块,经常会遇到"另一个程序正在使用此文件,进程无法访问."的错误. 解决办法: https://github.com/Preston-L ...
- mysql关联两张表时的编码问题
Mysql关联两张表时,产生错误提示Illegal mix of collations 1.先用工具把数据库.两张表的编码方式改变 2.这步很重要,需要改变字段的编码方式. ALTER TABLE ` ...
- Linux系统管理图文详解超详细精心整理
前言:带你遨游于linux系统管理知识的海洋,沐浴春日里的阳光,循序渐进,看完之后收获满满. 本次讲解基于linux(centos6.5)虚拟机做的测试,centos7估计以后有时间再更新啊. lin ...
- Redis for OPS 06:Redis Cluster 集群
写在前面的话 前面的主从,HA 都只是解决我们数据安全性方面的问题,并没有解决我们业务瓶颈的问题.当业务并发到达一定瓶颈的时候,我们需要对服务进行横向扩展,而不是纵向扩展.这就需要引入另外一个东西,R ...
- python基础(22):模块、包
1. 模块 1.1 什么是模块 别人写好的函数.变量.方法放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模 ...
- hitTest和pointInside如何响应用户点击事件
hitTest和pointInside如何响应用户点击事件 处理机制 iOS事件处理,首先应该是找到能处理点击事件的视图,然后在找到的这个视图里处理这个点击事件. 处理原理如下: • 当用户点击屏幕时 ...
- Python单元测试工具doctest和unittest
Python标准库包含两个测试工具. doctest:一个简单的模块,为检查文档而设计,但也适合用来编写单元测试. unittest:一个通用的测试框架. 一.使用doctest进行单元测试 创建文件 ...
- 中文代码之Django官方入门:建立模型
参考编写你的第一个 Django 应用,第 2 部分 创建项目后,首先用中文命名应用: $ python3 manage.py startapp 投票 之后在models.py建立模型,其他各种相关配 ...
- Flask 安装环境(虚拟环境安装)
Flask 安装环境 使用虚拟环境安装Flask,可以避免包的混乱和冲突,虚拟环境是python解释器的副本,在虚拟环境中你可以安装扩展包,为每个程序 单独创建虚拟环境,可以保证程序只能访问虚拟环境中 ...
- mssql sqlserver 数据类型sql_variant简介说明
转自: http://www.maomao365.com/?p=9712 摘要: 下文讲述sqlserver中sql_variant数据类型定义.赋值.应用的相关说明,如下所示: 实验环境:sql ...