2021牛客暑期多校训练营7 K-xay loves sequence(主席树+二分)

K-xay loves sequence

首先不考虑模kkk的限制,容易想到对原数组做一个差分得到di=ai−ai−1d_i=a_i-a_{i-1}di=aiai1,显然对于∀1≤i≤nai=0\forall_{1\leq i\leq n} a_i=01inai=0 等价于∀1≤i≤ndi=0\forall_{1\leq i\leq n} d_i=01indi=0,而对于原数组的区间±1\pm1±1等价于在差分数组ddd中找到两个数一个数+1另一个数-1,或者说找到一个位置pos\text {pos}pos单独+1或者-1(这意味着原数组[apos→an]±1[a_{\text{pos}}\to a_n] \pm1[aposan]±1)。上面的最优解显然是max⁡{∑d+,∣∑d−∣}\max\{\sum d_+,|\sum{d_-}|\}max{d+,d}

上述变换有些麻烦,如果我们引入an+1=0a_{n+1}=0an+1=0,并且引入dn+1=an+1−and_{n+1}=a_{n+1}-a_ndn+1=an+1an后,对于原数组进行区间±1\pm1±1等价于在差分数组d1→n+1d_{1\to n+1}d1n+1选两个数一个+1另一个-1。并且不难发现无论怎么进行上述操作总有∑i=1n+1di=0\sum_{i=1}^{n+1} d_i=0i=1n+1di=0最优解max⁡{∑d+,∣∑d−∣}=∑i=1n+1∣di∣2\max\{\sum d_+,|\sum{d_-}|\}=\frac{\sum_{i=1}^{n+1} |d_i|}{2}max{d+,d}=2i=1n+1di


hipamp题解

考虑模kkk的意义下意味着我们可以花费0的代价使得某些ai±ka_i\pm kai±k,对应在差分数组上即是di±k,di+1∓kd_i\pm k,d_{i+1}\mp kdi±k,di+1k,换句话说现在可以让成对的di±k,dj∓kd_i\pm k,d_j\mp kdi±k,djk最终结果仍然是让∀1≤i≤ndi+1=0\forall_{1\leq i\leq n} d_{i+1}=01indi+1=0

不难发现di=di+kd_i=d_i+kdi=di+k那么一定有di<0d_i<0di<0,同理di=di−kd_i=d_i-kdi=dik那么一定有di≥0d_i\ge0di0

如果di=di+kd_i=d_i+kdi=di+k,那么贡献从∣di∣2→∣di+k∣2,Δ=k−2∣di∣2\frac{|d_i|}{2}\to\frac{|d_i+k|}{2},\Delta=\frac{k-2|d_i|}{2}2di2di+k,Δ=2k2di

如果di=di−kd_i=d_i-kdi=dik,那么贡献从∣di∣2→∣di−k∣2,Δ=k−2∣di∣2\frac{|d_i|}{2}\to\frac{|d_i-k|}{2},\Delta=\frac{k-2|d_i|}{2}2di2dik,Δ=2k2di

于是只需要把did_idi分为小于0的一组和大于0的一组,按照Δ=k−2∣di∣2\Delta=\frac{k-2|d_i|}{2}Δ=2k2di从小到大排序,每次取两数组中开头的两个(Δ+)+(Δ−)(\Delta_+)+(\Delta_-)(Δ+)+(Δ),如果能使答案变小即(Δ+)+(Δ−)<0(\Delta_+)+(\Delta_-)<0(Δ+)+(Δ)<0即一直取。


首先如果没有区间l,rl,rl,r的限制,每次询问只给一个kkk的话可以二分取了多少对d−+k,d+−kd_{-}+k,d_{+}-kd+k,d+k,快速的求出答案。显然加上区间限制只需要套一个主席树即可。

注意对于[l,r][l,r][l,r]区间来说差分数组是(al−0),dl+1,…dr,(0−ar)(a_l-0),d_{l+1},\dots d_{r},(0-a_r)(al0),dl+1,dr,(0ar),也就是主席树维护did_idi,然后每次询问会增添两个数(al−0)(a_l-0)(al0)(0−ar)(0-a_r)(0ar),一个插在正主席树,一个在负主席树。一个显然的想法是单点修改2次,然后询问过后删除,就如下面注释的代码。但是主席树不支持修改,因为修改不仅仅影响一棵主席树,而是会影响许多棵树,于是只需要在询问的时候带上这个数即可。

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=200010;
const int U=(1ll<<31)-1;
int a[N],d[N];
ll s[N];
int n,m;
struct node
{int l,r;ll v,ct;
}tree[N*100];
int rt[2][N],cnt;
void update(int l,int r,int pre,int &u,int v,int c)
{u=++cnt;tree[u]=tree[pre];tree[u].ct+=c;tree[u].v+=v*c;if(l==r) return;int mid=l+r>>1;if(v<=mid) update(l,mid,tree[pre].l,tree[u].l,v,c);elseupdate(mid+1,r,tree[pre].r,tree[u].r,v,c);
}
// void change(int &u,int l,int r,int v,int c)
// {
//     if(!u) u=++cnt;
//     tree[u].ct+=c;
//     tree[u].v+=v*c;
//     if(l==r) return;
//     int mid=l+r>>1;
//     if(v<=mid) 
//         change(tree[u].l,l,mid,v,c);
//     else
//         change(tree[u].r,mid+1,r,v,c);
// }
// // 求前k大的sum
// ll query(int l,int r,int L,int R,int k)
// {
//     if(!k) return 0ll;
//     if(l==r) return 1ll*k*l;
//     int mid=l+r>>1;
//     int tmp=tree[tree[R].r].ct-tree[tree[L].r].ct;
//     if(k<=tmp)  
//         return query(mid+1,r,tree[L].r,tree[R].r,k);
//     else 
//         return (1ll*tree[tree[R].r].v-tree[tree[L].r].v)+query(l,mid,tree[L].l,tree[R].l,k-tmp);
// }
// // 计算数组l~r的答案 取前k大
// ll calc(int l,int r,int k,int x)
// {
//     // a[l]+d[l+1]~d[r]+abs(0-a[r])//     ll v=(s[r]-s[l]+a[r]+a[l])/2;
//     ll s1=query(0,U,rt[0][l],rt[0][r],k);
//     ll s2=query(0,U,rt[1][l],rt[1][r],k);
//     return v-s1-s2+1ll*k*x;
// }
// 求前k大的sum
ll query(int l,int r,int L,int R,int k,int v)
{if(!k) return 0ll;if(l==r) return 1ll*k*l;int mid=l+r>>1;int tmp=tree[tree[R].r].ct-tree[tree[L].r].ct+(mid<v&&v<=r);if(k<=tmp)  return query(mid+1,r,tree[L].r,tree[R].r,k,v);else return (1ll*tree[tree[R].r].v-tree[tree[L].r].v)+(mid<v&&v<=r)*v+query(l,mid,tree[L].l,tree[R].l,k-tmp,v);
}
// 计算数组l~r的答案 取前k大
ll calc(int l,int r,int k,int x)
{// a[l]+d[l+1]~d[r]+abs(0-a[r])ll v=(s[r]-s[l]+a[r]+a[l])/2;ll s1=query(0,U,rt[0][l],rt[0][r],k,a[l]);ll s2=query(0,U,rt[1][l],rt[1][r],k,a[r]);return v-s1-s2+1ll*k*x;
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++) {a[i]=rd();d[i]=abs(a[i]-a[i-1]);s[i]=s[i-1]+d[i];if(a[i]>=a[i-1]) {update(0,U,rt[0][i-1],rt[0][i],d[i],1);rt[1][i]=rt[1][i-1];}else{update(0,U,rt[1][i-1],rt[1][i],d[i],1);rt[0][i]=rt[0][i-1];}}while(m--){int x=rd(),y=rd(),k=rd();// a[x] d[x+1] d[x+2]... d[y] abs(0-a[y])// change(rt[0][y],0,U,a[x],+1);// change(rt[1][y],0,U,a[y],+1);int l=0,r=min(tree[rt[0][y]].ct-tree[rt[0][x]].ct,tree[rt[1][y]].ct-tree[rt[1][x]].ct)+1;//cout<<l<<' '<<r<<'\n';while(l<r){int mid=l+r>>1;if(calc(x,y,mid,k)<=calc(x,y,mid+1,k)) r=mid;else l=mid+1;}printf("%lld\n",calc(x,y,l,k));// change(rt[0][y],0,U,a[x],-1);// change(rt[1][y],0,U,a[y],-1);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 搭配 Nginx 的真实IP问题

一.前言Nginx&#xff08;Engine X&#xff09;是一个高性能HTTP和反向代理服务&#xff0c;是由俄罗斯人伊戈尔赛索耶夫为访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。 如果…

不止代码:保留道路(ybtoj 最小生成树)

文章目录题目描述解析代码thanks for reading!题目描述 解析 其实就是修建道路 我一开始只能想到枚举g去跑最小生成树 是m^2的算法&#xff08;50pts&#xff09; 但是其实每次加入的边只有一条 而且之前都不在最小生成树上的边以后也肯定不会在 所以可以建一个新的边的集合存…

P7515-[省选联考 2021A卷]矩阵游戏【差分约束】

正题 题目链接:https://www.luogu.com.cn/problem/P7515 题目大意 有一个n∗mn*mn∗m的矩形AAA&#xff0c;然后给出一个(n−1)∗(m−1)(n-1)*(m-1)(n−1)∗(m−1)的矩形BBB满足 Bi,jAi,jAi1,jAi,j1Ai1,j1B_{i,j}A_{i,j}A_{i1,j}A_{i,j1}A_{i1,j1}Bi,j​Ai,j​Ai1,j​Ai,j1​…

牛客题霸 [链表中环的入口节点] C++题解/答案

牛客题霸 [链表中环的入口节点] C题解/答案 题目描述 对于一个给定的链表&#xff0c;返回环的入口节点&#xff0c;如果没有环&#xff0c;返回null 拓展&#xff1a; 你能给出不利用额外空间的解法么&#xff1f; 题解&#xff1a; 判断环有个很巧妙的方法&#xff0c;之…

2021牛客暑期多校训练营8 F-Robots(bitset优化dp)

F-Robots 第一种第二种机器人直接O(n)O(n)O(n)判断即可。 第三种机器人暴力dp&#xff0c;用bitset优化。 bitset<250005> b[i][j] 表示从(i,j)(i,j)(i,j)能到达哪些点&#xff0c;第三种机器人向右向下转移即可。 状态压缩&#xff01; 时间复杂度O(qnn4w)O(qn\frac{…

不止代码:路径数量(ybtoj-最小生成树)

文章目录题目描述解析代码题目描述 解析 乍一看&#xff1a;是个水题啊&#xff01; 显然如果途径存在强连通的点&#xff0c;路径就会变为正无穷 所以缩点加拓扑dp以及一些特判应该就可以解决了&#xff01; 一交&#xff1a;40分。。。 然后就开始拆东墙补西墙的debug。。。…

重磅!!!微软发布.NET Core 2.2

我们很高兴地宣布发布.NET Core 2.2。它包括对运行时的诊断改进&#xff0c;对ARM32 for Windows和Azure Active Directory for SQL Client的支持。此版本中最大的改进是在ASP.NET Core中。ASP.NET Core 2.2和Entity Framework Core 2.2。您可以在Windows&#xff0c;macOS和Li…

Loj#2769-「ROI 2017 Day 1」前往大都会【最短路树,斜率优化】

正题 题目链接:https://loj.ac/p/2769 题目大意 给出nnn个点mmm条地铁线路&#xff0c;每条线路是一条路径。 求111到nnn的最短路且在最短路径的情况下相邻换乘点的距离平方和最大。 1≤n,m,∑si≤1061\leq n,m,\sum s_i\leq 10^61≤n,m,∑si​≤106 解题思路 首先肯定是在…

牛客题霸 [两个链表生成相加链表] C++题解/答案

牛客题霸 [两个链表生成相加链表] C题解/答案 题目描述 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0c;请生成代表两个整数相加值的结果链表。 例如&#xff1a;链表 1 为 9->3->7&#xff0c;链…

2021牛客暑期多校训练营8 J-Tree(思维dp+rmq)

J-Tree Cosmic_Tree题解 赛时队友想到了预处理s→ts\to ts→t路径上的点最远到达的点&#xff0c;后面贪心做的一直wa。正解是dp。 下面的solve(l,r,op)\text{solve}(l,r,\text{op})solve(l,r,op)函数中&#xff0c;当lrlrlr时不满足题意不合法&#xff0c;当op0\text{op}0op…

[翻译] ASP.NET Core 2.2 正式版发布

本文为翻译&#xff0c;原文地址&#xff1a;https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-available-today/我&#xff08;文章作者&#xff09;很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供&#xff01;怎么获取它您可以从 .NET…

理解至上:数位dp(ybtoj-B数计数)

文章目录简要题目描述解析dp定义:试填法代码thanks for reading&#xff01;简要 数位dp&#xff0c;天下第一 最重要的应该有两个&#xff1a; 1.状态转移式的确定 2.试填法不断往后模拟 &#xff08;至今是唯一一道数位dp&#xff0c;究竟重要的是啥我其实也没有太多经验 &am…

P7408-[JOI 2021 Final]ダンジョン 3【贪心,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P7408 题目大意 一个有n1n1n1层的地牢&#xff0c;从iii到i1i1i1层要AiA_iAi​点能量&#xff0c;第iii层可以花费BiB_iBi​获得111点能量。 mmm次询问从SiS_iSi​层出发到第TiT_iTi​层在能量上限为UiU_iUi​的情况下至少需…

牛客题霸 [输出二叉树的右视图] C++题解/答案

牛客题霸 [输出二叉树的右视图] C题解/答案 题目描述 请根据二叉树的前序遍历&#xff0c;中序遍历恢复二叉树&#xff0c;并打印出二叉树的右视图 题解&#xff1b; 分两个过程&#xff1a; 先用前序遍历中序遍历恢复二叉树&#xff0c;这个应该都会。。 打印二叉树的后视…

2021“MINIEYE杯”中国大学生算法设计超级联赛(10)Pty loves string(Border+二维数点)

Pty loves string 建立Border树后&#xff0c;发现可以转化成两个子树中相同点的数量&#xff0c;时间戳转化为连续的区间后相当于有两个数组&#xff0c;每次给两个区间&#xff0c;问区间相同点权的数目。 第一个数组作为区间&#xff0c;第二个数组作为权值。将第一个数组建…

微软推出了Cloud Native Application Bundles和开源ONNX Runtime

微软的Microsoft Connect(); 2018年的开发者大会 对Azure和IoT Edge服务进行了大量更新; Windows Presentation Foundation&#xff0c;Windows Forms和Windows UI XAML Library的开源 以及.NET 基金会会员模型的扩展。但那些只是冰山一角。微软还联合Docker发布了Cloud Native…

不止代码:友好城市(动态规划)

解析 先按左端点排序得到一个右端点的新队列&#xff0c;然后就可以发现&#xff1a; 所有合法的方案都是新队列的一个单调递增队列 然后就转化成了最长上升序列的问题 代码 #include<bits/stdc.h> using namespace std; const int N1e6100; int m,n; struct node{int…

二分图匹配(一)

文章目录什么是二分图&#xff1a;例题&#xff1a;NC111768 CF741C题目描述&#xff1a;题解&#xff1a;代码&#xff1a;二分图最大匹配匈牙利算法算法思想&#xff1a;代码&#xff1a;Knig定理二分图最优匹配KM(Kuhn-Munkres)算法算法思路&#xff1a;具体操作代码&#x…

P3980-[NOI2008]志愿者招募【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P3980 题目大意 nnn天&#xff0c;第iii天需要AiA_iAi​个志愿者。有mmm种志愿者&#xff0c;第iii种从sis_isi​天服务到tit_iti​天&#xff0c;需要cic_ici​元的费用。 求满足条件的最小费用 1≤n≤1000,1≤m≤100001\le…

不止代码:恐狼后卫(ybtoj-区间dp)

文章目录题目描述解析代码thanks for reading!题目描述 一代炉石的眼泪啊 解析 用dp[i][j]表示i与j之间的全部消掉&#xff08;不含两端&#xff09;的最小花费 然后枚举中间最后杀死的狼就行了 本题没有一次AC&#xff0c;因为一开始dp定义成了包含两端&#xff0c;然后因为…