CF-Technocup3 D Optimal Subsequences
D Optimal Subsequences
http://codeforces.com/contest/1227/problem/D2
显然,每次求的k一定是这个序列从大到小排序后前k大的元素。
考虑如何做才能使其字典序最小。我们设p为第k大的元素。
首先,这k个数是确定的。
其次,对于比p大的所有元素,他们是必须选的。
所以,欲使这个序列字典序最小,其实就是让所有p出现的位置
尽量靠前。
那做法就很显然了:先离散化,搞出来一个相对排名,用主席树
维护相对排名。每次查询,二分答案,check就查一下root[1]到
root[mid]中权值排名大于p的排名+min(p的上限个数,root[1]
到root[mid]中p的出现次数)和pos的关系就好。
其实离线搞更方便一些,也不用可持久化。。
上代码
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define F(x,y,z) for(re x=y;x<=z;x++)
#define FOR(x,y,z) for(re x=y;x>=z;x--)
typedef long long ll;
#define I inline void
#define IN inline int
I read(int &res){
res=0;re g=1;register char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')g=-1;
ch=getchar();
}
while(isdigit(ch)){
res=(res<<3)+(res<<1)+(ch^48);
ch=getchar();
}
res*=g;
}
struct P{
int w,id,v;
friend bool operator < (P x,P y){
return x.w>y.w;
}
}p[202000];
struct Tree{
int lc,rc,w;
}t[6060000];
#define L t[k].lc
#define R t[k].rc
int n,m,tot,X,Y,sum,pos,lim,a[202000],b[202000],f[202000],len[202000],root[202000];
I modi(int &k,int k1,int l,int r,int x){
k=++tot;
L=t[k1].lc;R=t[k1].rc;t[k].w=t[k1].w;
if(l==r){
t[k].w++;
return;
}
re mid=(l+r)>>1;
if(x<=mid)modi(L,t[k1].lc,l,mid,x);
else modi(R,t[k1].rc,mid+1,r,x);
t[k].w=t[L].w+t[R].w;
}
IN ques(int k,int l,int r,int x,int y){
if(x>r||y<l)return 0;
if(x<=l&&r<=y)return t[k].w;
re mid=(l+r)>>1;
return ques(L,l,mid,x,y)+ques(R,mid+1,r,x,y);
}
IN divided(int x,int y){
if(x==y)return x;
re mid=(x+y)>>1;
//cout<<ques(root[mid],1,sum,1,pos)<<"!"<<endl;
if(ques(root[mid],1,sum,1,pos-1)+min(ques(root[mid],1,sum,pos,pos),lim)>=Y)y=mid;
else x=mid+1;
return divided(x,y);
}
int main(){
read(n);
F(i,1,n){
read(a[i]);
p[i].w=a[i];
p[i].id=i;
}
sort(p+1,p+1+n);
m=0;
p[0].w=p[1].w+1;
f[0]=0;
F(i,1,n){
if(p[i].w!=p[i-1].w)m++,f[m]=i;
b[p[i].id]=m;
p[i].v=m;
}
tot=0;
sum=m;
//cout<<sum<<endl;
F(i,1,n){
modi(root[i],root[i-1],1,sum,b[i]);
}
read(m);
while(m--){
read(X);read(Y);
pos=p[X].v;lim=X-f[pos]+1;
//cout<<pos<<" ";
int P=divided(1,n);
//cout<<P<<" ";
cout<<a[P]<<endl;
}
return 0;
}
CF-Technocup3 D Optimal Subsequences的更多相关文章
- Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) D2. Optimal Subsequences (Hard Version) 数据结构 贪心
D2. Optimal Subsequences (Hard Version) This is the harder version of the problem. In this version, ...
- CF 689D - Friends and Subsequences
689D - Friends and Subsequences 题意: 大致跟之前题目一样,用ST表维护a[]区间max,b[]区间min,找出多少对(l,r)使得maxa(l,r) == minb( ...
- CF 314C Sereja and Subsequences(树状数组)
题目链接:http://codeforces.com/problemset/problem/314/C 题意:给定一个数列a.(1)写出a的不同的所有非下降子列:(2)定义某个子列的f值为数列中各个数 ...
- CF1227D Optimal Subsequences
思路: 首先对于单个查询(k, p)来说,答案一定是a数组中的前k大数.如果第k大的数字有多个怎么办?取索引最小的若干个.所以我们只需对a数组按照值降序,索引升序排序即可. 多个查询怎么办?离线处理. ...
- Codeforces 1262D Optimal Subsequences(BIT+二分)
首先比较容易想到肯定是前k大的元素,那么我们可以先对其进行sort,如果数值一样返回下标小的(见题意),接下里处理的时候我们发现需要将一个元素下标插入到有序序列并且需要访问第几个元素是什么,那么我们可 ...
- Optimal Subsequences(主席树)
题意: 给定一个序列,长度为n(<=2e5),有m(<=2e5)个询问,每个询问包含k和pos,要从原序列中选出一个长度为k的子序列,要求是这个序列的和是所有长度为k的序列中最大的,且是字 ...
- D2. Optimal Subsequences (Hard Version) 主席树
题目链接:https://codeforces.com/contest/1262/problem/D2 将数组按大到小排序(相同大小的按下标由小到大排序),依次将排序后的每个数在原数组中的位置放入主席 ...
- Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) - D2. Optimal Subsequences (Hard Version)(主席树)
题意:一共有$n$个数,$m$次询问,每次询问包括$k.pos$两个数,需要你从这$n$个数里面找出$k$个数,使得他们的总和最大,如果有多种情况,找出序号字典序最小的一组,然后输出这个序列中第$po ...
- codeforces 1262D Optimal Subsequences 主席树询问第k小
题意 给定长度为\(n\)的序列\(a\),以及m个询问\(<k,pos>\),每次询问满足下列条件的子序列中第\(pos\)位的值为多少. 子序列长度为\(k\) 序列和是所有长度为\( ...
随机推荐
- HTML页面 js返回上一页
<input type="button" name="Submit" onclick="javascript:history.back(-1); ...
- How to Start Up an Open Source Company
https://evolveum.com/start-open-source-company/ Evolveum is a successful open source company now. We ...
- [Codeforces 1242B]0-1 MST
Description 题库链接 给你一张 \(n\) 个点的完全图,其中有 \(m\) 条边长度为 \(1\),其余全为 \(0\).问你这张图的最小生成树为多少. \(1\leq n\leq 10 ...
- Ajax的个人总结
Ajax Ajax是Asynchronous Javascript And XML(异步JavaScript和XML)的缩写. Ajax技术描述了使用脚本操纵HTTP和Web服务器进行数据交换,在页面 ...
- SpringCloud微服务
SpringCloud SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.负载均衡.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行 ...
- [Dart] Mixin
Docs Mixins are a way of reusing a class’s code in multiple class hierarchies. void main() { Animal ...
- know thself
- 3-微信小程序开发(小程序的目录结构说明)
https://www.cnblogs.com/yangfengwu/p/10050784.html 源码下载链接: 或者 这节先说一下小程序的目录结构 自行根据 https://www.cnblo ...
- HAVING 搜索条件在进行分组操作之后应用
HAVING 搜索条件在进行分组操作之后应用: 如:查询帖子访问量大于15的用户id: select t.user_id,u.name,sum(count_view) from t_topic t l ...
- 洛谷P1270 访问美术馆
题目 树形DP,首先考虑递归建图,类似于线段树的中序遍历.然后取状态dp[i][j]表示i点花费j时间所偷到的最多的画,有方程: \(dp[now][nwt] = max(dp[now][nwt], ...