跳转至

十七届蓝桥杯模拟赛(三)

第一题

2026

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

int ans=0;

bool check(int x){
    int cnt[10]={0};
    while(x!=0){
        cnt[x%10]++;
        x/=10;
    }
    return cnt[2]==2 && cnt[0]==1 && cnt[6]==1;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    for(int i=1;i<=20262026;i++){
        if(check(i)) ans++;
    }

    cout<<ans;
    return 0;
}
import java.util.*;

public class Main {

    static boolean check(int x){
        int[] cnt=new int[10];
        while(x!=0){
            cnt[x%10]++;
            x/=10;
        }
        return cnt[2]==2 && cnt[0]==1 && cnt[6]==1;
    }

    public static void main(String[] args){
        int ans=0;
        for(int i=1;i<=20262026;i++){
            if(check(i)) ans++;
        }
        System.out.print(ans);
    }
}
def check(x):
    cnt=[0]*10
    while x!=0:
        cnt[x%10]+=1
        x//=10
    return cnt[2]==2 and cnt[0]==1 and cnt[6]==1

ans=0
for i in range(1,20262027):
    if check(i):
        ans+=1

print(ans)

第二题

不等式

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

int main(){
    cout<<"5123413425341524251325341";
    return 0;
}
public class Main {
    public static void main(String[] args){
        System.out.print("5123413425341524251325341");
    }
}
print(5123413425341524251325341)

第三题

字典序

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

typedef long long LL;
const int N=2e5;

int n;
string a[N];

bool cmp(string &x,string &y){
    int cntx[26]={0},cnty[26]={0};

    for(char c:x) cntx[c-'a']++;
    for(char c:y) cnty[c-'a']++;

    for(int i=0;i<26;i++){
        if(cntx[i]!=cnty[i]) return cntx[i]>cnty[i];
    }
    return x<y;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];

    sort(a+1,a+n+1,cmp);

    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    return 0;
}
import java.io.*;
import java.util.*;

public class Main {

    static boolean cmp(String x,String y){
        int[] cntx=new int[26];
        int[] cnty=new int[26];

        for(char c:x.toCharArray()) cntx[c-'a']++;
        for(char c:y.toCharArray()) cnty[c-'a']++;

        for(int i=0;i<26;i++){
            if(cntx[i]!=cnty[i]) return cntx[i]>cnty[i];
        }
        return x.compareTo(y)<0;
    }

    public static void main(String[] args)throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine());
        String[] a=new String[n];

        for(int i=0;i<n;i++){
            a[i]=br.readLine();
        }

        Arrays.sort(a,(x,y)->{
            int[] cntx=new int[26];
            int[] cnty=new int[26];

            for(char c:x.toCharArray()) cntx[c-'a']++;
            for(char c:y.toCharArray()) cnty[c-'a']++;

            for(int i=0;i<26;i++){
                if(cntx[i]!=cnty[i]) return cnty[i]-cntx[i];
            }
            return x.compareTo(y);
        });

        StringBuilder sb=new StringBuilder();
        for(String s:a){
            sb.append(s).append(" ");
        }
        System.out.print(sb.toString());
    }
}
import sys

n=int(sys.stdin.readline())
a=[sys.stdin.readline().strip() for _ in range(n)]

def key_func(s):
    cnt=[0]*26
    for c in s:
        cnt[ord(c)-97]+=1
    return ([-c for c in cnt],s)

a.sort(key=key_func)

print(" ".join(a))

第四题

括号序列

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

const int N=2e5+10;
string s;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>s;

    bool f=0;
    int ans=0;
    int num=0;
    int sum=0;

    for(int i=0;i<s.size();i++){
        if(s[i]=='('){
            f=1;
            num=0;
            sum=0;
        }else if(s[i]==')'){
            if(f){
                ans=max(ans,sum);
            }
            sum=0;
            num=0;
            f=0;
        }else if(s[i]=='.'){
            sum+=num;
            num=0;
        }else{
            num=num*10+s[i]-'0';
        }
    }

    cout<<ans;
    return 0;
}
import java.util.*;

public class Main {

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        String s=sc.next();

        boolean f=false;
        int ans=0;
        int num=0;
        int sum=0;

