关于整体二分复杂度?
  • 板块学术版
  • 楼主shitbro
  • 当前回复7
  • 已保存回复7
  • 发布时间2020/10/6 10:26
  • 上次更新2023/11/5 11:51:17
查看原帖
关于整体二分复杂度?
90972
shitbro楼主2020/10/6 10:26

RT

不带修序列第k小

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int INF = 0x3fffffff;
const int N = 1e5 + 5;
struct Query {
	int k,id;
};
vector <Query> q;
int n,Q; 
int a[N],ans[N];
int check(int l,int x) {
	int res = 0;
	for(int i = 1;i <= n;i ++) if(a[i] >= l && a[i] <= x) res ++;
	return res;
}
void Solve(int l,int r,vector <Query> q) {
	int mid = (l + r) >> 1;
	if(l == r) {
		for(int i = 0;i < q.size();i ++) ans[q[i].id] = l;
		return ;
	}
	vector <Query> q1,q2;
	for(int i = 0;i < q.size();i ++) {
		if(check(l,mid) >= q[i].k) q1.push_back(q[i]);
		else {
			q[i].k -= check(l,mid);
			q2.push_back(q[i]);
		}
	}
	if(q1.size()) Solve(l,mid,q1);
	if(q2.size()) Solve(mid + 1,r,q2);
}
int main() {
	//freopen("test.in","r",stdin);
	//freopen("test.out","w",stdout);
	scanf("%d%d",&n,&Q);
	for(int i = 1;i <= n;i ++) scanf("%d",&a[i]);
	for(int i = 1;i <= Q;i ++) {
		int k; scanf("%d",&k);
		q.push_back((Query){k,i});
	}
	Solve(1,INF,q);
	for(int i = 1;i <= Q;i ++) printf("%d ",ans[i]);
	puts("");
	return 0;
}

2020/10/6 10:26
加载中...