样例不过求调
查看原帖
样例不过求调
752764
GoodLeeLSR楼主2025/8/29 21:54

悬一关,感觉像主函数有问题

#include<bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
	int f=1,x=0;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return f*x;
}
const int N = 1e5 + 505;
const int mod = 1e6 + 3;
int lft[N],rgt[N],siz[N],p[N],head,cnt,n,m,q;
string key[N];
void up(int i)
{
	siz[i] = siz[lft[i]] + siz[rgt[i]] + 1;
}
void split(int l,int r,int i,int s)
{
	if(i == 0)
		lft[r] = rgt[l] = 0;
	else
	{
		if(siz[lft[i]] + 1 <= s)
		{
			rgt[l] = i;
			split(i,r,rgt[i],s - lft[i] - 1);
		}
		else
		{
			lft[r] = i;
			split(l,i,lft[i],s);
		}
		up(i);
	}
}
int merge(int l,int r)
{
	if(l == 0 || r == 0)
		return l + r;
	if(p[l] >= p[r])
	{
		rgt[l] = merge(rgt[l],r);
		up(l);
		return l;
	}
	else
	{
		lft[r] = merge(l,lft[r]);
		up(r);
		return r;
	}
}
signed main()
{
	srand(time(0));
	cin>>n;
	while(n--)
	{
		cin>>key[++cnt];
		siz[cnt] = 1;
		p[cnt] = rand() * rand() % mod;
		head = merge(head,cnt);
	}
	cin>>m;
	while(m--)
	{
		cin>>key[++cnt];
		siz[cnt] = 1;
		p[cnt] = rand() * rand() % mod;
		int x = read() + 1;
		split(0,0,head,x);
		int l = rgt[0],r = lft[0];
		head = merge(merge(l,cnt),r);
	}
	cin>>q;
	while(q--)
	{
		int x = read() + 1;
		split(0,0,head,x);
		int lm = rgt[0],r = lft[0];
		split(0,0,lm,x-1);
		int l = rgt[0],id = lft[0];
		for(char c : key[id])
			putchar(c);
		putchar('\n');
		head = merge(merge(l,id),r);
	}
	return 0;
}
2025/8/29 21:54
加载中...