zoukankan      html  css  js  c++  java
  • Codeforces Round #632 (Div. 2)

    Codeforces Round #632 (Div. 2)

    这一场打的好差呀,这几次艰难上的分全部掉回去了,感觉就像一夜回到了解放前。

    说实话,就是被B卡到了,没看到只能从小的放到大的。。。

    Little Artem

    这个构造就是只让最后一行的最后一个是W就行了,其余都设置成B。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e5+10;
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            int n,m;
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    if(i==n&&j==m) printf("W");
                    else printf("B");
                }
                printf("
    ");
            }
        }
        return 0;
    }
    

    Kind Anton

    这个题目注意看清楚题意,这个只能在序号大的身上放序号小的,所以说先把大的都处理了,再去处理小的。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+10;
    int a[maxn],b[maxn];
    int sum1[maxn],sum0[maxn];
    int main(){
        int t;
        scanf("%d",&t);
        while (t--){
            int n;
            scanf("%d",&n);
            for(int i=1;i<=n;i++) {
                scanf("%d",&a[i]);
                sum1[i]=sum1[i-1];
                sum0[i]=sum0[i-1];
                if(a[i]==1) sum1[i]++;
                if(a[i]==-1) sum0[i]++;
            }
            int flag=0;
            for(int i=1;i<=n;i++) scanf("%d",&b[i]);
            for(int i=n;i>=1;i--){
                if(b[i]>a[i]){
                    if(sum1[i-1]) continue;
                    flag=1;
                }
                else if(b[i]<a[i]){
                    if(sum0[i-1]) continue;
                    flag=1;
                }
            }
            if(!flag) printf("YES
    ");
            else printf("NO
    ");
        }
    }
    

    Eugene and an array

    这个我自己写的方法非常复杂,不建议使用,来说说我看题解的方法吧。

    去遍历这个给定的序列,求以 (i) 这个节点为右端点,满足条件的序列有多少。

    因为左端点到右端点肯定是一个区间,每次就加这个区间的长度。

    对于一个点 (i) 如果这个位置的前缀和之前出现过,那么这个左端点一定要变化,变化到不能加上这段和为0的子段,也就是之前出现过的位置+1则是这个左端点的新位置,但如果这个左端点已经在这个位置的右边了,则不需要更新。

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn=5e5+10;
    map<ll,ll>mp;
    int main(){
        int n;
        scanf("%d",&n);
        mp[0]=1;
        ll sum=0,last=0,ans=0;
        for(int i=1,x;i<=n;i++){
            scanf("%d",&x);
            sum+=x;
            if(mp[sum]) last=max(mp[sum],last);
            ans+=i-last;
            mp[sum]=i+1;
        }
        printf("%lld
    ",ans);
        return 0;
    }
    

    Challenges in school №41

    我觉得这个题目挺好,但是我没有做好,可惜了。最后看的题解。

    题目大意:

    每一个人头有偏向,左边或者右边。如果有两个人的脸面对面,则可以对这一对进行操作,即左边的脸转向左边,右边的脸转向右边,问是否有一种转向的方法使得恰好k秒转完。注意:每一秒可以把这个序列所有的都转完,也可以只选择一部分。

    题解:

    这个首先我们可以求出最小的时间,然后也可以求出最多的时间,只要这个k在这个时间范围内即可完成任务,那怎么构造这个方法呢?其实就是把最小的时间补到k就行了,如果小于k,那就一个一个的转,如果等于了,那就按照正常的去一次性的转。

    我觉得这个代码写的很漂亮,可以看一下。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=3e6+10;
    vector<int>v[maxn];
    char s[maxn];
    int n,k,mins,maxs;
     
    void solve(){
        int p=0,num=0,cur=mins;
        while(cur<k){
            printf("1 %d
    ",v[p][num]);
            num++;
            if(num==v[p].size()){
                num=0;
                p++;
            }
            else cur++;
        }
     
        printf("%d",v[p].size()-num);
        for(int i=num;i<v[p].size();i++){
            printf(" %d",v[p][i]);
        }
        printf("
    ");
        p++;
        for(;p<mins;p++){
            printf("%d",v[p].size());
            for(int j=0;j<v[p].size();j++){
                printf(" %d",v[p][j]);
            }
            printf("
    ");
        }
    }
     
    void check(int p){
        for(int i=1;i<=n;){
            if(s[i]=='R'&&s[i+1]=='L'){
                s[i]='L',s[i+1]='R';
                v[p].push_back(i);
                i+=2;
            }
            else i++;
        }
    }
     
    int main(){
        mins=maxs=0;
        scanf("%d%d%s",&n,&k,s+1);
        check(0);
        while(v[mins].size()&&mins<=k){
            maxs+=v[mins].size();
            mins++;
            check(mins);
        }
    //    printf("mins=%d
    ",mins);
        if(mins<=k&&k<=maxs) solve();
        else printf("-1
    ");
        return 0;
    }
    

    Kate and imperfection

    这个题目其实一看是稍微有一点点的思路的,但是不知道如何去处理。

    首先很明确的是把素数和1都放进去,这个是 (gcd=1) 的情况,然后就是考虑 (gcd=2) 的情况了。

    这个怎么构造呢?首先我每放一个数,则这个数的所有的因子都已经在这个集合里面了,所以这个数的产生的贡献就是这个数的最大因子。如果这个数有一个因子没有放进这个集合,那么我就可以先放这个因子,再放这个数。

    没有说的很清楚,等官方题解出来再补充吧。

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn=5e5+10;
    int pri[maxn],cnt,v[maxn];
    void init() {
        cnt = 0;
        memset(v,0,sizeof(v));
        for (int i = 2; i < maxn; ++i) {
            if (!v[i]) {
                v[i] = i;
                pri[cnt++] = i;
            }
            for (int j = 0; j < cnt; ++j) {
                if (1ll * i * pri[j] >= maxn) break;
                v[i * pri[j]] = pri[j];
                if (i % pri[j] == 0) break;
            }
        }
    }
     
    int main(){
        init(),v[1]=1;
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) v[i]=i/v[i];
        sort(v+1,v+1+n);
        for(int i=2;i<=n;i++) printf("%d ",v[i]);
        printf("
    ");
        return 0;
    }
    
  • 相关阅读:
    org.eclipse.core.internal.registry.ExtensionsParser的流程分析
    控件设计时的属性页定位办法
    IE的内存泄漏问题
    <<深入剖析ASP.NET组件设计>>的一个辅助类
    midp2.0 图片文件名问题
    解决了XMLTextReader的用法的一个难题,EndElement
    J2ME开发心得
    解决Js内存泄漏问题的代码片断
    asp.net代码中尖括号和百分号的含义
    string.Format和cookie代码
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/12668060.html
Copyright © 2011-2022 走看看