跳转至

本科组第一场

第一题

子胥渡江计数

代码实现

参考实现
#include<bits/stdc++.h>
using namespace std;

void solve(){
    int n,ans=0;
    cin>>n;

    for(int i=1;i<=n;i++){
        int a,b;
        cin>>a>>b;
        if(b>=a) ans++;
    }

    cout<<ans<<" "<<n-ans;
}

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

    solve();
    return 0;
}
import java.util.*;

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

        int n=in.nextInt();
        int ans=0;

        for(int i=1;i<=n;i++){
            int a=in.nextInt();
            int b=in.nextInt();
            if(b>=a) ans++;
        }

        System.out.print(ans+" "+(n-ans));
    }
}
import sys
input=sys.stdin.readline

n=int(input())
ans=0

for _ in range(n):
    a,b=map(int,input().split())
    if b>=a:
        ans+=1

print(ans,n-ans)

第二题

公子密会子胥

代码实现

参考实现
#include<bits/stdc++.h>
using namespace std;

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

    int n;
    cin>>n;

    int ans=(int)(2e9);
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        ans=min(ans,x);
        cout<<ans<<" ";
    }

    return 0;
}
import java.util.*;

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

        int n=in.nextInt();
        int ans=(int)2e9;

        for(int i=1;i<=n;i++){
            int x=in.nextInt();
            ans=Math.min(ans,x);
            System.out.print(ans+" ");
        }
    }
}
import sys
input=sys.stdin.readline

n=int(input())
nums=list(map(int,input().split()))

ans=int(2e9)
for x in nums:
    ans=min(ans,x)
    print(ans,end=" ")

第三题

专诸市井被荐

代码实现

参考实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=3e5+10;
const int mod=1e4+7;

int a[N];
int n,m;

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

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

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

    ll ans=1ll*n*m;

    for(int i=1;i<=m;i++){
        int l,r;
        cin>>l>>r;

        int x=lower_bound(a+1,a+n+1,l)-a;
        int y=upper_bound(a+1,a+n+1,r)-a-1;

        ans=((ans-(y-x+1))%mod+mod)%mod;
    }

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

public class Main{
    static int lowerBound(int[] a,int n,int x){
        int l=1,r=n,ans=n+1;
        while(l<=r){
            int mid=(l+r)>>1;
            if(a[mid]>=x){
                ans=mid;
                r=mid-1;
            }else{
                l=mid+1;
            }
        }
        return ans;
    }

    static int upperBound(int[] a,int n,int x){
        int l=1,r=n,ans=n+1;
        while(l<=r){
            int mid=(l+r)>>1;
            if(a[mid]>x){
                ans=mid;
                r=mid-1;
            }else{
                l=mid+1;
            }
        }
        return ans;
    }

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

        int n=in.nextInt();
        int m=in.nextInt();

        int[] a=new int[n+1];
        for(int i=1;i<=n;i++){
            a[i]=in.nextInt();
        }

        Arrays.sort(a,1,n+1);

        long ans=1L*n*m;
        int mod=10007;

        for(int i=1;i<=m;i++){
            int l=in.nextInt();
            int r=in.nextInt();

            int x=lowerBound(a,n,l);
            int y=upperBound(a,n,r)-1;

            ans=((ans-(y-x+1))%mod+mod)%mod;
        }

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

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

mod=10007
ans=n*m

for _ in range(m):
    l,r=map(int,input().split())
    x=bisect.bisect_left(a,l)
    y=bisect.bisect_right(a,r)-1
    ans=((ans-(y-x+1))%mod+mod)%mod

print(ans)

第四题

鱼肠剑试锋芒

代码实现

参考实现
#include<bits/stdc++.h>
using namespace std;

const int N=1e6+10;

int a[N];
int n,q;

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

    cin>>n>>q;

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

    for(int i=1;i<=q;i++){
        int x;
        cin>>x;

        if(sum==0||x==1){
            cout<<sum<<"\n";
            continue;
        }

        sum=0;
        for(int j=1;j<=n;j++){
            a[j]/=x;
            sum+=a[j];
        }

        cout<<sum<<"\n";
    }

    return 0;
}
import java.io.*;
import java.util.*;

public class Main{
    static class FastScanner{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        String next() throws Exception{
            while(st==null||!st.hasMoreTokens()){
                st=new StringTokenizer(br.readLine());
            }
            return st.nextToken();
        }

