• 模拟赛


    以后不给题解的模拟赛,死也不做,
    我这么菜,你还不给我题解

    T1不会
    没题解,std不懂
    trick还是太菜,唉
    自己想的大概是
    枚举每个点处理包含的矩阵,展开平方,对于拆除改点的部分维护前缀和,这个前缀和类似与带一个二项式容斥的和式
    然后对于另一部分可以把矩阵分治
    在合并的时候维护一下矩形的匹配轮廓
    WA,可能那个地方没处理或没考虑到吧....

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef pair<int,int> pr;
    const double pi=acos(-1);
    #define rep(i,a,n) for(int i=a;i<=n;i++)
    #define per(i,n,a) for(int i=n;i>=a;i--)
    #define Rep(i,u) for(int i=head[u];i;i=Next[i])
    #define clr(a) memset(a,0,sizeof a)
    #define pb push_back
    #define mp make_pair
    #define putk() putchar(' ')
    ld eps=1e-9;
    ll pp=1000000007;
    ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
    ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
    ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);}
    ll read(){
    	ll ans=0;
    	char last=' ',ch=getchar();
    	while(ch<'0' || ch>'9')last=ch,ch=getchar();
    	while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    	if(last=='-')ans=-ans;
    	return ans;
    }
    void put(ll a){
    	if(a<0)putchar('-'),a=-a;
    	int top=0,q[20];
    	while(a)q[++top]=a%10,a/=10;
    	top=max(top,1);
    	while(top--)putchar('0'+q[top+1]);
    }
    //head
    #define N 3100 
    #define int long long 
    ll a[N][N];
    bool p[N][N];
    int b[N][N];
    int n;
    const int xt[]={0,1,0,-1};
    const int yt[]={1,0,-1,0};
    main(){ 
    	freopen("matrix.in","r",stdin); freopen("matrix.out","w",stdout); 
    	n=read();
    	int x=1,y=1,k=0;
    	int tot=1;
    	rep(i,1,n)
    		rep(j,1,n)p[i][j]=1;
    	rep(i,1,n*n){
    		b[x][y]=tot;
    		p[x][y]=0;
    		if(i==n*n)break;
    		++tot;
    
    		while(!p[x+xt[k]][y+yt[k]])k=(k+1)%4;
    		x+=xt[k];
    		y+=yt[k];
    	}
    	ll ans=0;
    	rep(i,1,n)
    		rep(j,1,n){
    			ll t=b[i][j];
    			ans=mo(ans-t*i*j%pp*t%pp*(n-i+1)%pp*(n-j+1),pp);
    			a[i][j]=mo(b[i][j]*i%pp*j%pp+a[i-1][j]+a[i][j-1]-a[i-1][j-1],pp);
    			ans=(ans+2*a[i][j]*t%pp*(n-i+1)%pp*(n-j+1)%pp)%pp;
    		}
    	rep(i,1,n)
    		per(j,n,1){
    			ll t=b[i][j];
    			a[i][j]=mo(b[i][j]*i%pp*(n-j+1)+a[i-1][j]+a[i][j+1]-a[i-1][j+1],pp);
    			ans=(ans+2*a[i-1][j+1]*t%pp*(n-i+1)%pp*j)%pp;
    		}	
    	cout<<ans;
    	return 0;
    }
    
    

    T2
    二分,单调队列维护最大最下,盼区间个数瞎写

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef pair<int,int> pr;
    const double pi=acos(-1);
    #define rep(i,a,n) for(int i=a;i<=n;i++)
    #define per(i,n,a) for(int i=n;i>=a;i--)
    #define Rep(i,u) for(int i=head[u];i;i=Next[i])
    #define clr(a) memset(a,0,sizeof a)
    #define pb push_back
    #define mp make_pair
    #define putk() putchar(' ')
    ld eps=1e-9;
    ll pp=1000000007;
    ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
    ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
    ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);}
    ll read(){
    	ll ans=0;
    	char last=' ',ch=getchar();
    	while(ch<'0' || ch>'9')last=ch,ch=getchar();
    	while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    	if(last=='-')ans=-ans;
    	return ans;
    }
    void put(ll a){
    	if(a<0)putchar('-'),a=-a;
    	int top=0,q[20];
    	while(a)q[++top]=a%10,a/=10;
    	top=max(top,1);
    	while(top--)putchar('0'+q[top+1]);
    }
    //head
    #define N 410000
    int a[N],q1[N],q2[N];
    ll k;
    int n;
    bool check(int kk){
    	int l1=1,r1=1,l2=1,r2=1;
    	q1[1]=1;q2[1]=1;
    	int z=1;
    	ll ans=0;
    	if(kk==1)ans=1;
    	else ans=0;
    	rep(i,2,n){
    		while(l1<=r1 && a[q1[r1]]>=a[i])--r1;
    		q1[++r1]=i;
    		while(l2<=r2 && a[q2[r2]]<=a[i])--r2;
    		q2[++r2]=i;
    		while(z<i){
    				int t1=l1,t2=l2;
    				++z;
    				while(q1[t1]<z)++t1;
    				while(q2[t2]<z)++t2;
    				if(a[q2[t2]]-a[q1[t1]]>=kk){
    					l1=t1;
    					l2=t2;
    				}
    				else{
    					--z;
    					break;
    				}
    		}
    		if(a[q2[l2]]-a[q1[l1]]>=kk)ans+=z;
    	}
    	return ans>=k;
    }
    int main(){
    	freopen("kth.in","r",stdin);
    	freopen("kth.out","w",stdout);
    	n=read();k=read();
    	rep(i,1,n)a[i]=read();
    	int l=0,r=1000000000;
    	while(l<r){
    		int mid=(l+r+1)/2;
    		if(check(mid))l=mid;
    		else r=mid-1;
    	}
    	cout<<l<<endl;
    	return 0;
    	return 0;
    }
    
    

    T3
    树上哈希判断同构

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<map>
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef pair<int,int> pr;
    const double pi=acos(-1);
    #define rep(i,a,n) for(int i=a;i<=n;i++)
    #define per(i,n,a) for(int i=n;i>=a;i--)
    #define Rep(i,u) for(int i=head[u];i;i=Next[i])
    #define clr(a) memset(a,0,sizeof a)
    #define pb push_back
    #define mp make_pair
    #define putk() putchar(' ')
    ld eps=1e-9;
    ll p1=1000000007;
    ll p2=1000000009;
    ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
    ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
    ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);}
    ll read(){
    	ll ans=0;
    	char last=' ',ch=getchar();
    	while(ch<'0' || ch>'9')last=ch,ch=getchar();
    	while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    	if(last=='-')ans=-ans;
    	return ans;
    }
    void put(ll a){
    	if(a<0)putchar('-'),a=-a;
    	int top=0,q[20];
    	while(a)q[++top]=a%10,a/=10;
    	top=max(top,1);
    	while(top--)putchar('0'+q[top+1]);
    }
    //head
    #define N 210000
    map<ll,bool>G1,G2;
    int head[N],q[N],fa[N][20],v[N],num,next[N],dep[N],len1,len2,n,m;
    char str[N];
    ll b1[N],inv1[N],hash1_1[N][26],hash2_1[N][26],ans[2][26];
    ll b2[N],inv2[N],hash1_2[N][26],hash2_2[N][26],ans2[2][26];
    bool vis[N];
    int f[26];
    void add(int x,int y){
    	v[++num]=y;next[num]=head[x];head[x]=num;
    }
    void bfs(){
    	int t=0,w=1;
    	q[1]=1;
    	vis[1]=1;
    	hash1_1[1][str[1]-'a']=hash2_1[1][str[1]-'a']=1;
    	hash1_2[1][str[1]-'a']=hash2_2[1][str[1]-'a']=1;
    	while(t<w){
    		int u=q[++t];
    		for(int i=1;(1<<i)<=dep[u];i++)fa[u][i]=fa[fa[u][i-1]][i-1];
    		for(int i=head[u];i;i=next[i])
    			if(!vis[v[i]]){
    				vis[v[i]]=1;
    				q[++w]=v[i];
    				fa[v[i]][0]=u;
    				dep[v[i]]=dep[u]+1;
    				rep(j,0,25){
    				hash1_1[v[i]][j]=(hash1_1[u][j]*31+((str[v[i]]-'a')==j))%p1;
    				hash2_1[v[i]][j]=(hash2_1[u][j]+b1[dep[v[i]]]*((str[v[i]]-'a')==j))%p1;
    				hash1_2[v[i]][j]=(hash1_2[u][j]*37+((str[v[i]]-'a')==j))%p2;
    				hash2_2[v[i]][j]=(hash2_2[u][j]+b2[dep[v[i]]]*((str[v[i]]-'a')==j))%p2;
    				}
    			}
    	}
    }
    int lca(int x,int y){
    	if(dep[y]>dep[x])swap(x,y);
    	for(int i=18;i>=0;i--)
    		if(dep[x]-(1<<i)>=dep[y])x=fa[x][i];
    	if(x==y)return x;
    	for(int i=18;i>=0;i--)
    		if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
    	return fa[x][0];
    }
    
    int find(int x){
    	if(x==f[x])return x;
    	return f[x]=find(f[x]);
    }
    ll work1_1(int x,int y,int k){
    	return mo(hash1_1[y][k]-hash1_1[fa[x][0]][k]*b1[dep[y]-dep[x]+1],p1);
    }
    ll work2_1(int x,int y,int k){
    	return mo(hash2_1[x][k]-hash2_1[fa[y][0]][k],p1)*inv1[dep[y]]%p1;
    }
    ll work1_2(int x,int y,int k){
    	return mo(hash1_2[y][k]-hash1_2[fa[x][0]][k]*b2[dep[y]-dep[x]+1],p2);
    }
    ll work2_2(int x,int y,int k){
    	return mo(hash2_2[x][k]-hash2_2[fa[y][0]][k],p2)*inv2[dep[y]]%p2;
    }
    void work(int x,int y,int len,ll *ans1,ll *ans2){
    	int z=lca(x,y);
    	len=dep[x]-dep[z]+dep[y]-dep[z]+1;
    	rep(i,0,25){
    		ans1[i]=mo(work1_1(z,y,i)+work2_1(x,z,i)*b1[dep[y]-dep[z]]-((str[z]-'a')==i)*b1[dep[y]-dep[z]],p1);
    		ans2[i]=mo(work1_2(z,y,i)+work2_2(x,z,i)*b2[dep[y]-dep[z]]-((str[z]-'a')==i)*b2[dep[y]-dep[z]],p2);
    	}
    	rep(i,0,25)
    		if(find(i)!=i){
    			ans1[find(i)]=(ans1[find(i)]+ans1[i])%p1,ans1[i]=0;
    			ans2[find(i)]=(ans2[find(i)]+ans2[i])%p2,ans2[i]=0;
    		}
    }
    bool check(){
    	if(len1!=len2)return 0;
    	ll tot1=0,tot2=0,s1=0,s2=0,rec1=0,rec2=0;
    	rep(i,0,25){
    	//	printf("%I64d %I64d %I64d %I64d
    ",ans[0][i],ans[1][i],ans2[0][i],ans2[1][i]);
    		if(ans[0][i]!=ans[1][i])++tot1,rec1=mo(ans[0][i]-ans[1][i],p1);
    		if(ans2[0][i]!=ans2[1][i])++tot2,rec2=mo(ans2[0][i]-ans2[1][i],p2);
    	}
    	if(tot1!=0 && tot1!=2)return 0;
    	if(tot2!=0 && tot2!=2)return 0;
    	if(tot1==0 && tot2==0)return 1;
    	return G1[rec1] && G2[rec2];
    }
    char ss[100];
    int main(){
    	freopen("string.in","r",stdin);
    	freopen("string.out","w",stdout);
    	n=read();m=read();
    	scanf("%s",str+1);
    	rep(i,2,n){
    		int x=read(),y=read();
    		add(x,y);
    		add(y,x);
    	}
    	b1[0]=1;
    	rep(i,1,n)b1[i]=b1[i-1]*31%p1;
    	inv1[0]=1;
    	inv1[1]=powmod(31,p1-2,p1);
    	rep(i,2,n)inv1[i]=inv1[i-1]*inv1[1]%p1;
    	rep(i,0,n)G1[b1[i]]=1,G1[mo(-b1[i],p1)]=1;
    	
    	b2[0]=1;
    	rep(i,1,n)b2[i]=b2[i-1]*37%p2;
    	inv2[0]=1;
    	inv2[1]=powmod(37,p2-2,p2);
    	rep(i,2,n)inv2[i]=inv2[i-1]*inv2[1]%p2;
    	G1[0]=1;G2[0]=1;
    	rep(i,0,n)G2[b2[i]]=1,G2[mo(-b2[i],p2)]=1;
    	bfs();
    /*	cout<<dep[6]<<endl;
    	cout<<hash1[1][0]<<endl;
    	cout<<hash1[8][0]<<endl;
    	cout<<hash1[6][0]<<endl;
    	cout<<work1(1,6,0)<<endl;*/
    	while(m--){
    		int kk=read(),l1=read(),r1=read(),l2=read(),r2=read();
    		rep(i,0,25)ans[0][i]=ans[1][i]=0;
    		rep(i,0,25)ans2[0][i]=ans2[1][i]=0;
    		rep(i,0,25)f[i]=i;
    		while(kk--){
    			scanf("%s",ss);
    			f[find(ss[0]-'a')]=find(ss[1]-'a');
    		}
    		work(l1,r1,len1,ans[0],ans2[0]);
    		work(l2,r2,len2,ans[1],ans2[1]);
    		if(check())puts("YES");
    		else puts("NO");
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    B-树和B+树的应用:数据搜索和数据库索引【转】
    与网络编程相关的信号:
    Reactor构架模式
    EINTR错误
    通讯链路的检测方法
    背景减法——自组织算法
    数据结构7_链二叉树
    背景减法——Vibe
    操作系统2_进程控制
    操作系统1_进程控制块PCB
  • 原文地址:https://www.cnblogs.com/sssy/p/9439380.html
Copyright © 2020-2023  润新知