省選模擬16
阿新 • • 發佈:2022-02-16
考試考得沒有什麼感覺,可能是太難了吧
第一題,用線段樹分治優化掉了一個n,但是求答案的沒能優化掉
第二題,直接短路了,沒考慮全,打了個bfs就走了,於是只有30分
第三題,看出來了必須是一行或者一列這個結論,然鵝覺得那些分類討論忒難了,於是打了個全聯通的就溜號了,不告訴你我全聯通的都沒打對,其實不是沒打對,是忘記把2判掉了......
T1 數學題
所以說那句“題面上有演算法,別看,肯定不是正解!!”確實是有道理哈!
於是我在知道這句話的前提下......想找規律想了一個小時
後來想要開始打暴力了,一開始的暴力是\(\mathcal{n^5}\)的
然後想了想可以變成\(\mathcal{n^4}\)
就止步於此了,後來發現可以\(\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;
}