CF1305E Kuroni and the Score Distribution
题意:
题解:
一开始想这个题,想法是一开始顺着填1,2,3…然后多删少补
如果1,2,3,4…这样顺延的填,对于ak=ka_{k}=kak=k可以贡献⌊k−12⌋\lfloor\frac{k-1}{2} \rfloor⌊2k−1⌋的答案(这个写写就试出来了)
现在我们设构造了1到k,然后三元组数量刚好超过m,假设超过答案x。对于一个k,按照上述方式可以贡献⌊k−12⌋\lfloor\frac{k-1}{2} \rfloor⌊2k−1⌋的答案,现在我们想要其贡献⌊k−12⌋−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−2x2⌋=⌊k−12⌋−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
#elsestartTime = clock ();freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= 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();
}