1. 程式人生 > 其它 >洛谷 3 月月賽 I & WFOI Round 2 Div.2 蒟蒻記

洛谷 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分後跑路。。。。。