        for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);

            if(ch=='('){
                f=true;
                num=0;
                sum=0;
            }else if(ch==')'){
                if(f){
                    ans=Math.max(ans,sum);
                }
                sum=0;
                num=0;
                f=false;
            }else if(ch=='.'){
                sum+=num;
                num=0;
            }else{
                num=num*10+(ch-'0');
            }
        }

        System.out.print(ans);
    }
}
import sys
s=sys.stdin.readline().strip()

f=False
ans=0
num=0
total=0

for ch in s:
    if ch=='(':
        f=True
        num=0
        total=0
    elif ch==')':
        if f:
            ans=max(ans,total)
        total=0
        num=0
        f=False
    elif ch=='.':
        total+=num
        num=0
    else:
        num=num*10+ord(ch)-ord('0')

print(ans)
10分(假 \(n^2\)
#include<bits/stdc++.h>
using namespace std;

const int N=2e5+10;
string s;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int ans=0;
    cin>>s;

    for(int i=0;i<s.size();i++){
        if(s[i]!='(') continue;

        int num=0,sum=0;

        for(int j=i+1;j<s.size();j++){
            if(s[j]=='.'){
                sum+=num;
                num=0;
                continue;
            }else if(s[j]=='('){
                break;
            }else if(s[j]==')'){
                sum+=num;
                ans=max(ans,sum);
                break;
            }else{
                num=num*10+s[j]-'0';
            }
        }
    }

    cout<<ans;
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String s=sc.next();

        int ans=0;

        for(int i=0;i<s.length();i++){
            if(s.charAt(i)!='(') continue;

            int num=0,sum=0;

            for(int j=i+1;j<s.length();j++){
                char ch=s.charAt(j);

                if(ch=='.'){
                    sum+=num;
                    num=0;
                    continue;
                }else if(ch=='('){
                    break;
                }else if(ch==')'){
                    sum+=num;
                    ans=Math.max(ans,sum);
                    break;
                }else{
                    num=num*10+(ch-'0');
                }
            }
        }

        System.out.print(ans);
    }
}
import sys
s=sys.stdin.readline().strip()

ans=0
n=len(s)

for i in range(n):
    if s[i] != '(':
        continue

    num=0
    total=0

    for j in range(i+1,n):
        ch=s[j]

        if ch=='.':
            total+=num
            num=0
            continue
        elif ch=='(':
            break
        elif ch==')':
            total+=num
            ans=max(ans,total)
            break
        else:
            num=num*10+ord(ch)-ord('0')

print(ans)

第五题

矩阵旋转

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

const int N=1e5+10;
int n,q;
int a[110][110],back[110][110],c[110][110];

struct node{
    int op,x,y,len;
}s[N];

void solve1(){
    int d;
    cin>>d;
    while(d--){
        int dx,dy;
        cin>>dx>>dy;
        cout<<1ll*(dx-1)*n+dy<<"\n";
    }
}

void rotate(int x,int y,int len){
    for(int i=x;i<=x+len-1;i++){
        for(int j=y;j<=y+len-1;j++){
            c[i-x+1][j-y+1]=a[i][j];
        }
    }
    for(int i=1;i<=len;i++){
        for(int j=1;j<=len;j++){
            back[j][len-i+1]=c[i][j];
        }
    }
    for(int i=x;i<=x+len-1;i++){
        for(int j=y;j<=y+len-1;j++){
            a[i][j]=back[i-x+1][j-y+1];
        }
    }
}

void solve2(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            a[i][j]=(i-1)*n+j;
        }
    }
    for(int i=1;i<=q;i++){
        if(s[i].op==1){
            rotate(s[i].x,s[i].y,s[i].len);
        }else{
            rotate(s[i].x,s[i].y,s[i].len);
            rotate(s[i].x,s[i].y,s[i].len);
            rotate(s[i].x,s[i].y,s[i].len);
        }
    }
    int d;
    cin>>d;
    while(d--){
        int dx,dy;
        cin>>dx>>dy;
        cout<<a[dx][dy]<<"\n";
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>q;
    bool f=1;

    for(int i=1;i<=q;i++){
        cin>>s[i].op>>s[i].x>>s[i].y>>s[i].len;
        if(s[i].len!=1) f=0;
    }

    if(f) solve1();
    else solve2();

    return 0;
}
import java.util.*;

public class Main{
    static int n,q;
    static int[][] a=new int[110][110];
    static int[][] back=new int[110][110];
    static int[][] c=new int[110][110];

