Codeforces Goodbye 2018
Posted Trimsteanima
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,3, 1,3,2, 2,1,3 ,2,3,1 ,3,1,2 ,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; }
以上是关于Codeforces Goodbye 2018的主要内容,如果未能解决你的问题,请参考以下文章
codeforces Goodbye2018 C. New Year and the Permutation Concatenation 傻瓜解法找规律+打表