2019ICPC徐州站重現賽 ACFM題解

2021-10-03 14:59:07 字數 3043 閱讀 4891

a - cat

題解:先打出異或字首和的表,不難發現當在偶數字置pos時,[pos,pos+3]這些數的異或和為0,這意味著中間的序列可以每四個四個的連一起,因為他們異或和的值為0,因此我們就可列舉開頭和結尾的位置,並維護最大長度。

**實現:

#include#define ll long long

using namespace std;

ll check(ll l,ll r)

else

}int main()

}printf("%lld\n",ans==0?-1:ans);

}return 0;

}

c - <3 numbers

題解:如果對質數密度不是很熟悉,那麼這道題就不是一道很好想的簽到題。

首先我們可以打乙個質數分布的表,然後根據質數分布定理( π(x)=x/ln(x) )。

我們可以推出當區間長度大於60的時候,所有區間的質數密度都滿足條件,直接輸出yes。

否則的話再在小區間裡面進行暴力列舉就行了。

**實現:

#pragma gcc optimize(2)

#include#include#include#include#include#include#include#include#include#include#include#define pi atan(1.0)*4

#define e 2.718281828

#define rp(i,s,t) for (register int i = (s); i <= (t); i++)

#define rp(i,t,s) for (register int i = (t); i >= (s); i--)

#define ll long long

#define ull unsigned long long

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

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define pii pair#define mp make_pair

#define pb push_back

#define debug printf("ac\n");

using namespace std;

inline int read()

while(c>='0'&&c<='9')

return a*b;

}const int inf = 0x3f3f3f3f;

const int n = 1e5+7;

bool visited[n];

int prime[n],tot;

void init()

bool find(int x)

else if (f.count(i * i * i + j * j * j - x))

return false;

}int main()

return 0;

}

m - kill the tree

題解:一道很不多的樹形dp題,考察了樹的重心的幾條特別重要的性質:

1.一顆樹的重心最多有兩個

2.一顆樹的重心到其他點的距離和最小,如果有兩個重心,那麼兩個重心的距離和 相等。

3.當兩個子樹合併時,新的樹的重心在連線這兩個子樹重心的鏈上。

因此根據這幾個性質,我們可以求出兩個重心連線的鏈,然後沿著這鏈往上走,能往上走的前提是距離和可以繼續減少,這樣保證當前點不是重心,直到走到那個深度比較大的重心,如果這個重心的距離和等於其父親的距離和,那麼他父親就也是重心。 

**實現:

#pragma gcc optimize(2)

#include#include#include#include#include#include#include#include#include#include#include#define pi atan(1.0)*4

#define e 2.718281828

#define rp(i,s,t) for (register int i = (s); i <= (t); i++)

#define rp(i,t,s) for (register int i = (t); i >= (s); i--)

#define ll long long

#define ull unsigned long long

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

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define pii pair#define mp make_pair

#define pb push_back

#define debug printf("ac\n");

using namespace std;

inline int read()

while(c>='0'&&c<='9')

return a*b;

}const int inf = 0x3f3f3f3f;

const int n = 2e5+7;

int n,m;

struct edgee[n*2];

int tot;

int head[n*2];

vectorh[n];

int p[n],sz[n],deep[n],son[n];

void addedge(int u,int v)

void update(int rt,int x,int y)

void dfs(int u,int fa)

}int main()

deep[1]=1;

dfs(1,0);

rp(i,1,n)

return 0;}/*

61 2

1 51 3

2 42 6

*/

2019ICPC徐州網路賽

theme n個數編號為1 n,兩種操作 1 x 將編號為x的數置為不可得,2 x 詢問x位置及其後第乙個可得數的編號。1 n,x 1e9,1 q 1e6 solution 首先想到用線段樹維護。初始時線段樹每個l r位置的值為l,1 x操作對應將x位置值置為inf,2 x 操作相當於查詢區間 x,...

2019 ICPC徐州 A Cat題解

題目大意 從1到正無窮的排列。t次詢問,每次給乙個l,r,s 每次在 l,r 選擇乙個最長的區間,使它的異或小於等於s.t 5e5 l,r 都是1e18 s 1e18 資料範圍這麼大一定是規律題 打表發現異或後為0的區間是長度為4而且迴圈的,這樣子的長度為4的區間的開始位置應該模4等於2或者0,這樣...

2019 ICPC 女生專場重現賽 B題

problem description wls 有乙個整數 n 他想將 1 n 這 n 個數字分成兩組,每一組至少有乙個數,並且使得兩組數字的和的最大公約數最大,請輸出最大的最大公約數。input 輸入一行乙個整數 n 2 n 1,000,000,000 output 輸出一行乙個整數表示答案。sa...