        int nextInt() throws Exception{
            return Integer.parseInt(next());
        }
    }

    public static void main(String[] args)throws Exception{
        FastScanner in=new FastScanner();
        StringBuilder sb=new StringBuilder();

        int n=in.nextInt();
        int q=in.nextInt();

        int[] a=new int[n+1];
        int sum=0;

        for(int i=1;i<=n;i++){
            a[i]=in.nextInt();
            sum+=a[i];
        }

        for(int i=1;i<=q;i++){
            int x=in.nextInt();

            if(sum==0||x==1){
                sb.append(sum).append("\n");
                continue;
            }

            sum=0;
            for(int j=1;j<=n;j++){
                a[j]/=x;
                sum+=a[j];
            }

            sb.append(sum).append("\n");
        }

        System.out.print(sb.toString());
    }
}
import sys
input=sys.stdin.readline

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

s=sum(a)

for _ in range(q):
    x=int(input())

    if s==0 or x==1:
        print(s)
        continue

    s=0
    for i in range(1,n+1):
        a[i]//=x
        s+=a[i]

    print(s)

第五题

炙鱼术隐杀机

代码实现

参考实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=1e3+10;
const int mod=1e9+7;

int a[N][N],b[N][N],s[N][N];
int n,m;

void solve(){
    cin>>n>>m;

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

    for(int i=1;i<=m;i++){
        for(int j=1;j<=m;j++){
            cin>>b[i][j];
        }
    }

    ll ans=0;

    for(int mask=30;mask>=0;mask--){
        for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++){
                s[i][j]=0;
            }
        }

        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+((a[i][j]>>mask)&1);
            }
        }

        for(int i=1;i<=m;i++){
            for(int j=1;j<=m;j++){
                int x=(b[i][j]>>mask)&1;

                int x1=i,y1=j;
                int x2=n-m+i,y2=n-m+j;

                int c1=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
                int c0=(n-m+1)*(n-m+1)-c1;

                if(x==0){
                    ans=(ans+1LL*(1<<mask)*c1)%mod;
                }else{
                    ans=(ans+1LL*(1<<mask)*c0)%mod;
                }
            }
        }
    }

    cout<<ans;
}

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

    solve();
    return 0;
}
import java.io.*;
import java.util.*;

public class Main{
    static final int N=1010;
    static final int mod=1000000007;

    static int[][] a=new int[N][N];
    static int[][] b=new int[N][N];
    static int[][] s=new int[N][N];

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

        int n=in.nextInt();
        int m=in.nextInt();

        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                a[i][j]=in.nextInt();
            }
        }

        for(int i=1;i<=m;i++){
            for(int j=1;j<=m;j++){
                b[i][j]=in.nextInt();
            }
        }

        long ans=0;

        for(int mask=30;mask>=0;mask--){
            for(int i=0;i<=n;i++){
                Arrays.fill(s[i],0);
            }

            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+((a[i][j]>>mask)&1);
                }
            }

            for(int i=1;i<=m;i++){
                for(int j=1;j<=m;j++){
                    int x=(b[i][j]>>mask)&1;

                    int x1=i,y1=j;
                    int x2=n-m+i,y2=n-m+j;

                    int c1=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
                    int c0=(n-m+1)*(n-m+1)-c1;

                    if(x==0){
                        ans=(ans+1L*(1<<mask)*c1)%mod;
                    }else{
                        ans=(ans+1L*(1<<mask)*c0)%mod;
                    }
                }
            }
        }

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

mod=10**9+7

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

a=[[0]*(n+1)]
for _ in range(n):
    a.append([0]+list(map(int,input().split())))

b=[[0]*(m+1)]
for _ in range(m):
    b.append([0]+list(map(int,input().split())))

s=[[0]*(n+1) for _ in range(n+1)]

ans=0

for mask in range(30,-1,-1):
    for i in range(n+1):
        for j in range(n+1):
            s[i][j]=0

    for i in range(1,n+1):
        for j in range(1,n+1):
            s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+((a[i][j]>>mask)&1)

    for i in range(1,m+1):
        for j in range(1,m+1):
            x=(b[i][j]>>mask)&1

            x1,y1=i,j
            x2,y2=n-m+i,n-m+j

            c1=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]
            c0=(n-m+1)*(n-m+1)-c1

            if x==0:
                ans=(ans+(1<<mask)*c1)%mod
            else:
                ans=(ans+(1<<mask)*c0)%mod

print(ans)