    static class Node{
        int op,x,y,len;
    }

    static Node[] s=new Node[100010];

    static void solve1(Scanner sc){
        int d=sc.nextInt();
        while(d-- > 0){
            int dx=sc.nextInt(),dy=sc.nextInt();
            System.out.println((long)(dx-1)*n+dy);
        }
    }

    static void rotate(int x,int y,int len){
        for(int i=x;i<=x+len-1;i++){
            for(int j=y;j<=y+len-1;j++){
                c[i-x+1][j-y+1]=a[i][j];
            }
        }
        for(int i=1;i<=len;i++){
            for(int j=1;j<=len;j++){
                back[j][len-i+1]=c[i][j];
            }
        }
        for(int i=x;i<=x+len-1;i++){
            for(int j=y;j<=y+len-1;j++){
                a[i][j]=back[i-x+1][j-y+1];
            }
        }
    }

    static void solve2(Scanner sc){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                a[i][j]=(i-1)*n+j;
            }
        }
        for(int i=1;i<=q;i++){
            if(s[i].op==1){
                rotate(s[i].x,s[i].y,s[i].len);
            }else{
                rotate(s[i].x,s[i].y,s[i].len);
                rotate(s[i].x,s[i].y,s[i].len);
                rotate(s[i].x,s[i].y,s[i].len);
            }
        }
        int d=sc.nextInt();
        while(d-- > 0){
            int dx=sc.nextInt(),dy=sc.nextInt();
            System.out.println(a[dx][dy]);
        }
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt(); q=sc.nextInt();

        boolean f=true;
        for(int i=1;i<=q;i++){
            s[i]=new Node();
            s[i].op=sc.nextInt();
            s[i].x=sc.nextInt();
            s[i].y=sc.nextInt();
            s[i].len=sc.nextInt();
            if(s[i].len!=1) f=false;
        }

        if(f) solve1(sc);
        else solve2(sc);
    }
}
import sys
input=sys.stdin.readline

n,q=map(int,input().split())
s=[None]*(q+1)
f=True

for i in range(1,q+1):
    op,x,y,l=map(int,input().split())
    s[i]=(op,x,y,l)
    if l!=1:
        f=False

def solve1():
    d=int(input())
    for _ in range(d):
        dx,dy=map(int,input().split())
        print((dx-1)*n+dy)

def rotate(a,x,y,l):
    c=[[0]*(l+1) for _ in range(l+1)]
    back=[[0]*(l+1) for _ in range(l+1)]

    for i in range(l):
        for j in range(l):
            c[i][j]=a[x+i][y+j]

    for i in range(l):
        for j in range(l):
            back[j][l-i-1]=c[i][j]

    for i in range(l):
        for j in range(l):
            a[x+i][y+j]=back[i][j]

def solve2():
    a=[[0]*(n+1) for _ in range(n+1)]
    for i in range(1,n+1):
        for j in range(1,n+1):
            a[i][j]=(i-1)*n+j

    for op,x,y,l in s[1:]:
        if op==1:
            rotate(a,x,y,l)
        else:
            for _ in range(3):
                rotate(a,x,y,l)

    d=int(input())
    for _ in range(d):
        dx,dy=map(int,input().split())
        print(a[dx][dy])

if f:
    solve1()
else:
    solve2()
15分
#include<bits/stdc++.h>
using namespace std;

struct Op{
    int op,x,y,len;
};

int n, q;

void change(int &a,int &b,int len){
    int na=b;
    int nb=len-1-a;
    a=na;
    b=nb;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>q;
    vector<Op> ops(q);
    for(int i=0;i<q;i++) {
        cin>>ops[i].op>>ops[i].x>>ops[i].y>>ops[i].len;
    }
    int d;
    cin>>d;
    while(d--){
        int x,y;
        cin>>x>>y;
        for(int i=q-1;i>=0;i--){
            const auto& op=ops[i];
            int x0=op.x,y0=op.y,len=op.len;
            if(x>=x0 && x<x0+len && y>=y0 && y<y0+len){
                int a=x-x0;
                int b=y-y0;
                if(op.op==1){
                    change(a,b,len);
                    change(a,b,len);
                    change(a,b,len);
                }else{
                    change(a,b,len);
                }
                x=x0+a;
                y=y0+b;
            }
        }
        cout<<(long long)(x-1)*n+y<<"\n";
    }

    return 0;
}
import java.util.*;

