CSP校內集訓 打撲克

2022-03-16 23:32:41 字數 1578 閱讀 7160

有\(n\)堆大小為1的撲克,支援合併兩堆撲克和查詢有多少對撲克堆滿足\(|size_i-size_j|\leq c\),(\(c\)不確定)

暴力做法:開桶記錄當前存在有多少個大小為\(i\)的堆,查詢可用樹狀陣列或者雙指標,時間複雜度\(o(m^2logn)\)或者\(o(m^2)\)

優化:發現列舉大小的桶有很多是空的,實際上,可以證明\(m\)次操作最多出現\(\sqrt\)種不同的堆大小,用乙個時刻有序的\(vector/multiset\)即可

(寫的太醜了貼個本校大佬的**)

#include#include#include#include#include#include#define ll long long

using namespace std;

template < class t > inline void read (t &x)

while(isdigit(ch))

if(f)x=-x;

}const int maxn=1000001;

int n;

int num[maxn];

int fa[maxn];

int getfa (int x)

ll blans[maxn],bloans[maxn];

int siz[maxn];

int blosiz;

int bel[maxn];

int las;

void pre ()

blans[0]=1ll*n*(n-1)/2ll; num[1]=n;

blosiz=(int)sqrt (n);

for (register int i=1;i<=n;++i)

bloans[0]=blans[0]; las=bel[n];

}int m;

vector < int > vec;

vector < int >::iterator it;

ll query (int x)

int main()

for (it=vec.begin();it!=vec.end();++it)

if (siz[y]<=blosiz) num[siz[y]]--;

else vec.erase (lower_bound (vec.begin(),vec.end(),siz[y]));

for (int i=1;i<=blosiz;++i)

for (it=vec.begin();it!=vec.end();++it)

for (int i=1;i<=blosiz;++i)

for (it=vec.begin();it!=vec.end();++it)

if ((siz[x]+siz[y])<=blosiz) num[siz[x]+siz[y]]++;

else vec.insert (lower_bound (vec.begin(),vec.end(),siz[x]+siz[y]),siz[x]+siz[y]);

if (siz[x]siz[x]+=siz[y]; fa[y]=x;

} if (opt==2)

} return 0;

}

打撲克和插入排序

我們在打撲克的時候有兩種策略,一種是一邊抓牌一邊排序,比如 抓到2,再抓到5就排在2的左邊,又轉到3就放到中間,如此遞迴,牌抓好了也排序好了,似乎 很快。原因就是,在其他小夥伴抓牌的時候,你在排序,屬於平行計算,可不是你的排序演算法比較優秀,不過這種排序也是o n 的時間複雜度,效率還是很高的。而另...

使用打撲克的方式進行專案評估

專案經理準備乙個user story,每個人使用撲克的表達對於這個任務的預估。比如如果是10天,就蓋住乙個撲克牌10,不讓其它人看到。等大家都打出牌後,一起開牌。預期相差大的人互相闡述自己的考慮。再進行一輪,直到時間相差不大為止。討論完user story後,確定這個user story的實現和分工...

Python破解24點遊戲,從此打撲克就沒輸過

24點遊戲 對於任意給定的四張撲克牌,計算是否有贏得24點遊戲的方法 即使用加 減 乘 除四則運算湊成24的方法 如果有的話,列出所有可能的方法。在大小王以外的52張牌中,任意抽取其中4張牌。如果通過加 減 乘 除四則運算 可加括號 的方法,將抽到的4張牌算成24,則為勝利 每張牌都必須使用,且只能...