CF1305E Kuroni and the Score Distribution
CF1305E Kuroni and the Score Distribution
題意:
題解:
一開始想這個題,想法是一開始順著填1,2,3…然后多刪少補(bǔ)
如果1,2,3,4…這樣順延的填,對于ak=ka_{k}=kak?=k可以貢獻(xiàn)?k?12?\lfloor\frac{k-1}{2} \rfloor?2k?1??的答案(這個寫寫就試出來了)
現(xiàn)在我們設(shè)構(gòu)造了1到k,然后三元組數(shù)量剛好超過m,假設(shè)超過答案x。對于一個k,按照上述方式可以貢獻(xiàn)?k?12?\lfloor\frac{k-1}{2} \rfloor?2k?1??的答案,現(xiàn)在我們想要其貢獻(xiàn)?k?12??x\lfloor\frac{k-1}{2} \rfloor-x?2k?1???x的貢獻(xiàn),這樣就可以正好湊出m,那就需要讓其中x對(i,j)無效。
如何讓x對無效?我們令當(dāng)前的k變?yōu)閗+2x,前k-1個數(shù)中最大的是k-1,原先k-1和1和k組合成三元組(k-1+1=k),現(xiàn)在k變成k+2x,那么k-1只能和2x+1去匹配,前2x個數(shù)原先都能組成三元組,現(xiàn)在不行了,這樣不就少掉2x個可以用的數(shù),答案就變成?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
現(xiàn)在m已經(jīng)構(gòu)造好了,n個數(shù)如何補(bǔ)齊,這個我和隊友想了很久,我想的是差級補(bǔ)充但是不對,因為你要考前之前填充的數(shù)的影響。最佳是到這搞,我們之前已經(jīng)填充了一些數(shù),如果之前填充的最大數(shù)是w,那就從1e9開始按照2 * j的步長遞減即可,因為這樣間隔為2j,而之前所能貢獻(xiàn)的最大是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(); }總結(jié)
以上是生活随笔為你收集整理的CF1305E Kuroni and the Score Distribution的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq邮箱怎么看发件箱(手机qq邮箱怎么看
- 下一篇: 交易师趋势线--浩然多空指数,需下载交易