public class Main{
    static class Op{
        int op,x,y,len;
    }

    static void change(int[] ab,int len){
        int a=ab[0],b=ab[1];
        int na=b;
        int nb=len-1-a;
        ab[0]=na;
        ab[1]=nb;
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),q=sc.nextInt();
        Op[] ops=new Op[q];
        for(int i=0;i<q;i++){
            ops[i]=new Op();
            ops[i].op=sc.nextInt();
            ops[i].x=sc.nextInt();
            ops[i].y=sc.nextInt();
            ops[i].len=sc.nextInt();
        }
        int d=sc.nextInt();
        while(d-- >0){
            int x=sc.nextInt(),y=sc.nextInt();
            for(int i=q-1;i>=0;i--){
                Op op=ops[i];
                int x0=op.x,y0=op.y,len=op.len;
                if(x>=x0 && x<x0+len && y>=y0 && y<y0+len){
                    int a=x-x0,b=y-y0;
                    if(op.op==1){
                        int[] ab={a,b};
                        change(ab,len); change(ab,len); change(ab,len);
                        a=ab[0]; b=ab[1];
                    }else{
                        int[] ab={a,b};
                        change(ab,len); a=ab[0]; b=ab[1];
                    }
                    x=x0+a; y=y0+b;
                }
            }
            System.out.println((long)(x-1)*n+y);
        }
    }
}
import sys
input=sys.stdin.readline

n,q=map(int,input().split())
ops=[]
for _ in range(q):
    op,x,y,l=map(int,input().split())
    ops.append((op,x,y,l))

def change(a,b,len_):
    return b,len_-1-a

d=int(input())
for _ in range(d):
    x,y=map(int,input().split())
    for op,x0,y0,l in reversed(ops):
        if x0<=x<x0+l and y0<=y<y0+l:
            a,b=x-x0,y-y0
            if op==1:
                for _ in range(3):
                    a,b=change(a,b,l)
            else:
                a,b=change(a,b,l)
            x,y=x0+a,y0+b
    print((x-1)*n+y)

第六题

能量核心

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

const int N=3e5+10;
int n,m,ans;
int a[N],s[N];
bool vis[N];

void dfs(int u,int cnt){
    if(u==n){
        if(cnt!=m-1) return;
        int sum=(1<<31)-1;
        int num=0;
        for(int i=1;i<=n-1;i++){
            num^=a[i];
            if(vis[i]){
                sum&=num;
                num=0;
            }
        }
        num^=a[n];
        sum&=num;
        ans=max(ans,sum);
        return;
    }
    vis[u]=0;
    dfs(u+1,cnt);
    vis[u]=1;
    dfs(u+1,cnt+1);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>m;
    bool f1=1,f2=1;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s[i]=s[i-1]^a[i];
        if(m!=2) f1=0;
        if(a[i]>1) f2=0;
    }

    if(n<=10){
        dfs(1,0);
    }else if(f1){
        for(int i=1;i<=n-1;i++){
            ans=max(ans, s[i] & (s[n]^s[i]));
        }
    }else if(f2){
        int cnt=0;
        for(int i=1;i<=n;i++) cnt+=a[i];
        if(cnt<m) ans=0;
        else if((cnt-(m-1))%2) ans=1;
        else ans=0;
    }

    cout<<ans;
    return 0;
}
import java.io.*;
import java.util.*;

public class Main{
    static final int N=300010;
    static int n,m,ans=0;
    static int[] a=new int[N];
    static int[] s=new int[N];
    static boolean[] vis=new boolean[N];

    static void dfs(int u,int cnt){
        if(u==n){
            if(cnt!=m-1) return;
            int sum=(1<<31)-1,num=0;
            for(int i=1;i<=n-1;i++){
                num^=a[i];
                if(vis[i]){
                    sum&=num;
                    num=0;
                }
            }
            num^=a[n];
            sum&=num;
            ans=Math.max(ans,sum);
            return;
        }
        vis[u]=false;
        dfs(u+1,cnt);
        vis[u]=true;
        dfs(u+1,cnt+1);
    }

    public static void main(String[] args)throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(br.readLine());
        n=Integer.parseInt(st.nextToken());
        m=Integer.parseInt(st.nextToken());

