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 2k1的答案(这个写写就试出来了)
现在我们设构造了1到k,然后三元组数量刚好超过m,假设超过答案x。对于一个k,按照上述方式可以贡献 ⌊ k − 1 2 ⌋ \\lfloor\\frac{k-1}{2} \\rfloor 2k1的答案,现在我们想要其贡献 ⌊ k − 1 2 ⌋ − x \\lfloor\\frac{k-1}{2} \\rfloor-x 2k1x的贡献,这样就可以正好凑出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 2k12x=2k1x
现在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

cf 1305 E. Kuroni and the Score Distribution

CF1305F Kuroni and the Punishment (随机化)