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\n");
            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;
}

 

转载于:https://www.cnblogs.com/wjnclln/p/10210747.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值