UOJ#749-[UNR #6]稳健型选手【贪心,分治,主席树】

正题

题目链接:https://uoj.ac/problem/749


题目大意

如果有序列aaa,你每次取走一个数字后然后这个序列最前面的数字会被别人取走,直到序列为空。此时f(a)f(a)f(a)表示你最大能取走的权值和。

给出一个长度为nnn的序列aaaqqq次询问区间[l,r][l,r][l,r],求f(al∼r)f(a_{l\sim r})f(alr)

1≤n,q≤2×105,1≤ai≤1091\leq n,q\leq 2\times 10^5,1\leq a_i\leq 10^91n,q2×105,1ai109


解题思路

考虑一下最优的取法,我们的限制其实相当于前2i−12i-12i1个数之中不能取走超过iii个数。

一个暴力的贪心想法是不停往前走,用一个堆维护现在取了的数,走到不是2i−12i-12i1时我们考虑是否拿这个aia_iai替代堆里最小的数,走到2i−12i-12i1时直接丢进堆里就行了。

或者反过来更简单,走到一个数就丢进堆里,遇到2i−12i-12i1时直接取堆中最大的数就好了。

我们现在能处理左或右端点固定的所有答案了,我们考虑分治,问题在于怎么去合并两个区间的答案。

为了防止大量的分类讨论,对于长度为奇数的区间询问,我们可以考虑去掉区间的末尾,因为这个位置肯定会取到。

然后我们考虑怎么合并区间,显然是前面一些选了的数字变成不选,后面一些不选的数字变成选了,显然是前面拿小的,后面拿大的。

我们考虑在分治的时候对于区间[L,mid,R][L,mid,R][L,mid,R],对于[L,mid][L,mid][L,mid]部分,我们用主席树维护选了的数字,对于[mid+1,R][mid+1,R][mid+1,R]部分,我们用主席树维护没选的数字,然后对于一个询问,二分一个kkk,然后左边的取出前kkk小,右边的取出前kkk大进行比较即可。

