QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#226107#1443. Potato ShuffleCrysflyTL 0ms0kbC++173.5kb2023-10-25 16:01:522023-10-25 16:01:54

Judging History

你现在查看的是最新测评结果

  • [2023-10-25 16:01:54]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2023-10-25 16:01:52]
  • 提交

answer

// what is matter? never mind. 
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2") 
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
#define ull unsigned long long
//#define int long long
using namespace std;
inline int read()
{
	char c=getchar();int x=0;bool f=0;
	for(;!isdigit(c);c=getchar())f^=!(c^45);
	for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
	if(f)x=-x;return x;
}

#define fi first
#define se second
#define pb push_back
#define mkp make_pair
typedef pair<int,int>pii;
typedef vector<int>vi;

#define maxn 1000005
#define inf 0x3f3f3f3f
#define mod 1000000007

bool mbe;
int n,k,id[maxn],a[maxn],pos[maxn];

pii mn[maxn<<2],mx[maxn<<2];
int tc[maxn<<2];
void up(int p){
	mn[p]=min(mn[p<<1],mn[p<<1|1]);
	mx[p]=max(mx[p<<1],mx[p<<1|1]);
	tc[p]=tc[p<<1]+tc[p<<1|1];
}
void build(int p,int l,int r){
	if(l==r)return mn[p]=mx[p]=mkp(a[l],l),tc[p]=1,void();
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r),up(p);
}
void del(int p,int l,int r,int x){
	if(l==r)return mn[p]=mkp(inf,l),mx[p]=mkp(-inf,l),tc[p]=0,void();
	int mid=l+r>>1;
	if(x<=mid)del(p<<1,l,mid,x);
	else del(p<<1|1,mid+1,r,x);
	up(p);
}

pii resmn,resmx; int cc;
void ask(int p,int l,int r,int ql,int qr){
	if(ql>qr)return;
	if(l>=ql&&r<=qr){
		resmn=min(resmn,mn[p]);
		resmx=max(resmx,mx[p]);
		cc+=tc[p];
		return;
	}
	int mid=l+r>>1;
	if(ql<=mid)ask(p<<1,l,mid,ql,qr);
	if(qr>mid)ask(p<<1|1,mid+1,r,ql,qr);
}
void ask(int ql,int qr){
	resmn=mkp(inf,0);
	resmx=mkp(-inf,0);
	cc=0;
	ask(1,1,n,ql,qr);
}

unsigned int pri[maxn];
mt19937 rnd(64);
int tr[maxn],ls[maxn],rs[maxn];
void upd(int p){
	tr[p]=max(p,max(tr[ls[p]],tr[rs[p]]));
}
void dfs(int p){
	if(ls[p])dfs(ls[p]);
	cout<<p<<" ";
	if(rs[p])dfs(rs[p]);
}
void split(int p,int k,int&x,int&y){
	if(!p)return x=y=0,void();
	if(max(tr[ls[p]],p)<k)x=p,split(rs[p],k,rs[p],y);
	else y=p,split(ls[p],k,x,ls[p]);
	upd(p);
}
int merge(int x,int y){
	if(!x||!y)return x|y;
	if(pri[x]<pri[y])return rs[x]=merge(rs[x],y),upd(x),x;
	else return ls[y]=merge(x,ls[y]),upd(y),y;
}

pair<int,int>solve(int l,int r){
	ask(l,r);
	int cc=::cc;
//	cout<<"l,r "<<l<<" "<<r<<"\n";
	if(resmn.fi==inf)return {0,1};
	if(resmn.se==resmx.se)return {id[resmn.se],1};
	if(resmn.fi+resmx.fi>k){
		int u=resmx.se;//cout<<"max "<<u<<"\n";
		del(1,1,n,u);
		pii fl=solve(l,u-1),fr=solve(u+1,r);
		return {merge(fl.fi,merge(id[u],fr.fi)),1ll*fl.se*fr.se%mod};
	}else{
		int u=resmn.se;
	//	cout<<"min "<<u<<"\n";
		del(1,1,n,u);
		pii tmp=solve(l,r);
		tmp.se=1ll*tmp.se*cc%mod;
	//	cout<<"L R "<<l<<" "<<r<<" "<<tmp.se<<"\n";
	//	return tmp;
		// ins.
		int rt=tmp.fi;
		if(1){
			int x,y;
			split(rt,id[u],x,y);
			rt=merge(merge(x,id[u]),y);
		}
		
		return {rt,tmp.se};
	}
}
bool med;

signed main()
{
//	freopen("data.in","r",stdin);
//	cout<<((1.0*(&mbe-&med))/1024576.0)<<"\n";
	n=read(),k=read();
	For(i,1,n)id[i]=read();
	reverse(id+1,id+n+1);
	For(i,1,n)pos[id[i]]=i;
	For(i,1,n)a[pos[i]]=read();
//	For(i,1,n)cout<<a[i]<<" ";cout<<"\n";
	For(i,1,n)pri[i]=rnd(),tr[i]=i;
	build(1,1,n);
	pii res=solve(1,n);
	cout<<res.se<<"\n";
	return 0;
}
/*
10 100
6 2 8 10 4 1 9 5 3 7 
98 89 77 93 91 15 10 57 89 27 


4
0 0
2 0
1 1
0 1

1 5 9 10 15 18
1 5 9 13 15 18
  4 4 4  2  3
8,14.

6 6 6 2
1 5 9 10 15 18
2 2
1 3 3 -3
2 2
1 3 4 3
2 3
2 4

*/

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

3 7
5 2 4

output:


result: