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();
}
}