求大佬来组hack数据
查看原帖
求大佬来组hack数据
413801
rabbitdit楼主2021/8/27 12:02
#include<bits/stdc++.h>
using namespace std;
struct jud {
	bool from;
	int lo;
	int num;
};
struct node {
	int size;
	int l;
	int r;
};
node tree[500000];
vector<jud> li;
int shoot[110005];
int ins[10005];
int fs[100005];
bool md[10005];
bool cmp(jud a,jud b) {
	return a.num<b.num;
}
void maketree(int l,int r,int lo) {
	tree[lo].l=l;
	tree[lo].r=r;
	tree[lo].size=0;
	if(l!=r) {
		int mid=(l+r)/2;
		maketree(l,mid,lo*2);
		maketree(mid+1,r,lo*2+1);
	}
}
int find(int num,int lo,int ji) {
	cout<<tree[lo].l<<" "<<tree[lo].r<<" "<<ji<<" "<<num<<endl;
	if(tree[lo].l==tree[lo].r) return tree[lo].l;
	if(tree[lo*2].size+ji<num) return find(num,lo*2+1,ji+tree[lo*2].size);
	else return find(num,lo*2,ji);
}
void in(int num,int lo) {
	tree[lo].size+=1;
	if(tree[lo].l==tree[lo].r) return;
	if(tree[lo*2].r>=num) in(num,lo*2);
	else in(num,lo*2+1);
}
int main() {
	int n,m;
	scanf("%d",&n);
	int ind=0;
	for(int i=1; i<=n; i++) {
		jud rua;
		rua.from=0;
		rua.lo=i;
		scanf("%d",&rua.num);
		li.push_back(rua);
	}
	scanf("%d",&m);
	for(int i=1; i<=m; i++) {
//		cout<<i<<endl;
		char rua[3];
		scanf("%s",&rua);
		if(rua[0]=='a') {
			jud rub;
			scanf("%d",&rub.num);
			rub.lo=i;
			rub.from=1;
			li.push_back(rub);
		} else md[i]=1;
	}
	sort(li.begin(),li.end(),cmp);
	for(int i=0; i<li.size(); i++) {
		int tian;
		if(i==0 || li[i].num>li[i-1].num) tian=++ind;
		else tian=ind;
		shoot[ind]=li[i].num;
		int lo=li[i].lo;
		if(li[i].from) ins[lo]=ind;
		else fs[lo]=ind;
	}
	for(int i=1;i<=n;i++) cout<<fs[i]<<' ';
	cout<<endl;
	for(int i=1;i<=m;i++) if(!md[i]) cout<<ins[i]<<" ";
	cout<<endl;
	maketree(1,ind,1);
	for(int i=1; i<=n; i++) in(fs[i],1);
	for(int i=1; i<=m; i++) {
		if(md[i]) {
			int out;
			if((tree[1].size)%2==1) out=find(tree[1].size/2+1,1,0);
			else out=min(find(tree[1].size/2,1,0),find(tree[1].size/2+1,1,0));
			printf("%d\n",shoot[out]);
		} else in(ins[i],1);
	}
	return 0;
}

线段树+离散化做的

2021/8/27 12:02
加载中...