赛时LemenLime评测器奇怪的RE原因,洛谷上没有RE
  • 板块灌水区
  • 楼主lfxxx_
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/11 23:47
  • 上次更新2024/10/12 13:55:49
查看原帖
赛时LemenLime评测器奇怪的RE原因,洛谷上没有RE
795344
lfxxx_楼主2024/10/11 23:47
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=45,M=2e6+5;
int n,K;
int n1,n2;
int a[N],b[N];
int A[N],B[N],cnt;
vector<pair<int,int> >p,v;
void dfs1(int u)
{
	if(u==n1)
	{
		for(int i=0;i<cnt-1;++i)
			if(A[i]>A[i+1])
				return ;
		int sum=0;
		for(int i=0;i<cnt;++i)
			sum+=B[i];
		if(cnt>0)p.push_back(make_pair(A[cnt-1],sum));
		return ;
	}
	A[cnt]=a[u];
	B[cnt]=b[u];
	++cnt;
	dfs1(u+1);
	--cnt;
	dfs1(u+1);
}
void dfs2(int u)
{
	if(u==n1-1)
	{
		for(int i=0;i<cnt-1;++i)
			if(A[i]<A[i+1])
				return ;
		int sum=0;
		for(int i=0;i<cnt;++i)
			sum+=B[i];
		if(cnt>0)v.push_back(make_pair(A[cnt-1],sum));
		return ;
	}A[cnt]=a[u];
	B[cnt]=b[u];
	++cnt;
	dfs2(u-1);
	--cnt;
	dfs2(u-1);
}
int root,tot;
struct node{
	int val,pri,ls,rs,sz;
}tr[M];
int New(int x)
{
	++tot;
	tr[tot].val=x;
	tr[tot].pri=rand();
	tr[tot].ls=tr[tot].rs=0;
	tr[tot].sz=1;
	return tot;
} 
void pushup(int p){tr[p].sz=tr[tr[p].ls].sz+tr[tr[p].rs].sz+1;}
void Split(int p,int x,int &L,int &R)
{
	if(!p)
	{
		L=R=0;
		return ;
	}
	if(tr[p].val<=x)
	{
		L=p;
		Split(tr[p].rs,x,tr[p].rs,R);
	}
	else
	{
		R=p;
		Split(tr[p].ls,x,L,tr[p].ls);
	}
	pushup(p);
}
int Merge(int L,int R)
{
	if(!L||!R)
		return L+R;
	if(tr[L].pri<=tr[R].pri)
	{
		tr[L].rs=Merge(tr[L].rs,R);
		pushup(L);
		return L; 
	}
	tr[R].ls=Merge(L,tr[R].ls);
	pushup(R);
	return R;
}
signed main()
{
	srand(time(0));
	freopen("1884.in","r",stdin);
	freopen("1884.out","w",stdout);
	cin>>n>>K;
	n1=n/2,n2=n-n1;
	for(int i=0;i<n;++i)
		cin>>a[i]>>b[i];
	dfs1(0);
	cnt=0;
	dfs2(n-1);
	sort(p.begin(),p.end());
	sort(v.begin(),v.end());
	int pt=0,ans=0;
	for(int i=0;i<v.size();++i)
	{
		int L,R,x=v[i].second;
		if(x>=K)
			++ans;
		Split(root,x,L,R);
		root=Merge(Merge(L,New(x)),R);
	}
	for(int i=0;i<p.size();++i)
	{
		int x=p[i].first,y=K-p[i].second;
		if(y<=0)
			++ans;
		while(pt<v.size()&&v[pt].first<x)
		{
			int L,R,p;
			Split(root,v[pt].second,L,R);
			Split(L,v[pt].second-1,L,p);
			p=Merge(tr[p].ls,tr[p].rs);
			root=Merge(Merge(L,p),R);
			++pt;
		}
		if(pt==v.size())
			break;
		int L,R;
		Split(root,y-1,L,R);
		ans+=tr[R].sz;
		root=Merge(L,R);
	}
	cout<<ans;
	return 0;
}



freopen没打错,是对的 P10884

2024/10/11 23:47
加载中...