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\) 序列和是所有长度为\( ...
随机推荐
- 用wpjam插件的朋友记得勾选移除工具栏
今天ytkah在调试页面的时候发现网页一直出现32px高度的空白,非常奇怪,样式如下,全盘查找了关键词也没找到对应的样式文件,后面想到wpjam插件好像有个屏蔽选项,到那边设置一下说不定可以 < ...
- js 数组 : 差集、并集、交集、去重、多维转一维
//input:[{name:'liujinyu'},{name:'noah'}] //output:['liujinyu','noah'] Array.prototype.choose = func ...
- Java 锁(学习笔记)
关于Java 锁的知识整理与回顾(个人笔记): 锁有哪些,分别用来干嘛? Java实现锁有两种方式,synchronized关键字和Lock (1)Lock(可判断锁状态) Lock是基于JDK层面实 ...
- lis框架各种方法的使用
//这个必须是lpedorapp表的主键才行LPEdorAppDB tLPEdorAppDB = new LPEdorAppDB();tLPEdorAppDB.setEdorAcceptNo(mEdo ...
- C++中字符数组和字符指针问题
环境:vs2010 说明:在阅读这部分内容之前应该先明确C++内存分配问题 ,那一篇文章说的比较清楚. 1.字符数组,初始化: char str1[]="abc"; char st ...
- FFT/NTT [51Nod 1028] 大数乘法 V2
题目链接:51Nod 传送门 没压位,效率会低一点 1.FFT #include <cstdio> #include <cstring> #include <algori ...
- 事件类型(onload)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- learning java NIO 之 RandomFileChannel
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.i ...
- CSS3 之filter毛玻璃效果弹窗
先看效果: 效果主要用css3的滤镜属性实现,代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- linux常用命名汇总:自用,持续更新
1.查看磁盘空间大小 df -hl 查看磁盘剩余空间 df -h 查看每个根路径的分区大小 du -sh [目录名] 返回该目录的大小 du -sm [文件夹] 返回该文件夹总M数 du -h [目录 ...