        st=new StringTokenizer(br.readLine());
        boolean f1=true,f2=true;
        for(int i=1;i<=n;i++){
            a[i]=Integer.parseInt(st.nextToken());
            s[i]=s[i-1]^a[i];
            if(m!=2) f1=false;
            if(a[i]>1) f2=false;
        }

        if(n<=10){
            dfs(1,0);
        }else if(f1){
            for(int i=1;i<=n-1;i++){
                ans=Math.max(ans, s[i] & (s[n]^s[i]));
            }
        }else if(f2){
            int cnt=0;
            for(int i=1;i<=n;i++) cnt+=a[i];
            if(cnt<m) ans=0;
            else if((cnt-(m-1))%2==1) ans=1;
            else ans=0;
        }

        System.out.println(ans);
    }
}
import sys
input=sys.stdin.readline

n,m=map(int,input().split())
a=[0]+list(map(int,input().split()))

s=[0]*(n+1)
f1=(m==2)
f2=True

for i in range(1,n+1):
    s[i]=s[i-1]^a[i]
    if a[i]>1:
        f2=False

ans=0
vis=[0]*(n+1)

def dfs(u,cnt):
    nonlocal ans
    if u==n:
        if cnt!=m-1:
            return
        sumv=(1<<31)-1
        num=0
        for i in range(1,n):
            num^=a[i]
            if vis[i]:
                sumv&=num
                num=0
        num^=a[n]
        sumv&=num
        ans=max(ans,sumv)
        return
    vis[u]=0
    dfs(u+1,cnt)
    vis[u]=1
    dfs(u+1,cnt+1)

if n<=10:
    dfs(1,0)
elif f1:
    for i in range(1,n):
        ans=max(ans, s[i] & (s[n]^s[i]))
elif f2:
    cnt=sum(a[1:])
    if cnt<m:
        ans=0
    elif (cnt-(m-1))%2==1:
        ans=1
    else:
        ans=0

print(ans)
15分
#include<bits/stdc++.h>
using namespace std;

const int N=300005;
int a[N],s[N],n,m;

bool check(int mask){
    int pre=0,cnt=0;
    for(int i=1;i<=n;i++){
        if(((s[i]^s[pre])&mask)==mask){
            pre=i;
            cnt++;
            if(cnt==m-1) break;
        }
    }
    return cnt==m-1 && (((s[n]^s[pre])&mask)==mask);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s[i]=s[i-1]^a[i];
    }

    int ans=0;
    for(int i=30;i>=0;i--){
        int t=ans|(1<<i);
        if(check(t)) ans=t;
    }
    cout<<ans;
    return 0;
}
import java.io.*;
import java.util.*;

public class Main{
    static final int N=300005;
    static int[] a=new int[N];
    static int[] s=new int[N];
    static int n,m;

    static boolean check(int mask){
        int pre=0,cnt=0;
        for(int i=1;i<=n;i++){
            if(((s[i]^s[pre])&mask)==mask){
                pre=i;
                cnt++;
                if(cnt==m-1) break;
            }
        }
        return cnt==m-1 && (((s[n]^s[pre])&mask)==mask);
    }

    public static void main(String[] args)throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(br.readLine());
        n=Integer.parseInt(st.nextToken());
        m=Integer.parseInt(st.nextToken());

        st=new StringTokenizer(br.readLine());
        for(int i=1;i<=n;i++){
            a[i]=Integer.parseInt(st.nextToken());
            s[i]=s[i-1]^a[i];
        }

        int ans=0;
        for(int i=30;i>=0;i--){
            int t=ans|(1<<i);
            if(check(t)) ans=t;
        }
        System.out.println(ans);
    }
}
import sys
input=sys.stdin.readline

n,m=map(int,input().split())
a=list(map(int,input().split()))

s=[0]*(n+1)
for i in range(1,n+1):
    s[i]=s[i-1]^a[i-1]

def check(mask):
    pre=0
    cnt=0
    for i in range(1,n+1):
        if ((s[i]^s[pre]) & mask)==mask:
            pre=i
            cnt+=1
            if cnt==m-1:
                break
    return cnt==m-1 and (((s[n]^s[pre]) & mask)==mask)

ans=0
for i in range(30,-1,-1):
    t=ans|(1<<i)
    if check(t):
        ans=t

print(ans)