首页 > 其他分享 >Atcoder Grand Contest 056 B - Range Argmax

Atcoder Grand Contest 056 B - Range Argmax

时间:2024-02-10 15:11:53浏览次数:27  
标签:Atcoder le Contest Argmax 最大值 笛卡尔 合法 位置 钦定

因为一组 \(x\) 可能对应多组 \(p\),考虑怎么让决策唯一化。

我们从大到小依次钦定每个值的位置,即倒着遍历 \(i=n,n-1,\cdots,1\),找到最左端的位置 \(v\) 满足,对于现在还活着的所有区间 \(j\) 满足 \(l_j\le v\le r_j\),都有 \(x_j=v\),令 \(p_j=i\),然后删去所有包含 \(i\) 的区间。显然对于一组合法的 \(\{x_m\}\),我们总能唯一还原出对应的排列 \(p\)。

这样以来,原本对 \(x\) 计数可以转化为对排列 \(p\) 计数。即计算有多少个不同的 \(p\),满足这组 \(p\) 对应的 \(\{x_m\}\) 按照这种方式构造以后还原出来的排列刚好也是 \(p\)。

对于一个合法的排列 \(p\),以区间 \(\max\) 为键值建立笛卡尔树,显然笛卡尔树的形态是唯一的。而对于一棵合法的笛卡尔树,要对应得到合法的 \(p\) 显然只能从根开始按先序遍历依次赋值 \(n,n-1,n-2,\cdots,1\),也就是说合法的笛卡尔树与排列形成双射,因此考虑对笛卡尔树进行 DP。

假设当前考虑到笛卡尔树上的区间 \([l,r]\),我们枚举 \([l,r]\) 中最大值的位置 \(k\),递归处理 \([l,k-1]\) 和 \([k+1,r]\) 的部分。但是根据我们的先决条件,这里的 \(k\) 是所有合法的 \(k\) 中最靠左的,所以对于 \([l,k-1]\) 的取值也自然要有一些限制。这里有一个结论:设 \(k'\) 为 \([l,k-1]\) 最大值的位置,那么 \([l,r]\) 合法的充要条件是,\([l,k-1],[k+1,r]\) 都是合法的,且不能存在一个 \(l\le l_i\le k'\le k\le r_i\le r\)。

必要性:如果不存在 \(l\le l_i\le k'\le k\le r_i\le r\),那么把最大值钦定在 \(k'\) 也是合法的。充分性:如果存在 \(l\le l_i\le k'\le k\le r_i\le r\),那么根据左区间的合法性可知把最大值钦定在 \(k'\) 以左是不合法的,而如果把最大值钦定在 \([k',k)\) 中某个位置,那么有 \(x_i\ne k\),也不合法,这样最左端合法位置就是 \(k\) 了。

这样以来考虑 \(dp_{l,r,k}\) 表示有多少种不同的以 \([l,r]\) 为根的合法的笛卡尔树数量,满足 \([l,r]\) 最大值位置 \(\ge k\)。预处理 \(g_{l,r,k}\) 表示当 \([l,r]\) 最大值位置为 \(k\) 的时候,\([l,k-1]\) 最大值位置最小是多少,这样转移可以做到 \(O(1)\)。

时间复杂度 \(O(n^3)\)。

标签:Atcoder,le,Contest,Argmax,最大值,笛卡尔,合法,位置,钦定
From: https://www.cnblogs.com/tzcwk/p/18012877/agc056b

相关文章

  • Atcoder Grand Contest 041 F - Histogram Rooks
    考虑容斥。我们钦定一些格子组成的集合不能被覆盖,设为\(A\)。把与\(A\)中的点同行同列的点抠掉,剩余的点则是可放可不放的,总方案数就是\(2^{\text{剩余点的个数}}\),乘以\((-1)^{|A|}\)并求和即可。这个做法直接优化显然不行。我们考虑设\(A\)中的点所在的列组成的不可重集......
  • AtCoder ABC 263 D 题解
    AtCoderABC263D题解前言本蒟蒻的第一篇题解,大佬勿喷QwQ传送门们洛谷传送门AtCoder传送门正文设有\(x\)使得\(x\leqk\)时,令\(f(k)\)为对\(A'\)进行运算后\(A'=(A_1,A_2,\ldots,A_k)\)的最小和。同理,对于\(y\)使得\(y\leqk\)时,令\(g(k)\)为对\(A......
  • AtCoder Beginner Contest 339 A-G
    A模拟即可voidsolve(){strings;cin>>s;for(inti=s.size()-1;i>=0;i--)if(s[i]=='.'){cout<<s.substr(i+1)<<endl;return;}}B模拟,可以让下标从0开始,这样......
  • AtCoder-ABC-Ex乱写
    ABC233ExManhattanChristmasTree先将\((x,y)\)变成\((x+y,x-y)\),也就是曼哈顿转切比雪夫,之后曼哈顿距离\(\lek\)的在切比雪夫坐标系下就是一个正方形。用主席树做矩形和,外层套一个二分即可,时间复杂度\(\mathcal{O}(n\log^2n)\)。ABC233Ex#include<bits/stdc++.h......
  • 我也要板刷 AtCoder!
    板刷AtCoderARCC![ARC171C]SwaponTreeProblem给定一棵\(n\)个节点的树,每个点有个权值\(a_i\),初始时\(a_i=i\)。你可以执行任意操作:选择一条边\((u,v)\),交换\(a_u\)和\(a_v\),并将这条边删掉。问通过上述操作,最后\((a_1,a_2,\cdots,a_n)\)有多少种不同的排列方......
  • AtCoder Beginner Contest 339
    AtCoderBeginnerContest339A-TLD签到B-Langton'sTakahashi发现步数和网格范围都不大,直接模拟即可C-PerfectBus题目的合法性在于不能为负数,那么初始人数就有了二分性。二分的找出初始的最小人数,然后跑一边即可#include<bits/stdc++.h>usingnamespacestd;#d......
  • Japan Registry Services (JPRS) Programming Contest 2024 (AtCoder Beginner Contes
    JapanRegistryServices(JPRS)ProgrammingContest2024(AtCoderBeginnerContest339)A-TLD代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__......
  • AtCoder Beginner Contest 339
    A找到最后一个点的位置,使用substr函数。B模拟,记得边界是循环的。C容易发现答案为:\[\min_p(\sum_{i=1}^{p}a_i)+\sum_{i=1}^{n}a_i\]D由于不同状态数只有\(60^4\),容易搜索,但是我去吃饭了,所以没能快速切掉。E有一个显然的dp,然后考虑每一个\(a_i\)可以转移到\(a_j\)......
  • 2019-2020 ICPC Northwestern European Regional Programming Contest (NWERC 2019)
    Preface由于前两天疑似感染风寒,今天头痛+鼻塞+咽炎一条龙,硬打了4h顶不住就下班了最后过了8个题也还行,比较可惜的就是H题从中期写到结束,祁神和徐神各写了一个version也没过A.AverageRank挺有意思的一个题考虑将一个原来分数为\(x\)的人加\(1\)分后会发生什么,显然只有原来分......
  • AtCoder Beginner Contest 330
    A-CountingPasses#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;usingi32=int32_t;usingpii=pair<int,int>;#definempmake_pairconstintinf=1e9;i32main(){intn,l;......