洛谷 3 月月赛 I & WFOI Round 2 Div.2 蒟蒻记
【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; 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 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> using namespace 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分后跑路。。。。。
This is your dream.Anything you can dream,you can do it now.