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

posted @ 2022-03-19 20:12  blue_tsg  阅读(57)  评论(0编辑  收藏  举报