2024 蓝桥杯模拟赛 2 (div1+div2)

A.

根据题目模拟

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

void solve(){
    int a,p;cin>>a>>p;
    if(p<16)a=max(0ll,a-10);
    else if(p>20){
        int tmp=p-20;
        a=max(0ll,a-tmp);
    }
    cout<<a<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

B.

注意是每满m人后,后面的人才涨价

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

map<int,int>mp;
void solve() {
    int n,m,x;cin>>n>>m>>x;
    vector<int>a(n+1);
    vector<int>f(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]=i;
        f[i]=max(f[i-1],mp[a[i]^x]);
    }
    while(m--){
        int l,r;cin>>l>>r;
        if(f[r]>=l)cout<<"yes"<<'\n';
        else cout<<"no"<<'\n';
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

C.

根据题目异或的限制,我们可知有两种情况:
1.0和1
2.相邻的数
0和1都不是质数,排除这个情况
然后相邻的数,那么一定是奇数和偶数
偶数除了2都至少还能被2整除,一定不是质数
所以特判2、3也就是第一个质数和第二个质数满足要求,其他全部输出no

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

void solve(){
    int x,y;cin>>x>>y;
    if(x==1&&y==2||x==2&&y==1){
        cout<<"Yes"<<'\n';
        return ;
    }
    cout<<"No"<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

D.

因为路径很短,对每个点进行爆搜

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e4+10;

int n,m;
vector<int>g[N];
bool vis[N];
int ans;
int st;
void dfs(int u,int dep){
    if(dep==4){
        ans++;
        return ;
    }
    vis[u]=true;
    for(int t:g[u]){
        if(vis[t]==false){
            dfs(t,dep+1);
        }else if(t==st&&dep==3){
            dfs(t,dep+1);
        }
    }
    vis[u]=false;
}
void solve() {
    cin>>n>>m;
    for(int i=1,u,v;i<=m;i++){
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        st=i;
        dfs(i,1);
    }
    cout<<ans;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

E.

dfs连通块

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

int cnt;
char g[1010][1010];
bool vis[1010][1010];
int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
void dfs(int x,int y){
    bool f=0;
    vis[x][y]=true;
    for(int i=0;i<4;i++){
        int xx=x+dx[i],yy=y+dy[i];
        //cout << "xx=" << xx << ' ' << "yy=" << yy << ' '<<g[xx][yy]<<' '<<vis[xx][yy]<<'\n';

        if(g[xx][yy]=='#'){
            if(vis[xx][yy]==false) {
               // cout << "xx1=" << xx << ' ' << "yy=" << yy << '\n';
                dfs(xx, yy);
            }
        }else f=1;
    }
    if(!f)cnt++;
}
void solve(){
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>g[i][j];
            vis[i][j]=false;
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(g[i][j]=='#'&&vis[i][j]==false){
                cnt=0;
                //cout<<"i="<<i<<' '<<"j="<<j<<'\n';
                dfs(i,j);
                if(cnt==0)ans++;
            }
        }
    }
    cout<<ans;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

F.

dij模版

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

map<int,int>mp;
void solve() {
    int n,m,x;cin>>n>>m>>x;
    vector<int>a(n+1);
    vector<int>f(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]=i;
        f[i]=max(f[i-1],mp[a[i]^x]);
    }
    while(m--){
        int l,r;cin>>l>>r;
        if(f[r]>=l)cout<<"yes"<<'\n';
        else cout<<"no"<<'\n';
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

I.

若ab=x,则有ax=b和b^x=a
把每个数作为右边界异或x,异或结果跟前一个相比取最靠右的那个
对于询问,若结果大等于l,那么yes

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

map<int,int>mp;
void solve() {
    int n,m,x;cin>>n>>m>>x;
    vector<int>a(n+1);
    vector<int>f(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]=i;
        f[i]=max(f[i-1],mp[a[i]^x]);
    }
    while(m--){
        int l,r;cin>>l>>r;
        if(f[r]>=l)cout<<"yes"<<'\n';
        else cout<<"no"<<'\n';
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}
posted @ 2024-01-29 20:12  WW爆米花  阅读(23)  评论(0编辑  收藏  举报