多校省選模擬3
阿新 • • 發佈:2022-01-17
人腦圖靈機 超腦星球 暗星人
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; }