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#includet1 code#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;
}
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 #include9t2 codeusing
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 }
t3:chess
首先第一問很簡單,可以直接雙端佇列bfs或建圖跑最短路
然後看第二問,發現只有走的空地不同才算不同的方案
發現n的範圍很小,於是對於dfs每乙個敵軍的連通塊,看它連線著哪些空地,在這些空地間兩兩連邊
再將直接可以到達的兩空地間連邊
特別的:可以將敵人的帥看做乙個空地進行連邊
跑最短路計數就行了
注意:相同的邊只能連一次,所以可以用鄰接矩陣來存邊
(有點毒瘤……)
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9t3 code#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()
考試反思 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 ...