18浙江省赛训练总结

A 队友过得没看

B 队友过得没看

F 预处理前缀和+lower_bound时间空间可能都有点卡

 处理下公式就能发现规律,因为向下取整不能用前缀和做,但是除数其实就30个,所以直接用sum[i][j]求出[1,i]除以j的前缀和

 然后用upper_bound来求即可,注意一些细节的优化,否则会t

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define maxn 500005
#define mod 1000000000
ll n,m,p[maxn],a[maxn];
ll sum[maxn][30];
int main(){
    int t;
    cin>>t;
    ll anss=0;
    while(t--){
        cin>>n>>m;
        anss=0;
        
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        for(int i=1;i<=m;i++)scanf("%lld",&p[i]);
        sort(a+1,a+1+n);
        
        for(int j=1;j<30;j++){
            sum[0][j]=0;
            for(int i=1;i<=n;i++)
                sum[i][j]=sum[i-1][j]+a[i]/j;
        }
        for(int i=1;i<=m;i++){
            ll ans=0,down=1,up=p[i],pow=1;
            while(1){
                if(a[1]>up){
                    pow++;down*=p[i];up*=p[i];
                    continue;
                }
                ll L=upper_bound(a+1,a+1+n,down)-a;
                ll R=upper_bound(a+1,a+1+n,up)-a-1;
//                R=min(R,n);
                ans+=sum[R][pow]-sum[L-1][pow];
                pow++;down*=p[i];up*=p[i];
                if(down>=a[n])break;
            }
            anss=(anss+ans*i)%mod;
        } 
        cout<<anss<<endl;
    }    
}
View Code

J 构造题,要求把1-n放到两个集合里,使两个集合的和相等

  有个结论 n是偶数:n/2是偶数可行,n/2是奇数不可行

          n是奇数:n/2是奇数可行,n/2是偶数不行

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<bitset>
typedef long long  ll;
using namespace std;
const int maxn=100200;
ll n;
int  t;
// 女生 1 2 男生  3 4
//1+3== 2+4; 
char sz[maxn];  //1 男生 0 女生
// n为3是   1 2放在1 3, 3放在2 4;
char ans[maxn]; 
 
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%lld",&n);
        memset(ans,0,sizeof(ans));
        scanf("%s",sz+1);
        if(n==1||n==2){
            printf("-1\n");
            continue;
        }
        ll sum=((n+1)*n)/2;
        if(sum%2==1){
            printf("-1\n");
            continue;
        }
        if(n%2==0){
            if((n/2)%2==0){
                for(int i=1;i<=(n/2);i++){
                    if(i%2==1){//奇数放在 1 3 
                        if(sz[i]=='1') ans[i]='3';
                        else ans[i]='1';
                        if(sz[n-i+1]=='1') ans[n-i+1]='3';
                        else ans[n-i+1]='1';
                    }else{//偶数放在  2 4 
                       if(sz[i]=='1') ans[i]='4';
                       else ans[i]='2';
                       if(sz[n-i+1]=='1') ans[n-i+1]='4';
                       else ans[n-i+1]='2';         
                    }    
                }
                for(int i=1;i<=n;i++) printf("%c",ans[i]);
                printf("\n");
            }else printf("-1\n");
        }else{
            ll q=(n-3);
            if((q/2)%2==0){// 12放在13   3放在24; 
                if(sz[1]=='1') ans[1]='3';
                else ans[1]='1';
                if(sz[2]=='1') ans[2]='3';
                else ans[2]='1';
                if(sz[3]=='1') ans[3]='4';
                else ans[3]='2';
            //    printf("SSNSBBSBSB\n"); 
             //    printf("%d\n",3+(q/2));
                for(int i=4,j=1;i<=3+(q/2);i++,j++){
                //    printf("%d\n",j);
                    if(i%2==1){//奇数放在 1 3 
                        if(sz[i]=='1') ans[i]='3';
                        else ans[i]='1';
                        if(sz[n-j+1]=='1') ans[n-j+1]='3';
                        else ans[n-j+1]='1';
                    }else{//偶数放在  2 4 
                       if(sz[i]=='1') ans[i]='4';
                       else ans[i]='2';
                       if(sz[n-j+1]=='1') ans[n-j+1]='4';
                       else ans[n-j+1]='2';         
                    }
                }
                for(int i=1;i<=n;i++) printf("%c",ans[i]);
                printf("\n");
            }else printf("-1\n");
        }
    }
    return 0;
}
View Code

k 分情况讨论题

  情况很多,慢慢讨论。。

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

const int N = 2e6+5;
int arr[N];
template<typename T>
inline void read(T&x){
    x=0;int f=1;char c=getchar();
    while(c<'0' || c>'9'){ if(c=='-')f=-1;c=getchar(); }
    while(c>='0'&& c<='9'){ x=x*10+c-'0';c=getchar(); }
    x*=f; 
}
int main(){
    int T;read(T);
    while(T--){
        int n,m;
        read(n);read(m);
        int loc=-1;
        //memset(arr,0,sizeof(arr));
        for(int i=1;i<=n;i++){
            char c;cin>>c;
            if(c=='W'){
                loc=i;
            }else {
                int pos;read(pos);
                if(c=='C')arr[i]=pos;
                else if(c=='B'){
                    pos+=m;
                    arr[i]=pos;
                }else if(c=='D'){
                    arr[i]=2*m+pos;
                }
            }
        }
        arr[n+1]=3*m+1;
        if(n==1){ printf("%d\n",3*m);continue; }
        /*if(n==2){
            if(loc==-1)printf("%d\n",1+3*m-n);
            else if(loc==1)printf("%d\n",arr[2]-1);
            else if(loc==2){
                printf("%d\n",3*m-arr[1]+1);
            }
            continue;
        }*/
        if(loc==-1){
            if(arr[1]>arr[2])printf("1\n");
            else printf("%d\n",1+3*m-n);
        }else{
            if(loc==1){
                printf("%d\n",arr[2]-1);
            }else if(loc==2){
                //printf("%d\n",arr[3]-arr[1]);
                printf("%d\n",arr[loc+1]-arr[loc-1]);
            }else{
                if(arr[1]>arr[2])printf("1\n");
                else printf("%d\n",arr[loc+1]-arr[loc-1]-1);
            }       
        }
    }
}
View Code

L 。二元组排序

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define maxn 105 
struct Node{
    string s;
    ll w;
}p[maxn];
int n,m;
int cmp(Node a,Node b){
    if(a.w==b.w)
        return a.s<b.s;
    return a.w>b.w;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>p[i].s>>p[i].w;
        sort(p+1,p+1+n,cmp);
        ll ans=0;
        for(int i=1;i<=m;i++)
            ans+=(m-i+1)*p[i].w;
        cout<<ans;
        for(int i=1;i<=m;i++)
            cout<<" "<<p[i].s;
        puts("");
    }return 0;
}
View Code

M。队友做的没看

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

int main(){
    int T;cin>>T;
    while(T--){
        int n,b;cin>>n>>b;
        bool fp=false;
        for(int i=1;i<=n;i++){
            int now;cin>>now;
            if((now+b)%7==0){
                fp=true;
            }
        }
        if(fp)puts("Yes");
        else puts("No");
    }
}
View Code

D。待补

E。待补

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10713440.html