\(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}\)

\(Link\)

简单来说就是给你一个序列\(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的更多相关文章

  1. 【题解】PKUWC2018简要题解

    [题解]PKUWC2018简要题解 Minimax 定义结点x的权值为: 1.若x没有子结点,那么它的权值会在输入里给出,保证这类点中每个结点的权值互不相同. 2.若x有子结点,那么它的权值有p的概率 ...

  2. 【题解】CF#713 E-Sonya Partymaker

    这题真的想了挺久的,然而到最后也还是没想到怎样处理环的情况……网上竟然也完全没有题解,无奈之下到 CF 的 AC 代码里面去找了一份膜拜了一下.感谢~ 由于觉得这题有一定的难度,自己看代码也看了比较久 ...

  3. 【AtCoder】ARC094(C-F)题解

    C - Same Integers 题解 要么三个都达到最大的数,要么三个都到达最大的数+1,判断是前一种情况的方法是不断垫高前两大的,看之后最小的那个和最大的那个差值是不是2的倍数 否则就是第二种情 ...

  4. [题解向] CF#Global Round 1の题解(A $\to$ G)

    这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...

  5. 【题解】CF#983 E-NN country

    首先,我们从 u -> v 有一个明显的贪心,即能向上跳的时候尽量向深度最浅的节点跳.这个我们可以用树上倍增来维护.我们可以认为 u 贪心向上跳后不超过 lca 能跳到 u' 的位置, v 跳到 ...

  6. 【题解】CF#280 C-Game on Tree

    感觉对期望也一无所知……(:′⌒`)╮(╯﹏╰)╭ 一直在考虑怎么dp,最后看了题解——竟然是这样的???[震惊]但是看了题解之后,觉得确实很有道理…… 我们可以考虑最后答案的组成,可以分开计算不同的 ...

  7. CF 449D 题解(状压+容斥)

    状压妙啊... 本题的主体思路:状压+容斥原理(或状压+数位dp) 记g[i]表示按位与后结果所有位上至少有i个1的方案数 那么根据容斥原理,ans=g[0]-g[1]+g[2]-g[3]+g[4]. ...

  8. 【题解】CF#611 H-New Year and Forgotten Tree

    有趣啊~手玩一下这棵树,发现因为连边只对相连点的位数有限制,我们可以认为是在往一棵已经有 m 个结点的树上挂叶子结点直到满足要求.(m = log(10) n).注意由于 m 超级无敌小,我们可以直接 ...

  9. 【题解】CF#24 D-Broken Robots

    在某次考试的时候用过的办法,懒人必备……[笑哭] 一个非常显然的 dp,我们用 \(f[i][j]\) 表示第 \(i\) 行第 \(j\) 列的格子走到最后一排的期望步数转移即为 \(f[i][j] ...

随机推荐

  1. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级(含有数据校验)-APP用户程序制作过程

    前言 这一节和上一节是搭配的 给大家鱼,也必须给鱼竿! 我期望自己封装的代码,无论过了多少年都有应用的价值! 这节说明一下制作APP用户程序的过程 咱是用MQTT通信控制模块实现升级,所以首先自己的程 ...

  2. 基于Django的Rest Framework框架的url控制器

    本文目录 一 自定义路由(原始方式) 二 半自动路由(视图类继承ModelViewSet) 三 全自动路由(自动生成路由) 回到目录 一 自定义路由(原始方式) from django.conf.ur ...

  3. 【Sublime Text】sublime修改默认浏览器及使用不同浏览器打开网页的快捷键设置

    #第一步:安装SideBarEnhancements插件 下载插件,需要“翻墙”,故提供一下该插件的github地址:https://github.com/titoBouzout/SideBarEnh ...

  4. php逻辑运算符 异或

  5. ASP.NET ---- Repeater 遍历出省市

    Repeater  控件可以数据库中的数据,一条条的查找出,不需要后端在进行遍历输出了, Repeater必须使用的是Itemtemplate,其它的类型模板按需添加,主要记住Itemtemplate ...

  6. yolov3和ssd的区别

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/BlowfishKing/article/d ...

  7. 如何真正实现由文档驱动的API设计?

    前言 本文主要介绍了一种新的开发思路:通过反转开发顺序,直接从API文档中阅读代码.作者认为通过这种开发方式,你可以更清楚地知道文档表达出什么以及它应该如何实现. 如果单从API文档出发,由于信息量不 ...

  8. vue-路由-显示名称

    显示名称 方式1: <div id="app"> <!-- 分析: --> <!-- 1. 我们要监听到 文本框数据的改变,这样才能知道 什么时候去拼 ...

  9. ts常用数据类型

    1.1 布尔值 let isTrue: boolean = false; console.log(isTrue); 1.2 数字 let age: number = 26; console.log(a ...

  10. IOS疯狂基础之模态显示PresentModalViewController(转)

    转自:http://blog.csdn.net/wudizhukk/article/details/8553554 -(void)buttonDown:(id)sender{ ViewTwo *two ...