2022.4.23———HZOI【高一普及组模拟赛2】爆蛋寄

T1 循环,T2 漫步,T3 穿越,T4 结队

成绩综述,,,

gtm大佬太强了%%%

 

28名/40人

我太逊了qAq

题((

我太逊了所以我就把我代码粘过来吧,,,

T1 循环
题目

 

照理讲,应该都会罢,,这似乎不是什么数论,直接暴力就行,一百次之内应该是必出结果

不要问我为什么只用取输入的数组的后两位,因为是%100,取后边两位就可以,然后搞一个vis数组记录每个数字是否出现过(直接硬乘应该会爆longlong?

然后x^3 = x^2 * x,这个应该能看懂,所以直接"援引"上一次的结果乘

Code
查看代码
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<algorithm>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define char_phi signed
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("💤")
#define _ putchar(' ')
#define endl putchar('\n')
#define iwh printf("我永远爱朱文虎")
#define mx 105
using namespace std;
// bool flag;
int x;
int vis[mx];
inline int read(){
    int x = 0;char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
void ot(int x){
    if(x < 0) x = - x,putchar('-');
    if(x > 9) ot(x / 10);
    putchar(x % 10 ^ 48);
}

void work(){
    //唉唉,我枚举了一小下,不过也可能不对。。
    //应该是对的吧
    /*
    数太大,虽然mod但有可能爆long long甚么的
    所以取后边两位,然后vis数组?
    别的不清楚了。。
    */
    x = read(),x %= 100,ot(x),_,vis[1] = x;
    re i = 1,tmp = x;
    //又有了一个小启示,直接援引上一次的就行
    while(1){
        ++ i;
        tmp *= x,tmp %= 100;
        vis[i] = tmp;
        ot(tmp),_;
        for(re j = 1 ; j < i ; ++ j){
            if(vis[j] == tmp){
                // endl;
                // for(re k = 1 ; k <= 13 ; ++ k) ot(vis[k]),_;
                exit(0);
            }
        }
    }
}
char_phi main(){
    freopen("number.in","r",stdin);
    freopen("number.out","w",stdout);
    work();
    return 0;
}
T2 漫步

 

这个也是一个水题,从最后往前面遍历,每次查看能否更新最小值,能的话就更新同时final_ans++

呃呃final_ans初始化为1,然后从倒数第二个人往前搜,我反正觉得这么保险所以这么写了,,,

至于为什么从后往前搜更新最小值就能出答案,这个自己枚举枚举就出来了,速度大的肯定能追上在他前面的速度小的

然后输入的那个"d"没啥用,因为他说了是递增给出的d

Code
查看代码
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<algorithm>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define char_phi signed
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("💤")
#define _ putchar(' ')
#define endl putchar('\n')
#define iwh printf("我永远爱朱文虎")
#define MIN(X,Y) ((X<Y)?(X):(Y))
#define N 100005
using namespace std;
int n,final_ans = 1,lit;
int a[N];
inline int read(){
    int x = 0;char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
void ot(int x){
    if(x < 0) x = - x,putchar('-');
    if(x > 9) ot(x / 10);
    putchar(x % 10 ^ 48);
}
void work(){
    /*
    唉唉,题目说的有一丢丢隐晦,我也不大清楚
    希望能多有几个样例、、、
    嗐,我就按我觉得的做罢:
    我似乎读明白了。。
    先遍历一遍找出最小值
    记录最小速度的cnt 还有位置
    然后先把每两个cnt之间的归并为一组
    然后判断一下最后一个的cnt是否在最后一个位置,不在就继续在这个位置往后的找次小的,一直找,这个有点点难实现()()
    距离既然是递增的没啥用,就直接按i标号了,也不用管
    其实还想分块做,,,唉唉,分块不分块么,谁来管这等事...
    阿!分块?我觉得没啥必要。。?
    时间复杂度(我是蒟蒻瞎分析的) O()
    update:
    cnt不用了,节省一点可能的空间(bushi) 直接++final_ans
    */
    //我忽然地觉得我很傻,直接从后面往前面遍历不久完了吗?!
    /*
    唉唉,样例不样例呢。。。按照自己的想法造的数据点,不知道对不对阿。。。
    */
    n = read();
    for(re i = 1 ; i <= n ; ++ i) read(),a[i] = read();
    // ,lit = MIN(lit,a[i])
    // plc = n;
    // for(re i = 1 ; i <= n ; ++ i) if(a[i] == lit) ++ final_ans,litplc = i;
    // if(litplc != n){
    //     lit = a[n],++ final_ans;
    //     for(re i = n ; i >= litplc ; -- i){
    //         if(a[i] <= lit){
    //             ++ final_ans;
    //         }
    //     }
    // }
    lit = a[n];
    // for(re i = 1 ; i <= n ; ++ i) SLEEP,ot(a[i]),_;
    // endl;
    // ot(lit);
    for(re i = n-1 ; i >= 1 ; -- i){
        // SLEEP,ot(a[i]),_,ot(lit),endl;
        if(a[i] <= lit){
            // MARK,ot(i),endl;
            lit = a[i];
            ++ final_ans;
        }
    }
    ot(final_ans);
}
char_phi main(){
    freopen("jog.in","r",stdin);
    freopen("jog.out","w",stdout);
    work();
    return 0;
}
T3 穿越

特殊性质 3:地图中没有传送地域。

我这个题只是隐隐约约地看了看题解写了出来,还是比较简单的,不过毕竟BFS码量。。

Code
Code

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<algorithm>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define char_phi signed
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("💤")
#define _ putchar(' ')
#define endl putchar('\n')
#define iwh printf("我永远爱朱文虎")
#define MINN(X,Y) ((X<Y)?(X):(Y))
#define mx 303
#define T 90003
using namespace std;
int ud[6] = {0,1,-1,0,0},lr[6] = {0,0,0,1,-1};
int n,m,R,ANI;
int X[T],Y[T];
int s[mx][mx],rain[mx][mx],timm[mx][mx];
struct chuan{
    int x,y;
}c[T];
struct animal{
    int l,r;
}an[mx][mx];
inline int read(){
    int x = 0;char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
void ot(int x){
    if(x < 0) x = - x,putchar('-');
    if(x > 9) ot(x / 10);
    putchar(x % 10 ^ 48);
}
inline int getw(int nxtx,int nxty,int t,int oldx,int oldy){
    if(an[nxtx][nxty].l <= t && t <= an[nxtx][nxty].r){//下一步有野兽
        int _waittime = an[nxtx][nxty].r + 1;
        if(rain[oldx][oldy] != 0 && rain[oldx][oldy] <= _waittime){//等的时候被暴雨淦了
            return 114514;//够大吗这数
        }
        if(an[oldx][oldy].l <= _waittime && _waittime <= an[oldx][oldy].r){//等的时候自己的地方野兽醒了
            return 114514;
        }
        return (_waittime - t);
    }
    return 0;//下一秒野兽不会醒,不用等着
}
void bfs(int x,int y){
    int ft = 0,bk = 1;//模拟队列罢
    // ot(x),_,ot(y),endl;
    X[bk] = x,Y[bk] = y;
    // ot(X[ft]),_,ot(Y[ft]),endl;
    // ot(X[bk]),_,ot(Y[bk]),endl;
    while(ft < bk){
        ++ ft;
        // SLEEP,ot(ft),_,ot(bk),endl;
        if(s[X[ft]][Y[ft]] == 3){//当前地方是传送门
            for(re i = 1 ; i <= c[0].x ; ++ i){
                // SLEEP,ot(c[0].x);
                if(rain[c[i].x][c[i].y] != 0 && rain[c[i].x][c[i].y] <= timm[X[ft]][Y[ft]]+2) continue;//大雨
                if(timm[c[i].x][c[i].y] == 0){
                    timm[c[i].x][c[i].y] = timm[X[ft]][Y[ft]] + 2;
                    ++ bk;
                    X[bk] = c[i].x,Y[bk] = c[i].y;
                }
                else if(timm[c[i].x][c[i].y] != 0){///
                    if(timm[c[i].x][c[i].y] > timm[X[ft]][Y[ft]] + 2){
                        timm[c[i].x][c[i].y] = timm[X[ft]][Y[ft]] + 2;
                        ++ bk;
                        X[bk] = c[i].x,Y[bk] = c[i].y;
                    }
                }
            }
        }
        // SLEEP,endl;
        for(re i = 1 ; i <= 4 ; ++ i){//1下2上3右4左
                // MARK,ot(X[ft]),_,ot(Y[ft]),_,ot(x),_,ot(y),endl;
                // iwh,ot(ud[i]),_,ot(lr[i]),endl;
            x = X[ft] + ud[i];
            y = Y[ft] + lr[i];//上下左右走一步
                // LMARK,ot(x),_,ot(y),endl;
            if(x <= 0 || y <= 0 || x > n || y > m){//草!>n >m!不是>=
                continue;
            }
            if(s[x][y] == 1){
                continue;
            }
                // _MARK,endl;
            if(s[x][y] == 2){//野兽
                int waittime = getw(x,y,timm[X[ft]][Y[ft]] + 1,X[ft],Y[ft]);
                if(waittime == 114514) continue;
                else{
                    if(timm[x][y] == 0 && (x != 1 || y != 1)){///
                        ++ bk;
                        X[bk] = x,Y[bk] = y;
                        timm[x][y] = timm[X[ft]][Y[ft]] + waittime + 1;///
                    }
                    else{
                        if(timm[x][y] > timm[X[ft]][Y[ft]] + waittime + 1){///
                            timm[x][y] = timm[X[ft]][Y[ft]] + waittime + 1;
                            ++ bk;
                            X[bk] = x,Y[bk] = y;
                        }
                    }
                }
            }
            else if(s[x][y] == 0 || s[x][y] == 3){///下一步空地 传送门///
                if(timm[x][y] == 0 && (x != 1 || y != 1)){///
                    ++ bk;
                    X[bk] = x,Y[bk] = y;
                    timm[x][y] = timm[X[ft]][Y[ft]] + 1;
                }
                else if(x != 1 || y != 1){///
                    if(timm[x][y] > timm[X[ft]][Y[ft]]+1){
                        ++ bk;
                        X[bk] = x,Y[bk] = y;
                        timm[x][y] = timm[X[ft]][Y[ft]] + 1;
                    }
                }
            }
        }
    }
}
void work(){
    //唉唉,神奇的广搜阿...只觉得天地间的众算法接受了人间的牲?(忘了那个字了),要给予衡实的人们以无限的幸福。
    //"阿!广搜?"我浑身震悚起来,只得支梧着,"广搜...照理讲,也就该搜。然而也未必,谁来管这等事..."
    //time是关键字。。。
    n = read(),m = read();
    for(re i = 1 ; i <= n ; ++ i){
        for(re j = 1 ; j <= m ; ++ j){
            s[i][j] = read();
            if(s[i][j] == 3){
                c[++c[0].x].x = i;
                c[c[0].x].y = j;
            }
        }
    }
    R = read();
    for(re i = 1,tt,few,XAXA,XAY ; i <= R ; ++ i){//XAXA,XAY,嗐雌性雄性显性纯合子(bushi)
        tt = read(),few = read();
        for(re j = 1 ; j <= few ; ++ j){
            XAXA = read(),XAY = read();
            //////////////////////////////////////////////////////
            rain[XAXA][XAY] = tt;//加入隐性纯合子()()()()()()()
        }
    }
    ANI = read();
    for(re i = 1,XAXA,XAY,LL,RR ; i <= ANI ; ++ i){
        LL = read(),RR = read(),XAXA = read(),XAY = read();
        an[XAXA][XAY].l = LL,an[XAXA][XAY].r = RR;//我傻了 刚才输入错了
    }
    // for(re i = 1 ; i <= 4 ; ++ i){
    //     for(re j = 1 ; j <= 4 ; ++ j){
    //         SLEEP,ot(i),_,ot(j),_,ot(rain[i][j]),endl;
    //     }
    // }
    bfs(1,1);
    // iwh,endl;
    // for(re i = 0 ; i <= 5 ; ++ i){
    //     for(re j = 0 ; j <= 5 ; ++ j){
    //         ot(timm[i][j]),_;
    //     }
    //     endl;
    // }
    ot(timm[n][m]);
}
char_phi main(){
    freopen("cross.in","r",stdin);
    freopen("cross.out","w",stdout);
    work();
    return 0;
}
T4 结队

 

 

这个是一个并查集+质数判断,比较烦人的是我考试的时候没打出来。。甚至暴力都没打,,随机数划了个水就跑去肝T3了。。

Code
查看代码
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<ctime>
#include<vector>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define char_phi signed
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("💤")
#define _ putchar(' ')
#define endl putchar('\n')
#define iwh printf("我永远爱朱文虎")
#define mx 50005
#define ss 5150
using namespace std;
int A,B,p,final_ans;
// int a[mx][ss];//照理讲,也不应超内存,唉唉,谁来管这等事...
// int belong[mx];
int fa[mx];
vector<int> vc[mx];
inline int read(){
    int x = 0;char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
void ot(int x){
    if(x < 0) x = - x,putchar('-');
    if(x > 9) ot(x / 10);
    putchar(x % 10 ^ 48);
}
int tmp;
int find(int x){
    if(fa[x] == x) return x;
    else return fa[x] = find(fa[x]);
}
inline void prime(int x){
    // tmp = x;
    // for(re i = 1 ; i <= x ; ++ i){//
    //     if(tmp % zs[i] == 0){
    //         vc[zs[i]].push_back(x);//把x加入属于素数a[i]行列的
    //         while(tmp % zs[i] == 0){
    //             tmp /= zs[i];
    //         }
    //     }
    // }
    // if(tmp > 1){
    //     vc[tmp].push_back(x);
    // }
    tmp = x;
    /*
    没想到我的打表出了错!
    鲁四:可恶!然而......
    */
    for(re i = 2 ; i <= sqrt(x)+1 ; ++ i){
        if(tmp % i == 0){
            vc[i].push_back(x);
            while(tmp % i == 0){
                tmp /= i;
            }
        }
    }
    if(tmp > 1){
        vc[tmp].push_back(x);
    }
}
void work(){
    /*
    我太逊了,我甚至觉得这是线段树合并,但是我太逊了我不会
    所以先跑一个类似于筛素数甚么的,先把每个素数在这个区间里的都给整出来
    筛素数的话,,我觉得最大的素数是49999本身?
    这个可以先打一个素数表(doge)
    然后再[a,b]区间里对素数进行投影,%=也行吧,,,
    */
    //并查集,,刚开始有这感觉,但是没敢写当然我太逊了也不会写,然后wudi昨天晚上睡觉的时候指点了一下,让我们一起说:谢谢wudi
    A = read(),B = read(),p = read();
    for(re i = 1 ; i <= B ; ++ i) fa[i] = i;
    for(re i = A ; i <= B ; ++ i){
        prime(i);
    }
    for(re i = B,siz,mainn ; i >= p ; -- i){
        siz = vc[i].size();
        if(siz == 0) continue;
        mainn = find(vc[i][0]);
        for(re j = 1,bing ; j <= siz-1 ; ++ j){
            bing = find(vc[i][j]);
            fa[bing] = mainn;
        }
    }
    for(re i = A ; i <= B ; ++ i){
        if(fa[i] == i){
            ++ final_ans;
        }
    }
    ot(final_ans);
}
char_phi main(){
    freopen("merge.in","r",stdin);
    freopen("merge.out","w",stdout);
    work();
    return 0;
}

 

唉唉,考的一般般,,还是得加油啊!

 

posted @   char_phi  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示