【BZOJ4826】【HNOI2017】影魔】的更多相关文章

影魔 bzoj-4826 Hnoi-2017 题目大意:给定一个$n$个数的序列$a$,求满足一下情况的点对个数: 注释:$1\le n,m\le 2\cdot 10^5$,$1\le p1,p2\le 1000$. 想法: 我们先用单调栈求出一个数左边第一个比它大的,和右边第一个比它大的.$l_i$和$r_i$就表示这两个值. 然后我们发现,$(l_i,r_i)$就是一个合法的第一个条件的点对. 接下来我们考虑如何统计第二个条件的点对. 第二个条件的话如果还想用刚才的值表示的话,我们发现就是在…
4826: [Hnoi2017]影魔 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 669  Solved: 384[Submit][Status][Discuss] Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己的战斗力,而影魔,靠 这些战斗力提升自己的攻击.奈文摩尔有 n 个…
Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击.奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n.第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对 i,j(i<j)来说,若不存在 k[s](i<s<j)大于 k[i…
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j 位置的数是区间[i,j]的最大值和次大值 提供p2的攻击力:i,j位置的数有一个是区间[i,j]的最大值,另一个不是次大值 记录L[i].R[i] 分别表示i左右第一个大于k[i]的位置 p1的贡献: 1.点对(L[i],R[i])    2.点对(i,i+1) p2的贡献: 1.点对(L[i],…
题目链接 BZOJ4826 题解 蒟蒻智力水平捉急orz 我们会发现相邻的\(i\)和\(j\)贡献一定是\(p1\),可以很快算出来[然而我一开始忘了考虑调了半天] 我们现在只考虑不相邻的 我们只需要找出所有产生贡献的\(i,j\)即可 我们发现每一个产生贡献的\(i,j\)都能对应到一个三元组\((i,k,j)\),分别对应区间的最大值,次大值,第三大值 我们枚举中间位置\(i\),找到\(i\)左边第一个比\(i\)大的位置\(L[i]\),右边第一个比\(i\)大的位置\(R[i]\)…
链接 题意:给你 \(1\) 到 \(n\) 的排列 \(k_1,k_2,\dots,k_n\) ,对 \(i,j (i<j)\)来说,若不存在 \(k_s (i<s<j)\) 大于 \(k_i\) 或者 \(k_j\),则会产生 \(p_1\) 的贡献.另一种情况,令 \(c\) 为 \(k_{i + 1}, k_{i + 2}, \cdots, k_{j -1}\) 的最大值,若 \(c\) 满足:\(k_i < c < k_j\),或者 \(k_j < c <…
题面 因为是一个排列,所以不会有重复的.如果有重复就没法做了.一开始没有仔细看题目想了半天. 发现,如果是第一种情况,那么边界\(l\)和\(r\)就应该分别是整个区间的最大值和次大值. 然后,对于那第二种情况, \(l\)和\(r\)中,只有一个数是最大值,另一个数不可以是最大值和次大值. 于是我们考虑从每一个合法区间内数里面选出一个代表来可以直接代表整个区间. 用单调栈维护一下\(lp[i]\)和\(rp[i]\)分别表示一个数左边和右边离\(i\)最近的大于之的数. 然后对于第一种情况,发…
[BZOJ4826][Hnoi2017]影魔 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击.奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n.第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对 i,j(i<j)来说,若不存…
4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间贡献p2. 多组询问一个区间的贡献和. 感觉和去年的题挺像的...然后\(O(n\sqrt{n}logn)\)莫队被卡成暴力...那个log还是主席树log... 并且调试时间比正解还长,不能更弱了 一个点对只有唯一的最大值\(p\) 可以按照\(p\)来分类统计 单调栈预处理\(l_i, r_i\)第一…
4826: [Hnoi2017]影魔 https://lydsy.com/JudgeOnline/problem.php?id=4826 分析: 莫队+单调栈+st表. 考虑如何O(1)加入一个点,删除一个点,类似bzoj4540.然后就可以莫队了.复杂度$O(n\sqrt n)$ 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<…
[LG3722][HNOI2017]影魔 题面 洛谷 题解 先使用单调栈求出\(i\)左边第一个比\(i\)大的位置\(lp_i\),和右边第一个比\(i\)大的位置\(rp_i\). 考虑\(i\)对答案的贡献,当且仅当\(i\)作为区间\([x+1,y-1]\)的最大值时,\(i\)才对点对\((x,y)\)有贡献. 根据题意,第一种情况\(i\)产生贡献的点对是\((lp_i,rp_i)\), 第二种情况\(i\)产生贡献的点对是\((l[i],i+1\) to \(r[i]-1)\)和\…
题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击.奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n.第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对 i,j(i<j)来说,若不存在 k[s](i<s<j)大于 k[i]或者 k[j…
Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击.奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n.第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对 i,j(i<j)来说,若不存在 k[s](i<s<j)大于 k[i…
题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂. 事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人. 牧师. 帝王. 乞丐. 奴隶. 罪人,当然,还有英雄. 题目描述 每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击. 奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n.第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对 i, j(i<j)来说,若不存在 ks大 于 k[i]或者…
影魔 这么简单的方法尽然想不到,我是真的菜 对每个点,用单调栈的方式处理出他左右第一个比他大的数的位置,你可以把\(0\)和\(n+1\)设成\(inf\). 显然对于每对\(lef[i]\)和\(rig[i]\)都会做出\(p1\)的贡献 每个\(lef[i]\)会对\(i+1\)到\(rig[i]-1\)做出\(p2\)贡献 同理,每个\(rig[i]\)都会给\(lef[i]+1\)到\(i-1\)做出\(p2\)贡献 用结构体存下来,按顺序用线段树将贡献加入即可 统计贡献,对于每个询问\…
Portal --> bzoj4826 Solution 为什么莫名读了很长时间的题...== 逐渐不会语文qwq 貌似这题的做法很多,丢上来的话是因为..这个化简条件的过程莫名爽哈哈哈哈哈 注意到因为\(k\)是一个排列,所以不存在等于的情况,那么其实把两个条件都化简一下(其实也不是化简就是用简单一点的语言写出来)就是: 对于一个点对\((i,j)\)(\(i<j\)),我们用\(mx\)表示\(k[i+1]...k[j-1]\)的最大值,那么如果满足\(mx<k[i]\)&&…
Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己的战斗力,而影魔,靠 这些战斗力提升自己的攻击.奈文摩尔有 n 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 1 到 n. 第 i个灵魂的战斗力为 k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对 i,j(i<j)来说,若不存在 k[s](i <s<j)大于…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4826 题解: 主席树,单调栈 以前还没做过这种维护信息的题,感觉好奇妙. 每对相邻的两个数所贡献的 P1 就直接在最后加入答案就好了,以下是处理存在 s (i<s<j)的情况. 首先用单调栈维护出 L[i], R[i]分别表示 i 点左边和右边第一个值大于 K[i]的位置.然后不难发现,如果对应的 L[i] 或 R[i] 存在于 K 数组中,那么点对 (L[i],R[i]) 可以贡献一个…
嘟嘟嘟 这题真的挺神的,我是真没想出来. 洛谷的第一篇题解说的非常妙,实在是佩服. 就是我们首先预处理出对于第\(i\)个数,在\(i\)左边比第一个比\(i\)大的数\(l_i\),在\(i\)右边第一个比\(i\)大的数\(r_i\). 这个可以用单调栈扫两边分别求出来. 然后我们考虑位于\([l_i, r_i]\)中的所有数产生的贡献: 1.\(l_i\)和\(r_i\)单独产生\(p1\)的贡献. 2.位于\([l_i + 1, i - 1]\)的数都和\(r_i\)产生\(p2\)的贡…
传送门 我太弱了,只会乱搞,正解是不可能正解的,这辈子不可能写正解的,太蠢了又想不出什么东西,就是乱搞这种东西,才能维持得了做题这样子 考虑将询问离线,按右端点排序,并且预处理出每个位置往前面第一个大于这个数的位置,记为\(fa_i\) 如果加入一个右端点\(i\),那么可以加上贡献的左端点有以下三类 在区间\([fa_i,i)\)中,从\(i-1\)开始一直跳\(fa\),能到达的位置加上p1 在区间\([fa_i,i)\)中,从\(i-1\)开始一直跳\(fa\),不能到达的位置加上p2 在…
BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻的体会到什么叫写bug...比着一个数据调,调对了询问\([1,5]\)又要调询问\([2,7]\),调过了\([2,7]\)发现\([1,5]\)又不对...(如此循环*n次) 莫队 前缀和 单调栈:(非正解,不开O2 70分,开O2以及BZOJ算总时限可以A) 可以先做一下HNOI2016 序列…
题意 题目链接 Sol 题解好神仙啊qwq. 一般看到这种考虑最大值的贡献的题目不难想到单调数据结构 对于本题而言,我们可以预处理出每个位置左边第一个比他大的位置\(l_i\)以及右边第一个比他大的位置\(r_i\) 那么\((l_i, r_i)\)会产生\(p1\)的贡献 \([l_i + 1, i - 1]\)和\(r_i\)会产生\(p2\)的贡献 \([i + 1, r_i - 1]\)和\(l_i\)会产生\(p2\)的贡献 这样我们直接上区间加线段树就能统计到每个点的贡献了. 然后统…
https://www.lydsy.com/JudgeOnline/problem.php?id=4826 年少不知空间贵,相顾mle空流泪. 和上一道主席树求的东西差不多,求两种对 1. max(a[(i,j)])<min(a[i],a[j]),[i,j]这一对贡献p1. 2. max(a[(i,j)])在a[i],a[j]之间,[i,j]这一对贡献p2. 第一种和bzoj3956那道一样,但是因为是排列所以没必要去重了. 第二种同样是单调栈求lp,rp,每个位置的lp分别和[ i+1 , r…
题意: 给定 \(n\) 个数的排列,\(m\) 次询问,每次询问询问一个区间内所有子区间的贡献. 每个区间如果两个端点分别是最大值和次大值,我们就算 \(P1\) 的贡献. 如果两个端点一个是最大值,一个不是次大值,我们就算 \(P2\) 的贡献. \(\text{Solution:}\) 将询问离线,处理出以 \(i\) 结尾的询问的答案. 考虑怎样的点 \(j(j<i)\) 满足它能与 \(i\) 组成区间 \(i\) ,\(j\) 分别是最大值与次大值或非次大值. 钦定 \(a[i]\)…
4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 #define ll long long #define maxtree maxn*30 class PTreeType { private: ],root[maxn],tot,head[maxn],li[maxn<<],ri[maxn<<],E[maxn<<],cnt,…
首先用单调栈和扫描线处理出每一个数左面最近的比他大的数在$l[i]$,右面最近的比他大的数$r[i]$. 然后就可以考虑每种贡献是在什么时候产生的. 1.$(l[i],r[i])$产生$p1$的贡献 2.$([l[i]]-[i-1],i)$产生$p2$的贡献 3.$(i,[i+1]-[r[i]])$产生$p2$的贡献. 然后发现在笛卡尔坐标系中是一些线段和点,然后平行与扫描线的比较好解决. 但是垂直的就比较麻烦了. 然后有人用六棵主席树做过去了,也有人用四棵. 其实只要线段树分两次扫一遍就好了.…
参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/lcf-2000/p/5866170.html#3830447 枚举最大值a[i],找到l[i],r[i]是左边最后一个比它大的和右边第一个比它大的,考虑贡献: p1:每次询问要先加上(r-l)*p1是点对相邻,然后对r[i]有p1贡献的左端点是l[i] p2:对l[i]有贡献的是(i+1,r[i]…
设\(l[i]\)为i左边第一个比i大的数的下标.\(r[i]\)为i右边第一个比i大的数的下标. 我们把\(p1,p2\)分开考虑. 当产生贡献为\(p1\)时\(i\)和\(j\)一定满足,分别为\(l[x],r[x]\)枚举每一个值为\(i\),\(j\)之间最大值可证. 党产生贡献为\(p2\)时\(i\)和\(j\)满足分别为\(l[x],[x+1,r[x]-1]\)或\([l[x]+1,x-1],r[x]\),此时\(a[x]\)为\(i\),\(j\)之间最大值,\(i\),\(j…
#include<bits/stdc++.h> #define maxn 200010 using namespace std; int a[maxn],st[maxn][2],top,L[maxn],R[maxn],root[2][maxn]; struct node{int x,y;}A[maxn]; struct Node{int x,yl,yr;}B[maxn<<1]; long long num; bool cmp1(node p,node q){return p.x&l…
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l,r]\) 产生 \(p_2\) 的贡献当且仅当 \(a_l\) 为区间 \([l,r]\) 的最大值且 \(a_r\) 不是区间 \([l,r]\) 的次大值,或者 \(a_r\) 为区间 \([l,r]\) 的最大值且 \(a_l\) 不是区间 \([l,r]\) 的次大值. 我们考虑转化贡献体…