noip模擬測試19

2022-05-06 23:06:11 字數 3560 閱讀 2797

t1:count

首先容易發現塊的大小一定是n的約數,列舉約數$o(\sqrt n)$

考慮怎麼判定

設塊大小為k

發現只要最下方的子樹$(a)$大小是$k$,包含a的子樹$(b)$大小是$2k$,包含b的子樹$(c)$大小是$3k$……

即:只需要有$n/k$個子樹的大小是$k$的倍數即可

所以就可以$o(n)$的判定了,然後就無腦提交$o(n \sqrt n )$過百萬???

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1000005

;int

n,ans,siz[maxn];

struct

node mp[maxn*2

];int

h[maxn],tot;

void dfs(int u,int

fa)

}inline

intr()

intmain()

dfs(

1,0);

for(int i=2;iif(n%i==0

) printf(

"%d\n

",ans+2

);

return0;

}

t1 code

t2:dinner

沒想到倍增,想到了二分可以跳到的點,但m的範圍沒有給,若m與n同級複雜度就爆了,所以沒寫

結果發現m實際上很小,好多人都用二分水過了……

首先斷環成鏈,二分答案

最暴力的判定是列舉端點,再一步一步貪心的跳,複雜度$o(n^2logn)$

考慮優化跳的複雜度

對於每次check,可以$o(nlogn)$的預處理跳$2^n$步可以跳到**

然後把m二進位制拆開跳,複雜度$o((nlogn+logm)*logn)$,若m與n同級$o(nlog^2n)$

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

using

namespace

std;

10const

int maxn=50005;11

int n,m,ans,suma,mx,t[maxn*2],nxt[maxn*2][20

];12 inline int

r()

18bool check(int

lim)

26if(pos-i>=n) return1;

27}28return0;

29}30void first(int

lim)

40 sum+=t[i];41}

42while(l<=2*n) nxt[l][0]=2*n+1,++l;

43for(int i=0;i<=18;i++) nxt[2*n+1][i]=2*n+1;44

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

45for(int j=1;j+(1

<

46 nxt[j][i]=nxt[nxt[j][i-1]][i-1

];47}48

intmain()

61 printf("

%d\n

",ans);

62return0;

63 }

t2 code

t3:chess

首先第一問很簡單,可以直接雙端佇列bfs或建圖跑最短路

然後看第二問,發現只有走的空地不同才算不同的方案

發現n的範圍很小,於是對於dfs每乙個敵軍的連通塊,看它連線著哪些空地,在這些空地間兩兩連邊

再將直接可以到達的兩空地間連邊

特別的:可以將敵人的帥看做乙個空地進行連邊

跑最短路計數就行了

注意:相同的邊只能連一次,所以可以用鄰接矩陣來存邊

(有點毒瘤……)

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

#define ll long long

10using

namespace

std;

11const

int maxn=70,inf=0x3f3f3f3f;12

intn,m,bx,by,ex,ey,eid,s[maxn][maxn];

13int dx[8]=,dy[8]=;

14struct

node mp[maxn*maxn*8

];17

int h[maxn*maxn],tot;

18int id(int x,int

y) 21

void add(int x,int y,int

z) 27

void

build()

32if(s[i][j]==3) bx=i,by=j;

33for(int k=0;k<8;k++) 39}

40}41}

42int ver[maxn*maxn][maxn*maxn],dis[maxn*maxn];

43 vectortver;

44bool vis[maxn*maxn],flag;

45void dfs(int

u) 54}55

void

new_build() 69}

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

71for(int j=1;j<=m;j++) if(s[i][j]==0||s[i][j]==3)72

for(int k=h[id(i,j)];k;k=mp[k].nxt)

73if(mp[k].dis||mp[k].to==eid)

74 ver[id(i,j)][mp[k].to]=ver[mp[k].to][id(i,j)]=1;75

}76 ll cnt[maxn*maxn];

77void

get_cnt() else

if(dis[v]==dis[u]+ds) cnt[v]+=cnt[u];94}

95}96 printf("

%lld\n

",cnt[eid]);97}

98void

dijkstra()

113}

114}

115if(dis[id(ex,ey)]==inf) else printf("

%d\n

",dis[id(ex,ey)]);

118}

119int

main()

t3 code

考試反思 NOIP模擬測試19 洗禮

1 260 2 230 3 210 6 200 8 170 9 160 這套題一般,資料很弱,t1t2暴力都能a,而且都是一些思維題,想不到就爆0。原因不明,很多一直很強的人在這一次滑鐵盧了,於是我個渣渣就鑽上來了。然而t3本來ac的 交錯語言了 我怎麼知道為什麼會選中python?乙個ce看傻我了...

NOIP模擬測試22

自 閉 賽 從這次比賽之後題都好難啊qaq 開考一小時內沒動鍵盤。三道題都不會。gg problem a 數論 過於玄學 列舉質因子,往答案裡去加。用來加入的質因子不會很多,質因子大了對答案是不優的。開兩個vector來回倒騰就完了 這題改完感覺也沒啥,為啥考場上就是想不出來啊qxq 1 inclu...

NOIP模擬測試20

liu runda聚聚的饋贈 problem a 周 防自閉題?這道題讓我整個考試都很愉悅 搜就完事了 1 include 2 3intn 4 int a 20 b 20 c 20 d 20 5 long long ans 67 void dfs int day,long long oi,long ...