1. 程式人生 > 其它 >多校省選模擬3

多校省選模擬3

人腦圖靈機 超腦星球 暗星人

T1 人腦圖靈機

歸納一下,對於\(m<=(n-1)b-\frac{b}{2}\)一定合法

然後\(((n-1)b-\frac{b}{2},n* b)\)內的合法點一定由\(a* x+b* y\)構成

ifelse+exgcd

T2 超腦星球

由於 T3 調了很久,就沒時間了,,,

T3 暗星人

這個L,R和l,r的限制,可以使用主席樹

加法標記和乘法標記在這個模數下不具有可減性,就樹套樹吧

然而空間不太夠(可能夠但是沒寫),就分塊+主席樹

需要注意的是,因為這個標記具有結合律但是沒交換律,並且在這個模數下不能通過將\(add->add',mul->mul'\)使得具有可交換性

然後就不能標記永久化,每次insert時push下去

在兩個標記合併時,我直接給一個樹節點賦值過去,然後把lc和rc覆蓋了,,,加上卡常,就調到了20:30,噁心的很

程式碼

T1

#include<bits/stdc++.h>
using namespace std;
#define int __int128_t 
#define il inline
int n,m,a,b;
int gcd(int a,int b){if(!b)return a;return gcd(b,a%b);}
il int read()
{
	int s=0;
	char ch=getchar();
	while(ch>'9'||ch<'0')ch=getchar();
	while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return s;
}
void exgcd(int a,int b,int &x,int &y)
{
	if(!b){x=1;return;}
	exgcd(b,a%b,y,x);
	y-=(a/b)*x;
	return;
}
signed main()
{
	freopen("turing.in","r",stdin);
	freopen("turing.out","w",stdout);
//	freopen("data","r",stdin);
//	freopen("c.out","w",stdout);
	int n,m,a,b,ed,x,y,d,k;
	int t=read();
	while(t--)
	{
		n=read(),m=read();
		a=read(),b=read();
		ed=(n-1)*b+b/2;
		if(m<=ed||m==n*b){printf("%s\n","Yes");continue;}
		if(a<=0.5*b){printf("%s\n","No");continue;}
		else
		{
			d=gcd(a,b),k=m/d;
			if(m%d){printf("%s\n","No");continue;}
			exgcd(a,b,x,y);
			x=k*x,y=k*y;
			k=b/d;
			if(x<0) x=x+(-x/k+1)*k;
			else x=x-(x/k)*k;
			if(x==k)x=0;
			y=(m-a*x)/b;
			if(x>=0&&y>=0&&x+y<=n) printf("%s\n","Yes");
			else printf("%s\n","No");
		}
	}
	return 0;
}

T3

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
const int N=3e5+11;
const unsigned int mod=2677114440;
int siz;
il int max_(int x,int y){return x>y?x:y;}
struct tree{
	signed lc,rc;unsigned int mul,add,maxx;
	friend tree operator+(tree a,tree b)
	{
		b.maxx=max_(b.maxx,a.maxx);
		b.add=((b.mul*a.add)+b.add)%mod;
		b.mul=a.mul*b.mul%mod;
		b.lc=a.lc,b.rc=a.rc;
		return b;
	}
}tre[100*N],tmp,dw,now[N];
bool ty;
int n,m,ans,tot;
signed root[N];
signed bl[N],br[N];
int L[N],R[N],a[N],b[N];
il void upd(tree &a,tree b){a.mul=b.mul,a.add=b.add,a.maxx=b.maxx;return;}
il int read()
{
	int s=0;
	char ch=getchar();
	while(ch>'9'||ch<'0')ch=getchar();
	while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return s;
}
il void rd(int &x){x=read()^(ty*ans);return;}
il void push(signed i)
{
	if(!tre[i].lc) tre[i].lc=++tot,tre[tot].mul=1;
	if(!tre[i].rc) tre[i].rc=++tot,tre[tot].mul=1;
	int lc=tre[i].lc,rc=tre[i].rc;
	tree tp1=tre[lc]+tre[i],tp2=tre[rc]+tre[i];
	upd(tre[lc],tp1),upd(tre[rc],tp2);
	tre[i].mul=1,tre[i].add=tre[i].maxx=0;
	return;
}
void ins(signed &i,signed l,signed r,int x)
{
	if(!i) i=++tot,tre[i]=dw;
	if(l!=r) push(i);
	if(l>=L[x]&&r<=R[x]) {tre[i]=tre[i]+now[x];return;}
	int mid=(l+r)>>1;
	if(L[x]<=mid) ins(tre[i].lc,l,mid,x);
	if(R[x]>mid) ins(tre[i].rc,mid+1,r,x);
	return;
}
tree qry(signed i,signed l,signed r,int x)
{
	if(!i) return dw;
	if(l==r) return tre[i];
	int mid=(l+r)>>1;
	if(x<=mid) return qry(tre[i].lc,l,mid,x)+tre[i];
	else return qry(tre[i].rc,mid+1,r,x)+tre[i];
}
signed main()
{
//	freopen("data","r",stdin);
//	freopen("zj1.out","w",stdout);
	freopen("dark.in","r",stdin);
	freopen("dark.out","w",stdout);
	dw={0,0,1,0,0};
	n=read(),m=read(),ty=read();
	siz=pow(m,0.6);
	for(int i=1;i<=m;++i){if(!bl[i/siz+1]) bl[i/siz+1]=i;br[i/siz+1]=i;}
	double x1=clock();
	for(int l,r,x,X,blo,i=1;i<=m;++i)
	{
		rd(L[i]),rd(R[i]),rd(a[i]),rd(b[i]);
		rd(l),rd(r),rd(X),rd(x);
		blo=i/siz+1,tmp=dw;
		now[i]=(tree){0,0,a[i],b[i],b[i]};
		ins(root[blo],1,n,i);
		int BL=l/siz+1,BR=r/siz+1;
		if(BL==BR)
		{
			for(int j=l;j<=r;++j) if(L[j]<=X&&R[j]>=X) tmp=tmp+now[j];
			ans=(tmp.mul*x%mod+tmp.add)%mod^tmp.maxx;
			printf("%lld\n",(long long)ans);
			continue;
		}
		for(int j=l;j<=br[BL];++j) if(L[j]<=X&&R[j]>=X) tmp=tmp+now[j];
		for(int j=BL+1;j<=BR-1;++j) tmp=tmp+qry(root[j],1,n,X);
		for(int j=bl[BR];j<=r;++j) if(L[j]<=X&&R[j]>=X) tmp=tmp+now[j];
		ans=(tmp.mul*x%mod+tmp.add)%mod^tmp.maxx;
		printf("%lld\n",(long long)ans);
	}
//	double x2=clock();
//	cout<<(x2-x1)/CLOCKS_PER_SEC<<endl;
	return 0;
}