时间复杂度:O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=2e5+10,M=N<<5;
ll n,m,cnt,a[N],b[N],l[N],r[N],ans[N],s[N],rt[N];
priority_queue<ll> q;
struct SegTree{ll cnt,w[M],c[M],ls[M],rs[M];ll Change(ll x,ll L,ll R,ll pos,ll val){ll p=++cnt;w[p]=w[x]+val;c[p]=c[x]+val*b[pos];if(L==R)return p;ll mid=(L+R)>>1;if(pos<=mid)ls[p]=Change(ls[x],L,mid,pos,val),rs[p]=rs[x];else rs[p]=Change(rs[x],mid+1,R,pos,val),ls[p]=ls[x];return p;}ll Find(ll x,ll L,ll R,ll k){if(L==R)return L;ll mid=(L+R)>>1;if(w[ls[x]]>=k)return Find(ls[x],L,mid,k);return Find(rs[x],mid+1,R,k-w[ls[x]]);}ll Ask(ll x,ll L,ll R,ll k){if(!k)return 0;if(L==R)return b[L]*k;ll mid=(L+R)>>1;if(w[ls[x]]>=k)return Ask(ls[x],L,mid,k);return Ask(rs[x],mid+1,R,k-w[ls[x]])+c[ls[x]];}
}T;
bool cmp(ll x,ll y){return l[x]<l[y];}
void solve(ll L,ll R,vector<ll> &now){if(L==R)return;ll mid=(L+R)>>1;vector<ll> pl,pr,p;for(ll i=0;i<now.size();i++)if(l[now[i]]<=mid&&r[now[i]]>mid)p.push_back(now[i]);else if(l[now[i]]<=mid)pl.push_back(now[i]);else pr.push_back(now[i]);solve(L,mid,pl);solve(mid+1,R,pr);if(!p.size())return;for(ll g=0;g<2;g++){T.cnt=rt[mid]=s[mid]=0;for(ll i=mid+1;i<=R;i++){if(((i-mid)&1)==g)q.push(-a[i]),s[i]=s[i-1]+b[a[i]],rt[i]=rt[i-1];else{if(q.size()&&a[i]>-q.top()){s[i]=s[i-1]-b[-q.top()]+b[a[i]];rt[i]=T.Change(rt[i-1],1,cnt,-q.top(),1);q.pop();q.push(-a[i]);}else rt[i]=T.Change(rt[i-1],1,cnt,a[i],1),s[i]=s[i-1];}}while(!q.empty())q.pop();for(ll i=mid;i>=L;i--){q.push(a[i]);if(((mid-i)&1)==g){rt[i]=T.Change((i==mid)?0:rt[i+1],1,cnt,q.top(),1);s[i]=((i!=mid)?s[i+1]:0)+b[q.top()];q.pop();}else if(i!=mid)rt[i]=rt[i+1],s[i]=s[i+1];}while(!q.empty())q.pop();for(ll i=0;i<p.size();i++){if(((mid-l[p[i]])&1)!=g)continue;ll X=T.w[rt[l[p[i]]]],Y=T.w[rt[r[p[i]]]];ll _l=1,_r=min(X,Y);if(p[i]==2)i++,i--;while(_l<=_r){ll _mid=(_l+_r)>>1;if(T.Find(rt[l[p[i]]],1,cnt,_mid)<T.Find(rt[r[p[i]]],1,cnt,Y-_mid+1))_l=_mid+1;else _r=_mid-1;}ans[p[i]]+=s[l[p[i]]]-T.Ask(rt[l[p[i]]],1,cnt,_r);ans[p[i]]+=s[r[p[i]]]+T.Ask(rt[r[p[i]]],1,cnt,Y)-T.Ask(rt[r[p[i]]],1,cnt,Y-_r);}}return;
}
signed main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]),b[i]=a[i];sort(b+1,b+1+n);cnt=unique(b+1,b+1+n)-b-1;for(ll i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;vector<ll> v;for(ll i=1;i<=m;i++){scanf("%lld%lld",&l[i],&r[i]);v.push_back(i);if((r[i]-l[i]+1)&1)ans[i]+=b[a[r[i]]],r[i]--;}sort(v.begin(),v.end());solve(1,n,v);for(ll i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0;
}

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

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

相关文章

A. And Then There Were K

A. And Then There Were K 题意&#xff1a; 给你一个n&#xff0c;让你求一个k&#xff0c;使得满足下列式子&#xff1a; n & (n-1) & (n-2) &…&(k) 0 问k最小是多少&#xff1f; 题解&#xff1a; 找规律 比如n的二进制为&#xff1a;1111 那么n-1就是…

一键发布部署vs插件[AntDeploy],让net开发者更幸福

一键发布工具(ant deploy tool)插件下载地址&#xff1a;https://marketplace.visualstudio.com/items?itemNamenainaigu.AntDeploy1.iis一键发布自动部署 (iis deploy support)支持netcore 和 netframework发布 (支持mvc webapi)支持website自动创建ps:需要在windows 服务器上…

数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

普通的下标线段树Count ColorHotelTransformationTree Generator™Count Color POJ2777 查询区间内颜色种类数&#xff0c;观察到颜色种类数只有30&#xff0c;完全可以状压成整型存储&#xff0c;没有必要开30棵线段树 区间内有这颜色就置为111&#xff0c;没有这个颜色就是…

计算几何全家桶

文章目录前言精度点/向量相关表示向量基本运算角度相关向量夹角旋转直线/线段相关表示点与线求点到直线垂足求点关于直线的对称点点与直线的位置关系点与直线的距离线与线直线与直线的位置关系共线与垂直判断线段与线段是否相交求直线与直线的交点角平分线中垂线多边形表示求多…

uoj#750-[UNR #6]小火车【二分,折半,鸽笼原理】

正题 题目链接:https://uoj.ac/problem/750 题目大意 给出nnn个数字和一个ppp&#xff0c;保证2n>p2^n> p2n>p。现在要求一个序列www满足wi∈[−1,1]w_i\in[-1,1]wi​∈[−1,1]&#xff0c;使得∑i1nwiai≡0(modp)\sum_{i1}^nw_ia_i\equiv 0\pmod p∑i1n​wi​ai​≡…

Sequence Pair Weight

Sequence Pair Weight 题意&#xff1a; 一个数组a&#xff0c;其中两个一样的数的贡献为1&#xff0c;问这个数组的所有子串的贡献和是多少? 题解&#xff1a; 举例&#xff1a; 对于[1&#xff0c;2&#xff0c;1&#xff0c;2&#xff0c;1&#xff0c;1&#xff0c;4]…

什么是量子计算机?用一个简单例子来解释

译者&#xff1a;王亮 作者&#xff1a;YK Sugi 原文&#xff1a;http://t.cn/EZAElk0Hi&#xff0c;大家好&#xff01;不久前&#xff0c;我参观了加拿大温哥华的D-Wave Systems公司&#xff0c;这是一家制造前沿量子计算机的公司。我在那里学到了很多关于量子计算机的知识&a…

CodeForces616:Educational Round 5

文章目录前言A Comparing Two Long Integers\text{A Comparing Two Long Integers}A Comparing Two Long IntegersDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeB Dinner with Emma\text{B Dinner with Emma}B Dinner with Emm…

CF1534F2-Falling Sand (Hard Version)

正题 题目链接:https://www.luogu.com.cn/problem/CF1534F2 题目大意 有一个n∗mn*mn∗m个网格&#xff0c;有的网格上有沙子&#xff0c;一个沙子被刷新后会下落到底并且刷新沿途中四周四连通的沙子&#xff0c;你可以选择一些沙子手动刷新。 现在要求第iii列至少有aia_iai…

数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

值域线段树势能线段树扫描线KiKis K-NumberballThe Child and Sequence「雅礼集训 2017 Day1」市场AtlantisKiKi’s K-Number HDU-2852 权值线段树维护插入删除很简单 对于查询大于xxx的第kkk个&#xff0c;可以不用二分&#xff0c;转化一下 先查小于等于xxx的个数cntcntc…

Codeforces Round #721 (Div. 2)

Codeforces Round #721 (Div. 2) 题号题目难度知识点AAnd Then There Were KBPalindrome Game (easy version)CPalindrome Game (hard version)DSequence Pair WeightEMEX TreeFPartition Game

解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题

点击上方蓝字关注“汪宇杰博客”最近我遭遇了一个奇怪的问题。使用Azure DevOps配置CI/CD管线&#xff0c;自动部署到Azure App Service以后&#xff0c;.NET Core的网站竟然会启动失败。我们来看看如何解决这个问题。查找问题首先&#xff0c;幸好&#xff0c;这是个staging环…

CF1286E-Fedya the Potter Strikes Back【KMP,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/CF1286E 题目大意 定义一个字符串sss的权值为对于每个sL∼Rs1∼R−L1s_{L\sim R}s_{1\sim R-L1}sL∼R​s1∼R−L1​的区间&#xff0c;会产生min⁡iLRwi\min_{iL}^Rw_iminiLR​wi​的贡献。 现在开始时sss为空串&#xff0c…

模板:二维凸包(计算几何)

所谓凸包&#xff0c;就是一个凸出来的包 &#xff08;逃&#xff09; 前言 计算集合的第一课。 关键特征&#xff1a;周长最小。此时一定是凸包。 解析 定义 凸包&#xff1a;在平面上能包含所有给定点的最小凸多边形叫做凸包。 性质&#xff1a;凸包的周长是所有能包含给…

[AtCoder Beginner Contest 215] A-G题解

文章目录A - Your First JudgeB - log2(N)C - One More aab aba baaD - Coprime 2E - Chain ContestantF - Dist Max 2G - Colorful Candies 2atcoder题目链接 A - Your First Judge 签到题 #include <cstdio> #include <iostream> using namespace std; string…

Acwing 135 最大子序和

Acwing 135 最大子序和 题目&#xff1a; 输入一个长度为 n 的整数序列&#xff0c;从中找出一段长度不超过 m 的连续子序列&#xff0c;使得子序列中所有数的和最大。 题解&#xff1a; 我们把这个问题的集合分成n份&#xff0c;第k份表示以A[k]结尾的最大连续子序列是多少…

.net core自定义高性能的Web API服务网关

网关对于服务起到一个统一控制处理的作用&#xff0c;也便于客户端更好的调用&#xff1b;通过网关可以灵活地控制服务应用接口负载&#xff0c;故障迁移&#xff0c;安全控制&#xff0c;监控跟踪和日志处理等。由于网关在性能和可靠性上都要求非常严格&#xff0c;所以针对业…

微软宣布 Visual Studio 2019 将于4月2日正式发布

微软于去年发布了 Visual Studio 2019 预览版。今天&#xff0c;该公司宣布 Visual Studio 2019 正式版将于4月2日发布。微软在公告中表示&#xff1a;“欢迎加入我们在4月2号当天举办的 VS 2019 线上发布活动&#xff0c;这是一款更加现代化、创新且实用的生产力工具”。据悉&…

CF1427F-Boring Card Game【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1427F 题目大意 有一个1∼6n1\sim 6n1∼6n的序列&#xff0c;两个人轮流操作&#xff0c;每次取走连续的三个数字。 现在给出先手取走的数字集合&#xff0c;要求构造方案。 保证有解 1≤n≤2001\leq n\leq 2001≤n≤200…

模板:旋转卡壳(计算几何)

所谓旋转卡壳&#xff0c;就是旋转起来的卡壳 &#xff08;逃&#xff09; 前言 前置知识&#xff1a;凸包 个人感觉很像 two-pointers 算法。 能够在优秀的线性时间复杂度内完成总多求最值&#xff08;周长、面积…&#xff09;的神奇操作。 解析 给出情境&#xff1a; 给…