洛谷 3 月月賽 I & WFOI Round 2 Div.2 蒟蒻記
阿新 • • 發佈:2022-03-19
【LGR-104】洛谷 3 月月賽 I & WFOI Round 2 Div.2 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
第一次參加洛谷月賽,然後就白給了80分。。。。。。
原因是T3拿了80分後一直在特判最後一個點,然後有一次爆零了,然後????
IOI賽制按最後一次提交算分,然後按0分給我算的。。。。。。。
血虧,不然總分310,能拿第60多的TAT
長個記性吧,IOI賽制一定最後再交一次
T1,超級大水題,結果我想了足足30分鐘
#include <bits/stdc++.h> using namespace std; const int M = 1e7; typedeflong long ll; inline ll read(){ ll x=0,f=0;char c=getchar(); while(!isdigit(c)){ if(c=='-') f=1; c=getchar(); } do{ x=(x<<1)+(x<<3)+(c^48); }while(isdigit(c=getchar())); return f?-x:x; } inline void print(ll x){ if(x<0) putchar('-'),x=-x;if(x>9) print(x/10);putchar(x%10^48); } ll l,r; int main(){ l=read();r=read(); if(r%2){ printf("%lld",(r-1)/2); } else{ printf("%lld",r/2); } return 0; }
不開long long 見祖宗
T2,細節挺多的,值得注意的是a!=1,c可以>n
最重要的是圖不止n*n那麼大,所以可以從>n的行繞道
#include <bits/stdc++.h> usingnamespace std; const int M = 1e7; typedef long long ll; inline ll read(){ ll x=0,f=0;char c=getchar(); while(!isdigit(c)){ if(c=='-') f=1; c=getchar(); } do{ x=(x<<1)+(x<<3)+(c^48); }while(isdigit(c=getchar())); return f?-x:x; } inline void print(ll x){ if(x<0) putchar('-'),x=-x; if(x>9) print(x/10);putchar(x%10^48); } ll n,a,b,c; int main(){ n=read();a=read();b=read();c=read(); if(c>=n){ ll base=n-1+n+(b-a+1); ll ac=n-1+n+(c+1-n)*2; printf("%lld",min(ac,base)); } else{ printf("%lld",2*n-1); } return 0; }
T3 就是暴力模擬就行了,然我一個點死活過不去,最後資料點分治過的。。。。
基本思路就是對於兩行,保持第一行為1-m,第二行為m-1,對於每個不在相應位置的數字,可以換列,也可以把另一行換行後再換列,每次還完後,i迴圈回到1,知道i迴圈跑夠m個,最後把第二行換行即可
然而我不好好swap,非要用指標亂指—_—,結果白耽誤幾個小時
所以趕緊大模擬啊啊啊啊啊啊
#include <bits/stdc++.h> using namespace std; const int M = 1e7; typedef long long ll; inline int read(){ int x=0,f=0;char c=getchar(); while(!isdigit(c)){ if(c=='-') f=1; c=getchar(); } do{ x=(x<<1)+(x<<3)+(c^48); }while(isdigit(c=getchar())); return f?-x:x; } inline void print(int x){ if(x<0) putchar('-'),x=-x; if(x>9) print(x/10);putchar(x%10^48); } int Map[105][105]; queue < pair<int,int> > q; int n,m,cnt; int res[105]; int flag; inline int Switch(int pos){ return m+1-pos; } inline bool choose(int x){ if(x==0) return true; if(x%2==0) return true; return false; } void swaprow(int x){ for(int i=1;i<=m/2;i++) swap(Map[x][i],Map[x][m+1-i]); } void swapcol(int x){ for(int i=1;i<=n/2;i++) swap(Map[i][x],Map[n+1-i][x]); } void work(int up,int down){//所在行 for(int i=1;i<=m;i++){ int k=0; if(Map[up][i]!=i){ //換上行 if(Map[down][i]==i){//上下換,反轉列 q.push(make_pair(1,i)); cnt++; swapcol(i); } else if(Map[down][m+1-i]==i){ q.push(make_pair(0,down)); swaprow(down); q.push(make_pair(1,i)); swapcol(i); cnt+=2; } else{ flag=1;return; } k=1; } if(Map[down][i]!=Switch(i)){ //換上行 if(Map[up][i]==Switch(i)){//上下換,反轉列 q.push(make_pair(1,i)); cnt++; swapcol(i); } else if(Map[up][m+1-i]==Switch(i)){ q.push(make_pair(0,up)); swaprow(up); q.push(make_pair(1,i)); swapcol(i); cnt+=2; } else{ flag=1;return; } k=1; } if(k==1) i=0; } swaprow(down); q.push(make_pair(0,down)); cnt++; } int vis[M]; int main(){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); n=read();m=read(); if(n==1) flag=1; if(n%2||m%2) flag=1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ Map[i][j]=read(); vis[Map[i][j]]++; if(Map[i][j]>m) flag=1; if(j!=Map[i][j]&&m+1-j!=Map[i][j]) flag=true; } } for(int i=1;i<=m;i++){ if(vis[i]!=n) flag=1; } if(flag||(n==4&&m==2)){ cout<<"NO";return 0; } else cout << "YES" <<endl; for(int i=1;i<=n/2;i++){ work(i,n-i+1); if(flag){ cout <<"NO";return 0; } } printf("%d\n",cnt); while(!q.empty()){ printf("%d %d\n",q.front().first,q.front().second); q.pop(); } return 0; }
T4 不會,輸出3拿了30分後跑路。。。。。