CF1305E Kuroni and the Score Distribution
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1305E Kuroni and the Score Distribution相关的知识,希望对你有一定的参考价值。
CF1305E Kuroni and the Score Distribution
题意:
题解:
一开始想这个题,想法是一开始顺着填1,2,3…然后多删少补
如果1,2,3,4…这样顺延的填,对于
a
k
=
k
a_{k}=k
ak=k可以贡献
⌊
k
−
1
2
⌋
\\lfloor\\frac{k-1}{2} \\rfloor
⌊2k−1⌋的答案(这个写写就试出来了)
现在我们设构造了1到k,然后三元组数量刚好超过m,假设超过答案x。对于一个k,按照上述方式可以贡献
⌊
k
−
1
2
⌋
\\lfloor\\frac{k-1}{2} \\rfloor
⌊2k−1⌋的答案,现在我们想要其贡献
⌊
k
−
1
2
⌋
−
x
\\lfloor\\frac{k-1}{2} \\rfloor-x
⌊2k−1⌋−x的贡献,这样就可以正好凑出m,那就需要让其中x对(i,j)无效。
如何让x对无效?我们令当前的k变为k+2x,前k-1个数中最大的是k-1,原先k-1和1和k组合成三元组(k-1+1=k),现在k变成k+2x,那么k-1只能和2x+1去匹配,前2x个数原先都能组成三元组,现在不行了,这样不就少掉2x个可以用的数,答案就变成
⌊
k
−
1
−
2
x
2
⌋
=
⌊
k
−
1
2
⌋
−
x
\\lfloor\\frac{k-1-2x}{2} \\rfloor=\\lfloor\\frac{k-1}{2} \\rfloor-x
⌊2k−1−2x⌋=⌊2k−1⌋−x
现在m已经构造好了,n个数如何补齐,这个我和队友想了很久,我想的是差级补充但是不对,因为你要考前之前填充的数的影响。最佳是到这搞,我们之前已经填充了一些数,如果之前填充的最大数是w,那就从1e9开始按照2 * j的步长递减即可,因为这样间隔为2j,而之前所能贡献的最大是j+(j-1),刚好组不成三元组
代码:
#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{
x= 0;
char c= getchar();
bool flag= 0;
while (c < '0' || c > '9')
flag|= (c == '-'), c= getchar();
while (c >= '0' && c <= '9')
x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();
if (flag)
x= -x;
read(Ar...);
}
template <typename T> inline void write(T x)
{
if (x < 0) {
x= ~(x - 1);
putchar('-');
}
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#else
startTime = clock ();
freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#else
endTime= clock();
printf("\\nRun Time:%lfs\\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
int n,m;
const int maxn=2e5+9;
int ans[maxn];
int main()
{
//rd_test();
cin>>n>>m;
int cnt=0;
bool f=0;
for(int i=1;i<=n;i++){
ans[i]=i;
cnt+=(i-1)/2;
if(cnt>=m){
int s=1e9;
int x=cnt-m;//多出部分
ans[i]+=2*(cnt-m);
for(int j=n;j>i;j--)
{
s-=(ans[i]+1);
ans[j]=s;
}
f=1;
break;
}
}
if(f){
for(int i=1;i<=n;i++){
printf("%d ",ans[i]);
}
}
else {
printf("-1\\n");
return 0;
}
//Time_test();
}
以上是关于CF1305E Kuroni and the Score Distribution的主要内容,如果未能解决你的问题,请参考以下文章
CF1305F Kuroni and the Punishment
CF1305D Kuroni and the Celebration
CF1305F Kuroni and the Punishment
cf 1305 E. Kuroni and the Score Distribution