zoukankan      html  css  js  c++  java
  • 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
    ");
                continue;
            }
            ll sum=((n+1)*n)/2;
            if(sum%2==1){
                printf("-1
    ");
                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("
    ");
                }else printf("-1
    ");
            }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
    "); 
                 //    printf("%d
    ",3+(q/2));
                    for(int i=4,j=1;i<=3+(q/2);i++,j++){
                    //    printf("%d
    ",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("
    ");
                }else printf("-1
    ");
            }
        }
        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
    ",3*m);continue; }
            /*if(n==2){
                if(loc==-1)printf("%d
    ",1+3*m-n);
                else if(loc==1)printf("%d
    ",arr[2]-1);
                else if(loc==2){
                    printf("%d
    ",3*m-arr[1]+1);
                }
                continue;
            }*/
            if(loc==-1){
                if(arr[1]>arr[2])printf("1
    ");
                else printf("%d
    ",1+3*m-n);
            }else{
                if(loc==1){
                    printf("%d
    ",arr[2]-1);
                }else if(loc==2){
                    //printf("%d
    ",arr[3]-arr[1]);
                    printf("%d
    ",arr[loc+1]-arr[loc-1]);
                }else{
                    if(arr[1]>arr[2])printf("1
    ");
                    else printf("%d
    ",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。待补

  • 相关阅读:
    javascript类型系统——日期Date对象
    javascript类型系统——undefined和null
    javascript运算符语法概述
    javascript运算符
    javascript语句——表达式语句、块语句、空语句和声明语句
    javascript语句
    javascript中的数据类型转换
    javascript类型系统
    Sqli-labs Less-21 cookie注入 base64编码 updatexml()报错注入
    Sqli-labs Less-20 cookie注入 extractvalue()报错注入
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10713440.html
Copyright © 2011-2022 走看看