CF1354D - Multiset

CF1354D - Multiset

Question

給你一個數組長度爲nn的數組a (1ain)a\ (1\le a_i\le n),有qq次操作,每次操作輸入kk
k>0k>0,數組中增加一個數 kk
k>0k>0,數組中去掉第 k-k 小的數
若最後數組爲空,則輸出0,否則輸出任意一個數組中存在的數。

Solution

1.二分答案
2.權值線段樹
3.樹狀數組改改
這是一道模板題,寫這篇博客主要是給自己開拓思維,解法比較多。

Code1 binary search

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  maxn = 1e6 + 5;
const int N = 1e6 + 5;

int n,T;
int a[N],q[N];

bool check(int x){
	int cnt=0;
	for(int i=1;i<=n;i++) if(a[i]<=x) cnt++;
	for(int i=1;i<=T;i++){
		if(q[i]<0){
			if(-q[i]<=cnt) cnt--;
		}
		else if(q[i]<=x) cnt++;
	}
	return cnt>0;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>T;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=T;i++) cin>>q[i];
	int L=1,R=n+1;
	while(L<R){
		int mid=(L+R)/2;
		if(check(mid)) R=mid;
		else L=mid+1;
	}
	cout<<(L<=n?L:0)<<'\n';
	return 0;
}

Code2 weight tree segement

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  maxn = 1e6 + 5;
const int N = 1e6 + 5;

int n,T;
int f[4*N];

void add(int l,int r,int v,int x,int t){
	if(l==r) f[v]+=t;
	else{
		int mid=(l+r)/2;
		if(x<=mid) add(l,mid,v*2,x,t);
		else add(mid+1,r,v*2+1,x,t);
		f[v]=f[v*2]+f[v*2+1];
	}
}

int kth(int l,int r,int v,int k){
	if(l==r) return l;
	else{
		int mid=(l+r)/2,s1=f[v*2],s2=f[v*2+1];
		if(k<=s1) return kth(l,mid,v*2,k);
		else return kth(mid+1,r,v*2+1,k-s1);
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>T;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		add(1,n,1,x,1);
	}
	for(int i=1;i<=T;i++){
		int x;cin>>x;
		if(x>0) add(1,n,1,x,1);
		else add(1,n,1,kth(1,n,1,-x),-1);
	}
	if(!f[1]) cout<<0<<'\n';
	else cout<<kth(1,n,1,1)<<'\n';
	return 0;
}

Code3 BIT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  maxn = 1e6 + 5;
const int N = 1048588;
const int lim = 1048576;

int n,T;
int bit[N];

void add(int pos,int val){
	for(int i=pos;i<=lim;i+=i&(-i)) bit[i]+=val;
}

int bsearch(int x){
	if(x==0) return 0;
	int pos=0;
	for(int i=lim/2;i>=1;i/=2){
		if(bit[pos+i]<x){
			x-=bit[pos+i];
			pos+=i;
		}
	}
	return pos+1;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>T;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		add(x,1);
	}
	int cnt=n;
	for(int i=1;i<=T;i++){
		int x;cin>>x;
		if(x>0) add(x,1),cnt++;
		else{
			x=bsearch(-x);
			add(x,-1),cnt--;
		}
	}
	cout<<(cnt==0?0:bsearch(1))<<'\n';
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章