首页 > 其他分享 >#0029. 「JOI Open Contest 2021」Financial Report

#0029. 「JOI Open Contest 2021」Financial Report

时间:2023-01-19 00:45:10浏览次数:69  
标签:impression Financial 数字 index 0029 Contest score 选中 序列

碎碎念1:是的时隔两年多笨人又想开始更博客了
碎碎念2:另外今年就要AFO了 希望能给自己的oi生涯画上一个完美的句号!

题目大意

给定\(N\)个数字和\(D\) 需要从中选择一些数字 在保证选中的数字中所有相邻的数字index之差不超过\(D\)的情况下 最大化选中数字的impression score。这里impression score的定义是选中数字中有多少个比前面所有数字都大的数。

题目解法

首先我们关注到贡献到impression score的数字一定组成一个上升子序列,且另外选中的那些不算在impression score的数字只是为了满足index之差不超过\(D\)这个条件的。所以我们可以忽略那些不算在impression score里的数字,从而把这个问题可以被转化成一个类LIS问题,但不同的地方是转移对index也是有要求的。首先我们可以注意到每个数字后面可以接的index范围是可以预处理的。对于一个位置\(i\),如果我们想接位置\(j\)(我们只考虑上升子序列所以a[\(i\)]<a[\(j\)]),必须保证index在(\(i\), \(j\))这个区间里比a[\(i\)]小的数字没有间隔超过\(D\)的。于是想到一个预处理所有位置可接范围的方法:将所有数字按找从大到小排序,对于每个数字,标记所有大于等于它的位置,然后找到当前数字右边第一个长度为\(D\)的都被标记的连续区间。这个区间的右端点即为当前数字可以接的最大的index。至于怎么维护连续的被mark的区间 我使用了并查集 同时用set存所有长度至少为\(D\)的区间的起点(这里的implementation需要保证每个起点只被试图放进set一次)这样对于每个数字直接在set里面用lower_bound就能找到需要的index(注意+\(D\))。这部分的复杂度是O(\(N\) log \(N\)).
接下来的问题就是怎么快速处理这个类LIS问题。首先注意到这里有点像二维偏序,因此我们可以把所有数字从大到小排序考虑下降子序列,然后用一个线段树存储考虑目前的数字结束在每个位置可以得到的最长下降子序列长度。这样每个位置的答案就是一个线段树上的区间查询。所以我们只需要进行\(N\)次区间查询和单点更新,复杂度为O(\(N\) log \(N\)).

标签:impression,Financial,数字,index,0029,Contest,score,选中,序列
From: https://www.cnblogs.com/myrcella/p/17060947.html

相关文章

  • AtCoder Beginner Contest 043
    A-ChildrenandCandies(ABCEdit)n=int(input())print(n*(n+1)//2)B-UnhappyHacking(ABCEdit)用栈模拟一下?但是栈的遍历比较麻烦这里用vector实现#......
  • AtCoder Beginner Contest 047
    A-FightingoverCandies签到#include<bits/stdc++.h>usingnamespacestd;intread(){...}constintN=1e6+5;intmain(){inta=read(),b=read(......
  • AtCoder Beginner Contest 285 E(背包dp)
    E-WorkorRest题目大意:给定一周有n天,其中至少有1天为休息日,其余为工作日。同时给定一个长度为n的整型数组A,对于一个工作日,它能产生的工作值为A\(_{min(x,y)}\),其中x......
  • AtCoder Beginner Contest 282(G 填坑dp)
    G-SimilarPermutation题目大意:如果两个排列A=(A\(_1\),A\(_2\),A\(_3\)....A\(_N\)),B=(B\(_1\),B\(_2\),B\(_3\)....B\(_N\))满足:(A\(_i\)-A\(_{i+1}\))(B\(_......
  • AtCoder Regular Contest 153(持续更新)
    PrefaceB题粗糙了改了好几个版本,最后索性从头理了一遍思路才过然后剩下40min想C又歪了(构造题精通的被动消失了),还剩25min的时候忍不住了看LPL去了话说现在的ARC感觉和以......
  • AtCoder Beginner Contest 285
    AtCoderBeginnerContest285题目来源A-EdgeChecker2题意判断一个完全二叉树,两个节点是否直接相连分析\(a=b*2或者a=b*2+1(a<b)a、b\)相连voidsolve(){ ......
  • AtCoder Beginner Contest 285 ——D
    题目:D-ChangeUsernames(atcoder.jp)题解:在所有的s[i]和t[i]之间连接一条有向边,由s[i]指向t[i],连接完之后可以发现,会形成若干条链或者环,如果出现了环那么一定不可以实......
  • AtCoder Beginner Contest 285 题解
    比赛链接:https://atcoder.jp/contests/abc285总体来说不算难。A-C略。\(D\)因为起点终点不同,起点之间、终点之间两两不同,所以有环的情况是错的,其他都是对的。写起来的......
  • AtCoder Beginner Contest 285 解题报告
    AtCoderBeginnerContest285解题报告\(\text{DaiRuiChen007}\)ContestLinkA.EdgeChecker2假设\(a\geb\),当且仅当\(\left\lfloor\dfraca2\right\rfloor=b\)......
  • AtCoder Beginner Contest 285 D - Change Usernames(拓扑排序)
    这题想到可以用map容器将string与一个端点下标对应,再建一个有向图,将问题转换成判断一个有向图是否有环赛后补题网上搜如何判断图是否有环,学到了拓扑排序拓扑排序是什么......