1. 程式人生 > 其它 >省選模擬16

省選模擬16

考試考得沒有什麼感覺,可能是太難了吧

第一題,用線段樹分治優化掉了一個n,但是求答案的沒能優化掉

第二題,直接短路了,沒考慮全,打了個bfs就走了,於是只有30分

第三題,看出來了必須是一行或者一列這個結論,然鵝覺得那些分類討論忒難了,於是打了個全聯通的就溜號了,不告訴你我全聯通的都沒打對,其實不是沒打對,是忘記把2判掉了......

T1 數學題

所以說那句“題面上有演算法,別看,肯定不是正解!!”確實是有道理哈!

於是我在知道這句話的前提下......想找規律想了一個小時

後來想要開始打暴力了,一開始的暴力是\(\mathcal{n^5}\)

然後想了想可以變成\(\mathcal{n^4}\)

,然後又想了想變成了\(\mathcal{n^3logn}\)

就止步於此了,後來發現可以\(\mathcal{O(1)}\)的到是否可以合成新數

AC_code
#include<bits/stdc++.h>
using namespace std;
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
	int s=0,t=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
	return s*t;
}
const int N=1005;
int n,m,bas;char ch[N];
bitset<N> lba[N],sta[N],bit[N],tmp,con;
int cba,vba[N],ans[N][N];
int ins(){
	fo(i,1,m){
		if(!tmp[i])continue;
		if(vba[i])tmp^=lba[i];
		else {
			lba[i]=tmp;vba[i]=1;cba++;sta[i][i]=1;
			fo(j,i+1,m)if(vba[j]&&lba[i][j])lba[i]^=lba[j],sta[i]^=sta[j];
			fo(j,1,i-1)if(vba[j]&&lba[j][i])lba[j]^=lba[i],sta[j]^=sta[i];
			return i;
		}
	}return 0;
}
void del(int x){
	fo(i,1,m)if(i!=x&&vba[i]&&sta[i][x])lba[i]^=lba[x],sta[i]^=sta[x];
	fo(i,1,m)if(i!=x&&vba[i]&&sta[x][i])lba[x]^=lba[i],sta[x]^=sta[i];
	lba[x].reset();cba--;vba[x]=0;sta[x][x]=0;
}
struct XDS{
	#define ls x<<1
	#define rs x<<1|1
	vector<int> vec[N*4],ji[N*4];
	void insert(int x,int l,int r,int ql,int qr,int id){
		if(ql>qr)return ;
		if(ql<=l&&r<=qr)return vec[x].push_back(id),void();
		int mid=l+r>>1;
		if(ql<=mid)insert(ls,l,mid,ql,qr,id);
		if(qr>mid)insert(rs,mid+1,r,ql,qr,id);
	}
	void dfs(int x,int l,int r){
		for(int i:vec[x])tmp=bit[i],ji[x].push_back(ins());
		if(l==r){
			tmp=bit[l];int ret=ins();con.reset();
			if(!ret){fo(i,1,m)ans[l][i]=!(lba[i].count()==1);}
			else {
				fo(i,1,m)con[i]=(lba[i].count()==1);del(ret);
				fo(i,1,m)ans[l][i]=-(!(lba[i].count()==1)&&con[i]);
			}
			for(int i:ji[x])if(i){del(i);}
			return ;
		}
		int mid=l+r>>1;dfs(ls,l,mid);dfs(rs,mid+1,r);
		for(int i:ji[x])if(i){del(i);}
	}
	#undef ls
	#undef rs
}xds;
signed main(){
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);
	n=read();m=read();//tmp.reset();cout<<tmp[0]<<endl;
	fo(i,1,n){
		scanf("%s",ch+1);
		fo(j,1,m)bit[i][j]=ch[j]-'0';
	}
	fo(i,1,n)tmp=bit[i],ins();bas=cba;
	fo(i,1,m)if(vba[i])del(i);
	fo(i,1,n){
		xds.insert(1,1,n,1,i-1,i);
		xds.insert(1,1,n,i+1,n,i);
	}
	xds.dfs(1,1,n);
	fo(i,1,n){
		fo(j,1,m){
			if(ans[i][j]==0)printf("0");
			else if(ans[i][j]<0)printf("-");
			else if(ans[i][j]>0)printf("+");
		}
		printf("\n");
	}
	return 0;
}

T2 構造題

一個非常暴力的思路就是撿著最小的可以填的顏色填,直接廣搜就行了,但是很難保證正確性

於是我們想到一個更暴力的但是有點慢的做法,既然選最小的不能保證正確性,那我們就一位一位的搜填什麼顏色,然而你以為這樣會爆蛋,事實證明他切掉了,但是我一條鏈就給他卡沒了,完全鏈

然後我們發現這個4就非常的離奇,考慮出題人為啥要給座標,並且規定了斜率??

