QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#803615#1458. Binary Search AlgorithmpeimudaML 1ms3716kbC++143.5kb2024-12-07 17:47:552024-12-07 17:47:56

Judging History

This is the latest submission verdict.

  • [2024-12-07 17:47:56]
  • Judged
  • Verdict: ML
  • Time: 1ms
  • Memory: 3716kb
  • [2024-12-07 17:47:55]
  • 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)
{
//	cout<<"Ud "<<x<<endl;
	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;
//			cout<<"Sta "<<rt<<endl;
			for(j=rt;rs[j]!=-1;)
			{
//				cout<<"Oh "<<j<<"  "<<ls[j]<<' '<<rs[j]<<endl;
				if(j==0) exit(-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];
			}
if(ls[j]>=0) v.push_back(ls[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;
			int rf=fa[x];
			if(rf!=-1)
			{
				if(ls[rf]==x&&rs[rf]!=-1) v.push_back(rs[rf]);
				if(rs[rf]==x&&ls[rf]!=-1) v.push_back(ls[rf]);
			}
			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;
			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(rf>=0) upd(rf);
			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;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3716kb

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: 3600kb

input:

10
add 9

add 4
9 4
add 6
9 4 6
delete 9
4 6
add 7
7 4 6
delete 4
6
add 5
7 5 6
add 8
7 5 8 6
add 10
7 10 5 8 6
delete 8
5
add 3
3 7 10 5 6
add 2
3 7 6 2
delete 6
7 2
delete 10
5
delete 7
5 2
add 1
3 1 5 2
delete 1
5 2
delete 3
5 2
delete 5
2
delete 2


output:

0
9
2 9 4
9
3 9 6 4
9
2 4 6
4
3 4 7 6
7
1 6
7
3 7 5 6
7
4 7 8 5 6
7
5 7 10 5 6 8
7
1 5
7
5 7 3 10 6 5
3
4 3 2 7 6
3
2 7 2
3
1 5
3
2 2 5
3
4 3 1 5 2
3
2 2 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 96
add 32
81 94 32 96
add 35
81 94 32 35 96
add 59
81 94 59 96
add 50
81 50 94 59 96
add 57
81 50 57 94 59 96
add 39
39 81 50 57 94 59 96
add 55
39 81 50 94 55 96
add 23
39 81 50 94 23 55 96
add 40
39 81 40 94 32 35
add 5
39 81 40 94 32 35 5
add 2
39 81 40 94 35...

output:

0
81
2 81 96
81
3 81 94 96
81
4 81 32 94 96
81
5 81 35 94 96 32
81
4 81 59 94 96
81
5 81 50 94 59 96
81
6 81 57 50 94 59 96
81
7 81 39 50 94 57 96 59
39
6 39 55 81 94 50 96
39
7 39 23 81 94 50 55 96
39
6 39 40 81 94 32 35
39
7 39 5 81 40 94 35 32
39
6 39 2 81 40 94 35
39
1 96
39
7 39 12 81 40 50 23 ...

result: