zoukankan      html  css  js  c++  java
  • Codeforces Goodbye 2018

    真是可怕...家里设备差的我无法想象...用txt打完的全场比赛【无奈】

    先%下镇海ljz大佬和杭二lqz大佬 tql

    A题 New Year and the Christmas Ornament

    签到题吧...

    题面那么长,说到底就是求一个最大的 n + (n + 1) + (n + 2)的和

    #include <bits/stdc++.h>
    using namespace std;
    int a,b,c;
    int main(){
        scanf("%d%d%d",&a,&b,&c);
        b--;c-=2;
        int ans=min(b,min(a,c));
        ans=ans*3+3;
        printf("%d",ans);
    }
    

     

    B题 New Year and the Treasure Geolocation

    B题是开始翻车的源头...发现不开翻译看不懂题意...尴尬的搞了火狐翻译插件

    然后发现codeforces上不去了(家里电脑没有小飞机)...可怕

    题意:给你n个点,有n个提示,但不知道对应关系,求目标点坐标。

    又是签到题...

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e3+7;
    int n;
    int a[N],b[N],x[N],y[N];
    int main() {
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++) 
    		scanf("%d%d",&a[i],&b[i]);
    	for (int i=1;i<=n;i++)
    		scanf("%d%d",&x[i],&y[i]);
    	sort(a+1,a+1+n);
    	sort(b+1,b+1+n);
    	sort(x+1,x+1+n);
    	sort(y+1,y+1+n);
    	cout<<a[1]+x[n]<<" "<<b[1]+y[n]<<endl;
    	return 0;
    }
    

     C题 New Year and the Sphere Transmission

    题意:遍历长度为n的一个环,输出k从1到n的遍历的点的和的所有值。

    n为质数时,答案只有1和n的m倍;k前后对称,可以想到通过枚举n的因数,得到k的最小值,惊讶的发现和是等比数列!

    所以复杂度为Ο(√n)

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll n;
    vector<ll> a;
    inline ll Calc(ll x) {
    	return 1ll*(n/x-1)*(n/x)/2*x+n/x;
    }
    int main()
    {
       scanf("%I64d",&n);
        for (ll i=1;i*i<=n;i++)
            if (n%i==0) {
            	a.push_back(Calc(i));
    		a.push_back(Calc(n/i));
    	}
        sort(a.begin(),a.end());
        a.erase(unique(a.begin(),a.end()),a.end());
        for (int i=0;i<a.size();i++)
        	printf("%I64d ",a[i]);
        return 0;
    }
    //cz的代码,很简洁,我的就不贴了2333

    D题 New Year and the Permutation Concatenation

    对着题意困惑了很长时间...大概是冻的失去了智商吧2333

    题意:给n!个n的排列,按字典序从小到大连成一条序列,例如3的情况为:[1,2,31,3,22,1,,2,3,,3,1,,3,2,1],问其中长度为n,且和为sum=n*(n+1)/2的序列有多少个?

    题意来源:https://blog.csdn.net/aiqiyizz/article/details/85530211

    本来我是想贴steps大佬给我的题意,后来发现这个qq太垃圾,找不到消息记录...这个题意也挺好的

    官方题解:There is also a simple recurrence counting the same answer, found by arsijo:d(n)=(d(n−1)+(n−1)!−1)⋅n

    正常思路先打表找规律...然后就能得到这个公式

    如果不想用打表也可看https://www.cnblogs.com/si-rui-yang/p/10203170.html

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll N=5e6+7,mod=998244353;
    ll n,a[N];
    int main(){
    	scanf("%I64d",&n);
    	a[n+1]=1;
    	for(ll i=n;i>=0;i--)
    	    a[i]=(a[i+1]*i)%mod;
    	ll num=n;
    	for(ll i=1;i<=n;i++)
    		num=(num*i)%mod;
    	num=((num-n+1)%mod+mod)%mod;
    	for(ll i=1;i<n;i++){
    		ll ans=(((a[i+1]-a[i+2])%mod+mod)%mod*i)%mod;
    		num=((num-ans)%mod+mod)%mod;
    	}
    	printf("%I64d",num);
    	return 0;
    }
    //依然不是我的尴尬...

     E题 New Year and the Acquaintance Estimation

    没看到链接的尴尬...这就是把题解给你然后阅读理解吧...

    贺个题意:给定n个点的度数序列,再添加一个点,求添加的这个点的度数为多少时,满足这n+1个点可以构成简单无向图。

    其实好简单...真的二分查找上下界,答案就是依次-2可怕

    分享下大哥给的黑科技
    将图的顶点按度数排序,找到度数最大的顶点(设度数为n0)
    去掉这个顶点,同时使接下来n0个顶点的顶点数减一。
    重复上述步骤,直至剩余顶点的度数都为0,则图存在,否则图不存在。

    #include <bits/stdc++.h>
    using namespace std;
    const int N=500010;
    int n,a[N];
    long long s2[N],s1[N],sum,Min,Max; 
    inline int read(){
        char ch;
        bool f=false;
        int res=0;
        while ((ch=getchar())<'0'||ch>'9');
        res=ch-'0';
        while ((ch=getchar())>='0'&&ch<='9') res=(res<<3)+(res<<1)+ch-'0';
        return res;
    }
    long long work(){
        for (int i=n;i>=1;i--)
            s1[i]=s1[i+1]+a[i];
        for (int i=1;i<=n;i++)
            s2[i]=s2[i-1]+a[i];
        long long x=0;
        sum=0;
        for (int i=1;i<=n;i++)
            sum+=a[i];
        for (int i=n;i;i--){
            int y=lower_bound(a+i+1,a+n+1,i,greater<int>())-a;
            long long z=(long long)i*(i-1)+(long long)(y-i-1)*i+s1[y];
            if (s2[i]-z>i){
                printf("-1
    ");
                exit(0);
            }
            x=max(x,s2[i]-z);
        }
        if (sum&1){
            if (x&1);else x++;
        }
        else {
            if (x&1) x++;
        }
        return x;
    }
    int main(){
        n=read();
        for (int i=1;i<=n;i++)
            a[i]=read();
        sort(a+1,a+n+1,greater<int>());
        Max=work();
        reverse(a+1,a+n+1);
        for (int i=1;i<=n;i++)
            a[i]=n-a[i];
        Min=n-work();
        if (Max>Min){
            int T=Max;
            Max=Min;
            Min=T;
        }
        for (long long i=Max;i<=Min&&i<=n;i+=2)
            printf("%lld ",i);
        return 0;
    }
  • 相关阅读:
    L2 L3 L4
    C 语言assert使用
    VIM 命令收藏
    C++继承实例
    关于 WinScp 的一点使用经验
    Boa服务器移植
    Android 去掉标题全屏显示
    sys下gpio操作
    linux下 XGCOM串口助手的安装
    linux中inittab文件详解
  • 原文地址:https://www.cnblogs.com/wjnclln/p/10210747.html
Copyright © 2011-2022 走看看