其實就是告訴你一個點最多連八條邊,不可能出現四個點以上的子完全圖

於是我們按照座標排序,這樣對邊定向,一個點最多4條入遍,那麼我們一旦碰到沒法選的,直接搜回去...

上面純屬口胡,不要看了,我寫的是第二種

AC_code
#include<bits/stdc++.h>
using namespace std;
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
	int s=0,t=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
	return s*t;
}
const int N=1e4+5;
int n,m,k,ans[N];
struct E{int to,nxt;}e[N*2*2];
int head[N],rp;
void add_edg(int x,int y){e[++rp].to=y;e[rp].nxt=head[x];head[x]=rp;}
int lim[N][6];
void dfs(int x){
	if(x==n+1){
		fo(i,1,n)printf("%d\n",ans[i]);
		exit(0);
	}
	for(int i=head[x];i;i=e[i].nxt)lim[x][ans[e[i].to]]=1;
	fo(i,1,k)if(!lim[x][i])ans[x]=i,dfs(x+1);ans[x]=0;
	fo(i,1,k)lim[x][i]=0;
}
signed main(){
	freopen("construct.in","r",stdin);
	freopen("construct.out","w",stdout);
	n=read();m=read();k=read();
	fo(i,1,n){
		int x=read(),y=read();
	}
	fo(i,1,m){
		int x=read(),y=read();
		add_edg(x,y);add_edg(y,x);
	}
	dfs(1);
	return 0;
}

T3 網格圖構造題

不會,只會一個全聯通的,而且寫的賊麻煩......

