2020牛客暑期多校訓練營(第四場)

2021-10-08 19:01:43 字數 3462 閱讀 3376

參考部落格

注意的幾個點:

#include

using

namespace std;

typedef

long

long ll;

//typedef __int128 lll;

#define print(i) cout << "debug: " << i << endl

#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)

#define mem(a, b) memset(a, b, sizeof(a))

const ll mod =

1e9+7;

const

int maxn =

2e5+10;

const

int inf =

0x3f3f3f3f

;vector<

int> g[maxn]

;int dep[maxn]

, st[maxn]

, ed[maxn]

, anc[maxn][20

], nodeof[maxn]

;int ans[maxn]

;int n, tim;

struct node

t[maxn <<2]

;void

init()

void

dfs(

int u,

int fa)

intfindfa

(int u,

int len)

void

pushup

(int tar)

//更新本子樹的最深的點

void

build

(int l,

int r,

int tar)

int mid = l + r >>1;

build

(l, mid, tar <<1)

,build

(mid +

1, r, tar <<1|

1);pushup

(tar);}

void

update

(int l,

int r,

int tar,

int val)

int mid = t[tar]

.l + t[tar]

.r >>1;

if(l <= mid)

update

(l, r, tar <<

1, val);if

(r > mid)

update

(l, r, tar <<1|

1, val)

;pushup

(tar);}

intmain()

dep[0]

=-1;

dfs(1,

0);build(1

, tim,1)

;mem

(ans, inf)

;update

(st[1]

, ed[1]

,1,1

);for(

int i = n -

1; i >=

0; i--

) ans[cost]

= i;

for(

int it : buf)

update

(st[it]

, ed[it],1

,0);

}for

(int i =

2; i <= n; i++

) ans[i]

=min

(ans[i]

, ans[i -1]

);ll sum =0;

for(

int i =

1; i <= n; i++

) sum +

= ans[i]

; cout << sum << endl;

}}

先找出每個數的最大質因數,將最大質因數相同的放在乙個集合中,從後往前遍歷每乙個集合,如果該集合大小》=2並且大小為偶數,則可以兩兩配對,若為奇數,設該質因數為p,將2p放入質因數為2對應的集合中。

#include

using

namespace std;

typedef

long

long ll;

//typedef __int128 lll;

#define print(i) cout << "debug: " << i << endl

#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)

#define mem(a, b) memset(a, b, sizeof(a))

const ll mod =

1e9+7;

const

int maxn =

2e5+10;

const

int inf =

0x3f3f3f3f

;int maxp[maxn]

, vis[maxn]

, p[maxn]

;int cnt;

vector<

int> v[maxn]

;vectorint,

int>

> res;

void

init()

}int

main()

for(

int j =

1; j < v[p[i]].

size()

; j +=2

) res.

push_back

(make_pair

(v[p[i]

][j -1]

, v[p[i]

][j]))

;}for(

int j =

1; j < v[2]

.size()

; j +=2

) res.

push_back

(make_pair

(v[2

][j -1]

, v[2]

[j]));

cout << res.

size()

<< endl;

for(

int i =

0; i < res.

size()

; i++

)printf

("%d %d\n"

, res[i]

.first, res[i]

.second);}

}

2020牛客暑期多校訓練營(第四場)

傳送門 打表發現 f n,c c n可以分解為多少個質因數 用尤拉篩打出可以分解為多少個質因數 includeusing namespace std typedef long long ll const ll inf 0x3f3f3f3f3f3f3f3f const double pi acos 1...

2020牛客暑期多校訓練營 第四場

開始堇業,把之前欠的債補上。這場只出了兩個水題。題目看起來太複雜了。仔細分析以後其實是除掉最小質因數之後的那個數的次數 1。一開始質因數從1列舉哇了一發。我是弱智。include using namespace std typedef long long ll const int mod 1e9 7...

牛客暑期多校訓練營B Boundary

給定n個點,然後確定乙個過原點的圓,要使這n個點盡可能多的存在與圓上,最後輸出最多的存在於圓上的點的個數 三點確定乙個圓,我們已知這個圓必定經過原點,所以再依次利用三點求圓心的公式列舉每兩個點與原點 三點不共線 確定的圓心,最後選擇確定次數最多的圓心構成的圓 include include incl...