<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【比賽記錄】2025CSP-S模擬賽7

      看似如此,但是考試的只有 \(5\) 個人(

      A. k

      考慮從第 \(l\) 層的點 \(x\) 走到第 \(r\) 層的點 \(y\) 的過程,一定是 \(x\to \text{第 l 層的某個門}\to\text{第 r-1 層的某個門}\to y\)。門與門之間的距離顯然可以 dp,具體地,另 \(dp_{i,0/1}\) 表示走到第 \(i\) 層朝上 / 下的門的最短路。顯然可以用線段樹維護擴展矩陣乘來預處理。

      Code
      #include<bits/stdc++.h>
      #define int long long
      #define il inline
      #define lid id<<1
      #define rid id<<1|1
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int maxn=1e5+5;
      int n,m,px[maxn][2],py[maxn][2];
      struct juz{
      	int mat[2][2];
      	juz(){
      		memset(mat,0x3f,sizeof mat);
      	}
      	il int*operator[](int x){
      		return mat[x];
      	}
      	il juz operator*(juz x)const{
      		juz res;
      		for(int i=0;i<=1;i++){
      			for(int j=0;j<=1;j++){
      				for(int k=0;k<=1;k++){
      					res[i][j]=min(res[i][j],mat[i][k]+x[k][j]);
      				}
      			}
      		}
      		return res;
      	}
      }tr[maxn<<2];
      il int dis(int x1,int y1,int x2,int y2){
      	return abs(x1-x2)+abs(y1-y2);
      }
      il void pushup(int id){
      	tr[id]=tr[lid]*tr[rid];
      }
      il void build(int id,int l,int r){
      	if(l==r){
      		tr[id][0][0]=dis(px[l-1][0]+1,py[l-1][0],px[l][0],py[l][0])+1;
      		tr[id][0][1]=dis(px[l-1][0]+1,py[l-1][0],px[l][1],py[l][1])+1;
      		tr[id][1][0]=dis(px[l-1][1],py[l-1][1]+1,px[l][0],py[l][0])+1;
      		tr[id][1][1]=dis(px[l-1][1],py[l-1][1]+1,px[l][1],py[l][1])+1;
      		return ;
      	}
      	int mid=(l+r)>>1;
      	build(lid,l,mid);
      	build(rid,mid+1,r);
      	pushup(id);
      }
      il juz query(int id,int L,int R,int l,int r){
      	if(L>=l&&R<=r){
      		return tr[id];
      	}
      	int mid=(L+R)>>1;
      	if(r<=mid){
      		return query(lid,L,mid,l,r);
      	}
      	if(l>mid){
      		return query(rid,mid+1,R,l,r);
      	}
      	return query(lid,L,mid,l,r)*query(rid,mid+1,R,l,r);
      }
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      signed main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>n;
      	for(int i=1;i<n;i++){
      		cin>>px[i][0]>>py[i][0]>>px[i][1]>>py[i][1];
      	}
      	if(n>2){
      		build(1,2,n-1);
      	}
      	cin>>m;
      	while(m--){
      		int x1,y1,x2,y2;
      		cin>>x1>>y1>>x2>>y2;
      		int t1=max(x1,y1),t2=max(x2,y2);
      		if(t1>t2){
      			swap(x1,x2),swap(y1,y2),swap(t1,t2);
      		}
      		if(t1==t2){
      			int ans=dis(x1,y1,x2,y2);
      			cout<<ans<<"\n";
      		}
      		else if(t1+1==t2){
      			int ans=min(dis(x1,y1,px[t1][0],py[t1][0])+1+dis(px[t1][0]+1,py[t1][0],x2,y2),
      						dis(x1,y1,px[t1][1],py[t1][1])+1+dis(px[t1][1],py[t1][1]+1,x2,y2));
      			cout<<ans<<"\n";
      		}
      		else{
      			juz res=query(1,2,n-1,t1+1,t2-1);
      			int ans=min({dis(x1,y1,px[t1][0],py[t1][0])+res[0][0]+1+dis(px[t2-1][0]+1,py[t2-1][0],x2,y2),
      						 dis(x1,y1,px[t1][0],py[t1][0])+res[0][1]+1+dis(px[t2-1][1],py[t2-1][1]+1,x2,y2),
      						 dis(x1,y1,px[t1][1],py[t1][1])+res[1][0]+1+dis(px[t2-1][0]+1,py[t2-1][0],x2,y2),
      						 dis(x1,y1,px[t1][1],py[t1][1])+res[1][1]+1+dis(px[t2-1][1],py[t2-1][1]+1,x2,y2)});
      			cout<<ans<<"\n";
      		}
      	}
      	return 0;
      }
      }
      signed main(){return asbt::main();}
      

      B. kk

      設朝下照到第 \(i\) 塊板的光為 \(f_i\),向上照到的為 \(g_i\)。于是我們有 \(2n\) 個方程:

      \[\begin{cases} \begin{aligned} &f_1=1\\ &g_n=0\\ &\forall i\in[1,n-1],a_if_i+b_ig_i=f_{i+1}\\ &\forall i\in[2,n],b_if_i+a_ig_i=g_{i-1} \end{aligned} \end{cases} \]

      于是我們可以高斯消元,答案為 \(a_nf_n\),能得 \(50pts\)

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int mod=1e9+7;
      il int qpow(int x,int y){
      	int res=1;
      	while(y){
      		if(y&1){
      			res=res*1ll*x%mod;
      		}
      		x=x*1ll*x%mod,y>>=1;
      	}
      	return res;
      }
      const int inv100=qpow(100,mod-2);
      int n,a[105],b[105],f[205][205];
      il void gsjd(int x){
      	for(int i=1;i<=x;i++){
      		int tmp=qpow(f[i][i],mod-2);
      		for(int j=1;j<=x;j++){
      			if(j==i){
      				continue;
      			}
      			for(int k=i+1;k<=x+1;k++){
      				int t=f[i][k]*1ll*f[j][i]%mod*tmp%mod;
      //				cout<<i<<" "<<j<<" "<<k<<" "<<t<<"\n";
      //				cout<<f[i][k]<<" "<<f[j][i]<<" "<<tmp<<"\n";
      				(f[j][k]+=mod-t)%=mod;
      			}
      		}
      //		for(int i=1;i<=n*2;i++){
      //			for(int j=1;j<=n*2+1;j++){
      //				printf("%10d ",f[i][j]);
      //			}
      //			puts("");
      //		}
      //		puts("--------------------------------------------------------------");
      	}
      	for(int i=1;i<=x;i++){
      		f[i][x+1]=f[i][x+1]*1ll*qpow(f[i][i],mod-2)%mod;
      	}
      }
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>n;
      	for(int i=1;i<=n;i++){
      		cin>>a[i]>>b[i];
      		a[i]=a[i]*1ll*inv100%mod;
      		b[i]=b[i]*1ll*inv100%mod;
      	}
      	for(int i=1;i<=n;i++){
      		if(i<n){
      			f[i+1][i]=a[i],f[i+1][n+i]=b[i],f[i+1][i+1]=mod-1;
      		}
      		if(i>1){
      			f[n+i-1][i]=b[i],f[n+i-1][n+i]=a[i],f[n+i-1][n+i-1]=mod-1;
      		}
      	}
      	f[1][1]=1,f[1][2*n+1]=1;
      	f[2*n][2*n]=1;
      //	for(int i=1;i<=n*2;i++){
      //		for(int j=1;j<=n*2+1;j++){
      //			printf("%10d ",f[i][j]);
      //		}
      //		puts("");
      //	}
      //	puts("--------------------------------------------------------------");
      	gsjd(n*2);
      	cout<<f[n][n*2+1]*1ll*a[n]%mod;
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      考慮如何遞推。首先將第 \(4\) 個式子變一下形:

      \[\forall i\in[1,n-1],g_i=b_{i+1}f_{i+1}+a_{i+1}g_{i+1} \]

      那么由于 \(g_n=0\),所以 \(g_{n-1}=b_ng_n\)

      \(g_i\) 再帶入第三個式子,就可以求出 \(f_i\)\(f_n\) 的多少倍。于是倒著遞推,根據 \(f_1=1\) 就可以得出 \(f_n\)

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int maxn=5e5+5,mod=1e9+7;
      il int qpow(int x,int y){
      	int res=1;
      	while(y){
      		if(y&1){
      			res=res*1ll*x%mod;
      		}
      		x=x*1ll*x%mod,y>>=1;
      	}
      	return res;
      }
      const int inv100=qpow(100,mod-2);
      int n,a[maxn],b[maxn],f[maxn],g[maxn];
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>n;
      	for(int i=1;i<=n;i++){
      		cin>>a[i]>>b[i];
      		a[i]=a[i]*1ll*inv100%mod;
      		b[i]=b[i]*1ll*inv100%mod;
      	}
      	f[n]=1,g[n]=0;
      	for(int i=n-1;i;i--){
      		g[i]=(b[i+1]*1ll*f[i+1]+a[i+1]*1ll*g[i+1])%mod;
      		f[i]=(f[i+1]-b[i]*1ll*g[i]%mod+mod)*qpow(a[i],mod-2)%mod;
      	}
      	cout<<qpow(f[1],mod-2)*1ll*a[n]%mod;
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      C. kkk

      \(f_{i,j}\) 表示長為 \(i\),僅最后一位為 \(j\) 的序列的數量,\(g_i\) 表示長為 \(i\) 的序列的數量。考慮到一個數字 \(j\) 時,設小于等于 \(j\) 的數有 \(sum_j\) 個,那么有 \(i\le sum_j\)。那么我們先算出 \(f_{i,j}\) 的值,再累加貢獻給 \(g_i\) 即可。

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int maxn=3e3+5,mod=1e9+7;
      int n,a[maxn],cnt[maxn],sum[maxn],f[maxn][maxn],g[maxn];
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>n;
      	for(int i=1;i<=n;i++){
      		cin>>a[i];
      		cnt[a[i]]++;
      	}
      	for(int i=1;i<=n;i++){
      		sum[i]=sum[i-1]+cnt[i];
      	}
      	g[0]=1;
      	for(int j=1;j<=n;j++){
      		if(!cnt[j]){
      			continue;
      		}
      		for(int i=1;i<=sum[j];i++){
      			f[i][j]=g[i-1];
      		}
      		int tmp=0;
      		for(int i=1;i<=sum[j];i++){
      			(tmp+=f[i][j])%=mod;
      			(g[i]+=tmp)%=mod;
      		}
      	}
      	for(int i=1;i<=n;i++){
      		cout<<g[i]<<"\n";
      	}
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      D. kkkk

      \(f_i\) 表示欽定有 \(i\)\(|a_i-i|=K\) 的方案數。那么答案即為 \(\sum_{i=0}^{n}(-1)^{i}f_i\)

      考慮如何求 \(f_i\),首先設出 \(2n\) 個點,分別為 \(1,2,\dots,n,a_1,a_2,\dots,a_n\)\(i\)\(a_j\) 連邊表示 \(a_j=i\)。那么我們要做的其實就是連出 \(n\) 條形如 \(i\leftrightarrow a_j\) 的邊,使每個點的度都為 \(1\)。考慮 \(K\) 的限制,即形如 \(i\leftrightarrow a_{i+K}\)\(i\leftrightarrow a_{i-K}\) 的邊不能存在,意思就是我們欽定的就是這樣的邊。這些邊顯然會將這 \(2n\) 個點連成若干條鏈。那么我們將這些鏈放在一起 dp。具體地,設 \(dp_{i,j,0/1}\) 表示前 \(i\) 個點中連了 \(j\) 條邊,其中 \(i-1\)\(i\) 有沒有連邊的方案數。那么顯然有:

      \[\begin{align*} &dp_{i,j,0}=dp_{i-1,j,0}+dp_{i-1,j,1}\\ &dp_{i,j,1}=dp_{i-1,j-1,0}\\ &f_i=(dp_{2n,i,0}+dp_{2n,i,1})\times(n-i)! \end{align*} \]

      于是就結束了。注意上一條鏈的鏈尾和這一條鏈的鏈頭間是不能連邊的。

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int maxn=2e3+5,mod=924844033;
      int n,m,f[maxn<<1][maxn][2];
      bool vis[maxn][2],ban[maxn<<1];
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>n>>m;
      	int cnt=0;
      	for(int i=1;i<=n;i++){
      		for(int j=0;j<=1;j++){
      			if(vis[i][j]){
      				continue;
      			}
      			int x=i,d=j;
      			ban[cnt+1]=1;
      			do{
      				cnt++;
      				vis[x][d]=1;
      				x+=m,d^=1;
      			}while(x<=n);
      		}
      	}
      	for(int i=1;i<=n<<1;i++){
      		f[i][0][0]=1;
      		for(int j=1;j<=n;j++){
      			f[i][j][0]=(f[i-1][j][0]+f[i-1][j][1])%mod;
      			if(!ban[i]){
      				f[i][j][1]=f[i-1][j-1][0];
      			}
      		}
      	}
      	int ans=0;
      	for(int i=n,fac=1;~i;i--){
      		if(i&1){
      			(ans+=mod-(f[n<<1][i][0]+f[n<<1][i][1])*1ll*fac%mod)%=mod;
      		}
      		else{
      			(ans+=(f[n<<1][i][0]+f[n<<1][i][1])*1ll*fac%mod)%=mod;
      		}
      		fac=fac*1ll*(n-i+1)%mod;
      	}
      	cout<<ans;
      	return 0;
      }
      }
      int main(){return asbt::main();}
      
      posted @ 2025-05-18 14:33  zhangxy__hp  閱讀(37)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品午夜无码AV天美传媒| 一区二区偷拍美女撒尿视频| 亚洲 自拍 另类 欧美 综合| 久久精品人成免费| 国内精品久久久久影院薰衣草| 国产精品视频第一第二区| A毛片终身免费观看网站| 妺妺窝人体色www婷婷| 欧美丰满熟妇乱XXXXX网站| 重口SM一区二区三区视频| 午夜福利yw在线观看2020| 国产成人AV一区二区三区在线| 午夜天堂精品久久久久| 男女啪啪高潮激烈免费版| 亚洲av成人区国产精品| 老司机精品成人无码av| 日韩精品人妻av一区二区三区| 婷婷五月综合丁香在线| 中文丰满岳乱妇在线观看| 最新亚洲精品国偷自产在线| 噜噜噜噜私人影院| 亚洲国产一区二区三区最新| 亚洲国产成人久久精品软件| 宜兰市| 亚洲av免费成人精品区| 国产中文字幕精品喷潮| 伊人久久久大香线蕉综合直播| 国产午夜亚洲精品福利| 久久大香萑太香蕉av黄软件| 狠狠色噜噜狠狠狠狠2021| 中文字幕少妇人妻精品| 亚洲 小说区 图片区 都市| 欧美一区二区三区在线观看| 深夜视频国产在线观看| 国产精品七七在线播放| 亚洲国产成人av在线观看| 日韩V欧美V中文在线| 国产成人久久精品二区三| 人妻少妇不满足中文字幕| 免费人成网站免费看视频| 精品国产成人网站一区在线|