AC_code
#include<bits/stdc++.h>
using namespace std;
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
	int s=0,t=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
	return s*t;
}
const int N=4e5+5;
int n,m,k;
vector<int> ans[N];
struct LIM{int xa,ya,xb,yb,b;}lim[N];
void all(int xs,int ys,int xt,int yt){
	int nn=xt-xs+1,mm=yt-ys+1;
	int xx=xs-1,yy=ys-1;
	if(nn&1){
		if((nn>>1)&1){
			for(int j=1;j*2<=mm;j++){
				if(j&1){
					for(int i=1;i*2<=nn;i++){
						if(i&1){
							ans[i*2-1+xx][j*2-1+yy]=2;
							ans[i*2-1+xx][j*2+yy]=2;
							ans[i*2+xx][j*2-1+yy]=1;
							ans[i*2+xx][j*2+yy]=1;
						}
						else {
							ans[i*2-1+xx][j*2-1+yy]=4;
							ans[i*2-1+xx][j*2+yy]=3;
							ans[i*2+xx][j*2-1+yy]=4;
							ans[i*2+xx][j*2+yy]=3;
						}
					}
					ans[xt][j*2-1+yy]=4;ans[xt][j*2+yy]=3;
				}
				else {xx++;
					for(int i=nn>>1;i;i--){
						if(((nn>>1)-i+1)&1){
							ans[i*2-1+xx][j*2-1+yy]=2;
							ans[i*2-1+xx][j*2+yy]=2;
							ans[i*2+xx][j*2-1+yy]=1;
							ans[i*2+xx][j*2+yy]=1;
						}
						else {
							ans[i*2-1+xx][j*2-1+yy]=4;
							ans[i*2-1+xx][j*2+yy]=3;
							ans[i*2+xx][j*2-1+yy]=4;
							ans[i*2+xx][j*2+yy]=3;
						}
					}xx--;
					ans[xs][j*2-1+yy]=4;ans[xs][j*2+yy]=3;
				}
			}
		}
		else {
			for(int j=1;j*2<=mm;j++){
				if(j&1){
					for(int i=1;i*2<=nn;i++){
						if(i&1){
                            ans[i*2-1+xx][j*2-1+yy]=4;
							ans[i*2-1+xx][j*2+yy]=3;
							ans[i*2+xx][j*2-1+yy]=4;
							ans[i*2+xx][j*2+yy]=3;
						}
						else {
							ans[i*2-1+xx][j*2-1+yy]=2;
							ans[i*2-1+xx][j*2+yy]=2;
							ans[i*2+xx][j*2-1+yy]=1;
							ans[i*2+xx][j*2+yy]=1;
						}
					}
					ans[xt][j*2-1+yy]=4;ans[xt][j*2+yy]=3;
				}
				else {xx++;
					for(int i=nn>>1;i;i--){
						if(((nn>>1)-i+1)&1){
							ans[i*2-1+xx][j*2-1+yy]=4;
							ans[i*2-1+xx][j*2+yy]=3;
							ans[i*2+xx][j*2-1+yy]=4;
							ans[i*2+xx][j*2+yy]=3;
						}
						else {
							ans[i*2-1+xx][j*2-1+yy]=2;
							ans[i*2-1+xx][j*2+yy]=2;
							ans[i*2+xx][j*2-1+yy]=1;
							ans[i*2+xx][j*2+yy]=1;
						}
					}xx--;
					ans[xs][j*2-1+yy]=4;ans[xs][j*2+yy]=3;
				}
			}
		}
	}
    else if(mm&1){
        if((mm>>1)&1){
			for(int i=1;i*2<=nn;i++){
				if(i&1){
					for(int j=1;j*2<=mm;j++){
						if(j&1){
							ans[i*2-1+xx][j*2-1+yy]=4;
							ans[i*2-1+xx][j*2+yy]=3;
							ans[i*2+xx][j*2-1+yy]=4;
							ans[i*2+xx][j*2+yy]=3;
						}
						else {
							ans[i*2-1+xx][j*2-1+yy]=2;
							ans[i*2-1+xx][j*2+yy]=2;
							ans[i*2+xx][j*2-1+yy]=1;
							ans[i*2+xx][j*2+yy]=1;
						}
					}
                    ans[i*2-1+xx][yt]=2;ans[i*2+xx][yt]=1;
				}
				else {yy++;
					for(int j=mm>>1;j;j--){
						if(((mm>>1)-j+1)&1){
							ans[i*2-1+xx][j*2-1+yy]=4;
							ans[i*2-1+xx][j*2+yy]=3;
							ans[i*2+xx][j*2-1+yy]=4;
							ans[i*2+xx][j*2+yy]=3;
						}
						else {
							ans[i*2-1+xx][j*2-1+yy]=2;
							ans[i*2-1+xx][j*2+yy]=2;
							ans[i*2+xx][j*2-1+yy]=1;
							ans[i*2+xx][j*2+yy]=1;
						}
					}yy--;
					ans[i*2-1+xx][ys]=2;ans[i*2+xx][ys]=1;
				}
			}
		}
		else {
			for(int i=1;i*2<=nn;i++){
				if(i&1){
					for(int j=1;j*2<=mm;j++){
						if(j&1){
                            ans[i*2-1+xx][j*2-1+yy]=4;
							ans[i*2-1+xx][j*2+yy]=3;
							ans[i*2+xx][j*2-1+yy]=4;
							ans[i*2+xx][j*2+yy]=3;
						}
						else {
							ans[i*2-1+xx][j*2-1+yy]=2;
							ans[i*2-1+xx][j*2+yy]=2;
							ans[i*2+xx][j*2-1+yy]=1;
							ans[i*2+xx][j*2+yy]=1;
						}
					}
					ans[i*2-1+xx][yt]=2;ans[i*2+xx][yt]=1;
				}
				else {yy++;
					for(int j=mm>>1;j;j--){
						if(((mm>>1)-j+1)&1){
							ans[i*2-1+xx][j*2-1+yy]=4;
							ans[i*2-1+xx][j*2+yy]=3;
							ans[i*2+xx][j*2-1+yy]=4;
							ans[i*2+xx][j*2+yy]=3;
						}
						else {
							ans[i*2-1+xx][j*2-1+yy]=2;
							ans[i*2-1+xx][j*2+yy]=2;
							ans[i*2+xx][j*2-1+yy]=1;
							ans[i*2+xx][j*2+yy]=1;
						}
					}yy--;
					ans[i*2-1+xx][ys]=2;ans[i*2+xx][ys]=1;
				}
			}
		}
    }
    else {
        fo(i,1,nn>>1)fo(j,1,m>>1){
            if((i&1)==(j&1)){
                ans[i*2-1+xx][j*2-1+yy]=4;
		        ans[i*2-1+xx][j*2+yy]=3;
				ans[i*2+xx][j*2-1+yy]=4;
				ans[i*2+xx][j*2+yy]=3;
            }
            else {
                ans[i*2-1+xx][j*2-1+yy]=2;
				ans[i*2-1+xx][j*2+yy]=2;
				ans[i*2+xx][j*2-1+yy]=1;
				ans[i*2+xx][j*2+yy]=1;          
            }
        }
    }
}
signed main(){
	freopen("grid.in","r",stdin);
	freopen("grid.out","w",stdout);
	n=read();m=read();k=read();
	fo(i,1,n)ans[i].reserve(m+5),ans[i].resize(m+3);
	bool fl=true;
	fo(i,1,k){
		lim[i].xa=read();lim[i].ya=read();lim[i].xb=read();lim[i].yb=read();lim[i].b=read();
		if(!lim[i].b)fl=false;
	}
	if(fl){
		all(1,1,n,m);
		if((n==2||m==2)&&k>1){printf("-1");return 0;}
		fo(i,1,n){
			fo(j,1,m){
				if(ans[i][j]==1)printf("U");
				if(ans[i][j]==2)printf("D");
				if(ans[i][j]==3)printf("L");
				if(ans[i][j]==4)printf("R");
			}
			printf("\n");
		}return 0;
	}
	return 0;
}
QQ:2953174821