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的主要内容,如果未能解决你的问题,请参考以下文章