QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#803464#1458. Binary Search AlgorithmpeimudaML 1ms3656kbC++143.2kb2024-12-07 17:14:492024-12-07 17:14:56

Judging History

This is the latest submission verdict.

  • [2024-12-07 17:14:56]
  • Judged
  • Verdict: ML
  • Time: 1ms
  • Memory: 3656kb
  • [2024-12-07 17:14:49]
  • Submitted

answer

#include<set>
#include<map>
#include<queue>
#include<vector>
#include<algorithm>
#include<bits/stdc++.h>
#define pr pair
#define f first
#define s second
#define ll long long
#define mp make_pair
#define pll pr<ll,ll>
#define pii pr<int,int>
#define piii pr<int,pii>
using namespace std;
int rt;
int ls[8003],rs[8003];
int fa[8003];
int md[8003];
//bool in[8003];
int cv[8003];
void upd(int x)
{
	if(ls[x]>=0&&rs[x]>=0)
	{
		md[x]=min(md[ls[x]],md[rs[x]])+1;
		if(cv[ls[x]]>cv[rs[x]]) swap(ls[x],rs[x]);
	}
	else
	{
		md[x]=0;
		if(rs[x]>=0) swap(ls[x],rs[x]);
	}
	if(ls[x]>=0) fa[ls[x]]=x;
	if(rs[x]>=0) fa[rs[x]]=x;
}
void upm(int x)
{
	if(x==-1) return;
	if(ls[x]>=0&&rs[x]>=0) md[x]=min(md[ls[x]],md[rs[x]])+1;
	else md[x]=0;
	upm(fa[x]);
}
int main()
{
	ios_base::sync_with_stdio(0);
	int n;
	cin>>n;
	rt=-1;
	string tp;
	int x;
	n*=2;
	int cs=0;
	while(n--)
	{
		cin>>tp>>x;
		x--;
		if(tp=="add")
		{
			cs++;
			ls[x]=-1;
			rs[x]=-1;
			if(rt==-1)
			{
				cout<<0<<endl;
				cout.flush();
				rt=x;
			}
			else
			{
			vector<int> v;
			v.push_back(rt);
			v.push_back(x);
			vector<int> g;
			int j;
			for(j=rt;rs[j]!=-1;)
			{
				v.push_back(ls[j]);
				v.push_back(rs[j]);
				g.push_back(j);
				if(md[ls[j]]<=md[rs[j]]) j=ls[j];
				else j=rs[j];
			}
			g.push_back(j);
			cout<<v.size();
			for(int i:v) cout<<' '<<i+1;
			cout<<endl;
			cout.flush();
			for(int i=0;i<v.size();i++)
			{
				int o;
				cin>>o;
				o--;
				cv[o]=i;
			}
			rs[j]=x;
			int i;
			for(i=g.size()-1;i>=0;i--)
			{
				if(cv[g[i]]<cv[x]) break;
				int s=g[i];
				if(i>0)
				{
					if(ls[g[i-1]]==s) ls[g[i-1]]=x;
					else rs[g[i-1]]=x;
				}
				else rt=x;
				swap(ls[x],ls[s]);
				swap(rs[x],rs[s]);
				if(ls[x]==x) ls[x]=s;
				else rs[x]=s;
				upd(s);
			}
			upd(x);
			for(;i>=0;i--) upd(g[i]);
			}
			fa[rt]=-1;
		}
		else
		{
			cs--;
			if(cs==0)
			{
				cout<<0<<endl;
				cout.flush();
				rt=-1;
			}
			else
			{
			vector<int> v;
			vector<int> g;
			int j;
			for(j=x;ls[j]!=-1;j=ls[x])
			{
				v.push_back(ls[j]);
				if(rs[j]>=0) v.push_back(rs[j]);
				g.push_back(ls[j]);
			}
			cout<<v.size();
			for(int i:v) cout<<' '<<i+1;
			cout<<endl;
			cout.flush();
			for(int i=0;i<v.size();i++)
			{
				int o;
				cin>>o;
				o--;
				cv[o]=i;
			}
//			cout<<"Oh "<<g.size()<<endl;
			int rf=fa[x];
			for(int i=0;i<g.size();i++)
			{
				int s=g[i];
				if(fa[x]!=-1)
				{
					if(ls[fa[x]]==x) ls[fa[x]]=s;
					else rs[fa[x]]=s;
				}
				else rt=s;
				fa[s]=fa[x];
				fa[x]=s;
				ls[x]=ls[s];
				ls[s]=x;
				swap(rs[x],rs[s]);
			}
			if(ls[fa[x]]==x) ls[fa[x]]=-1;
			else rs[fa[x]]=-1;
			for(int i=((int)g.size())-1;i>=0;i--) upd(g[i]);
			if(g.size()) upm(fa[g[0]]);
			else upm(rf);
			fa[rt]=-1;
			}
		}
//		for(int i=0;i<5;i++) cout<<ls[i]<<' ';
//		cout<<endl;
//		for(int i=0;i<5;i++) cout<<rs[i]<<' ';
//		cout<<endl;
//		for(int i=0;i<5;i++) cout<<fa[i]<<' ';
//		cout<<endl;
//		for(int i=0;i<5;i++) cout<<md[i]<<' ';
//		cout<<endl;
		if(rt==-1) cout<<"-1"<<endl;
		else cout<<rt+1<<endl;
		cout.flush();
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3656kb

input:

3
add 1

add 3
3 1
delete 1

add 2
3 2
delete 3
2
delete 2


output:

0
1
2 1 3
3
0
3
2 3 2
3
1 2
2
0
-1

result:

ok n=3, OK

Test #2:

score: 0
Accepted
time: 1ms
memory: 3596kb

input:

10
add 9

add 4
9 4
add 6
9 6
delete 9
4 6
add 7
7 4
delete 4

add 5
7 5
add 8
7 5 8 6
add 10
7 10 5 8
delete 8
6
add 3
3 7 10 6
add 2
3 7 6 2
delete 6
2
delete 10

delete 7
5
add 1
3 1 5 2
delete 1
5
delete 3
5 2
delete 5
2
delete 2


output:

0
9
2 9 4
9
2 9 6
9
2 4 6
4
2 4 7
7
0
7
2 7 5
7
4 7 8 6 5
7
4 7 10 5 8
7
1 6
7
4 7 3 10 6
3
4 3 2 7 6
3
1 2
3
0
3
1 5
3
4 3 1 5 2
3
1 5
3
2 5 2
5
1 2
2
0
-1

result:

ok n=10, OK

Test #3:

score: -100
Memory Limit Exceeded

input:

100
add 81

add 96
81 96
add 94
81 94
add 32
81 94 32 96
add 35
81 94 32 35
add 59
81 94 32 59
add 50
81 50 94 32
add 57
81 50 57 94 32 96
add 39
39 81 50 57 94 32
add 55
39 81 50 94 32 55
add 23
39 81 50 94 23 32
add 40
39 81 40 94 59 35
add 5
39 81 40 94 59 5
add 2
39 81 40 94 59 2
delete 55

add 12

output:

0
81
2 81 96
81
2 81 94
81
4 81 32 96 94
81
4 81 35 94 32
81
4 81 59 94 32
81
4 81 50 94 32
81
6 81 57 50 94 96 32
81
6 81 39 50 94 57 32
39
6 39 55 81 94 50 32
39
6 39 23 81 94 50 32
39
6 39 40 81 94 35 59
39
6 39 5 81 40 94 59
39
6 39 2 81 40 94 59
39
0
39

result: