QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#863811#3209. Differenciapeimuda0 0ms0kbC++113.7kb2025-01-19 22:52:092025-01-19 22:52:09

Judging History

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

  • [2025-01-19 22:52:09]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:0kb
  • [2025-01-19 22:52:09]
  • 提交

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 A,B,C=~(1<<31),M=(1<<16)-1;
int rnd(int x)
{
	A = ( 36969 + ( x >> 3 ) ) * ( A & M) + ( A >> 16 ) ;
B = ( 18000 + ( x >> 3 ) ) * ( B & M) + ( B >> 16 ) ;
return (C & ( ( A << 16 ) + B ) ) % 1000000000;
}
struct node
{
	int l,r;
	int ts;
	int ls,rs;
} nd[3000006];
int t;
int bd(int l,int r)
{
	int rt=t++;
	node&x=nd[rt];
	x.l=l;
	x.r=r;
	x.ts=0;
	x.ls=0;
	x.rs=0;
	if(l==r-1) return rt;
	x.ls=bd(l,l+r>>1);
	x.rs=bd(l+r>>1,r);
	return rt;
}
int add(int i,int l)
{
	int rt=t++;
	node&x=nd[rt];
	x=nd[i];
	x.ts++;
	if(x.l==x.r-1) return rt;
	int m=x.l+x.r>>1;
	if(l<m) x.ls=add(x.ls,l);
	else x.rs=add(x.rs,l);
	return rt;
}
int ask(int i,int l,int r)
{
	node&x=nd[i];
	if(x.l>=l&&x.r<=r) return x.ts;
	int rt=0;
	int m=x.l+x.r>>1;
	if(l<m) rt+=ask(x.ls,l,r);
	if(r>m) rt+=ask(x.rs,l,r);
	return rt;
}
int a[100005],b[100005];
int w[100005],z;
int s[100005];
void ad(int x,int v)
{
//	cout<<"Adbit "<<x<<' '<<v<<endl;
	while(x<=100000)
	{
		s[x]+=v;
		x+=x&-x;
	}
}
int ask(int x)
{
//	cout<<"Asbit "<<x<<' ';
	int r=0;
	while(x)
	{
		r+=s[x];
		x&=x-1;
	}
//	cout<<r<<endl;
	return r;
}
int rot[100005];
int ffls(int l,int r,int x)
{
	if(x<=0) return 0;
	return ask(rot[r],0,x)-ask(rot[l],0,x);
}
int fls(int l,int r,int x)
{
	int rt=ffls(l,r,x);
//	cout<<"Fl "<<l<<' '<<r<<' '<<x<<"  "<<rt<<endl;
	return rt;
}
set<piii> sgs;
set<piii>::iterator ls,ds;
//void otp()
//{
//	cout<<"------\n";
//	for(piii i:sgs)
//	{
//		cout<<'['<<i.f<<"] val:"<<i.s.f<<" sum:"<<i.s.s<<' ';
//	}
//	cout<<"\n------"<<endl;
//}
void sl()
{
	int n,q;
	cin>>n>>q>>A>>B;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++) cin>>b[i],w[i]=b[i];
	sort(w,w+n);
	z=unique(w,w+n)-w;
	for(int i=0;i<n;i++) a[i]=upper_bound(w,w+z,a[i])-w;
	for(int i=0;i<n;i++) b[i]=upper_bound(w,w+z,b[i])-w-1;
	t=0;
	rot[0]=bd(0,z);
	for(int i=0;i<n;i++) rot[i+1]=add(rot[i],b[i]);
	sgs.clear();
	for(int i=0;i<n;i++) sgs.insert(mp(i,mp(a[i],a[i]>b[i])));
	sgs.insert(mp(n,mp(-1,-1)));
	sgs.insert(mp(-1,mp(-1,-1)));
	for(int i=0;i<=n+2;i++) s[i]=0;
	for(int i=0;i<n;i++) ad(i+1,a[i]>b[i]);
	int l,r,x;
	int las=0;
	ll op=0;
//	otp();
	for(int ut=1;ut<=q;ut++)
	{
		l=rnd(las)%n+1;
		r=rnd(las)%n+1;
		x=rnd(las)+1;
		if(l>r) swap(l,r);
//		cout<<"Fd "<<l<<' '<<r<<' '<<x<<' '<<((l+r+x)%2==0?'?':'+')<<endl;
		l--;
		if((l+r+x)&1)
		{
			x=upper_bound(w,w+z,x)-w;
			int g=ask(r)-ask(l);
			ls=sgs.lower_bound(mp(l,mp(0,0)));
			int fr=(*ls).f;
			ls--;
			x=(*ls).s.f;
			g+=fls(l,fr,x);
			ls=sgs.lower_bound(mp(r,mp(0,0)));
			fr=(*ls).f;
			ls--;
			x=(*ls).s.f;
			g-=fls(r,fr,x);
			las=g;
			op+=1ll*ut*g;
		}
		else
		{
			x=upper_bound(w,w+z,x)-w;
			int cts=0;
			ls=sgs.lower_bound(mp(l,mp(0,0)));
			int fr=(*ls).f;
			ls--;
			int fx=(*ls).s.f;
			int g=fls(l,fr,fx);
			piii fd=*ls;
			sgs.erase(ls);
			fd.s.s-=g;
			sgs.insert(fd);
			cts+=fls(l,fr,x);
			if(fd.f>=0) ad(fd.f+1,-g);
			ds=sgs.lower_bound(mp(r,mp(114514,0)));
			while(1)
			{
				ls=sgs.lower_bound(mp(l,mp(0,0)));
				ls++;
				if(ls==ds) break;
				fr=(*ls).f;
				ls--;
				fd=*ls;
				sgs.erase(ls);
				ad(fd.f+1,-fd.s.s);
				cts+=fls(fd.f,fr,x);
			}
			ds--;
			fd=*ds;
			sgs.erase(ds);
			cts+=fls(fd.f,r,x);
			ad(fd.f+1,-fd.s.s);
			fd.s.s-=fls(fd.f,r,fd.s.f);
			fd.f=r;
			sgs.insert(fd);
			ad(fd.f+1,fd.s.s);
			ad(l+1,cts);
			sgs.insert(mp(l,mp(x,cts)));
		}
//		cout<<"Fd "<<op<<endl;
//		otp();
	}
	cout<<op%1000000007<<'\n';
}
int main()
{
	ios_base::sync_with_stdio(0);
	int t;
	cin>>t;
	while(t--) sl();
	return 0;
}/*1
5 10 1 2
5 4 3 2 1
1 2 3 4 5
*/

详细


Pretests


Final Tests

Test #1:

score: 0
Runtime Error

input:

274
5 10 1 2
5 4 3 2 1
1 2 3 4 5
5 10 3 4
5 4 4 2 1
1 2 3 4 5
5 10 5 6
5 4 5 2 1
1 2 2 4 5
10 10 60879 21802
6 5 2 1 7 9 7 2 5 5
2 4 7 6 2 2 8 7 7 9
10 10 41083 35398
9 6 10 8 8 6 10 3 3 9
1 10 5 8 1 10 7 8 4 8
10 10 1259 44124
1 10 2 5 1 7 7 4 1 4
5 4 5 10 1 5 1 2 5 1
10 10 55129 39158
6 2 9 9 7 6 ...

output:

81
88
87

result: