反正結論就是輸入n
nn就輸出nnn。
我考場上用的概率生成函式+組合等式毒瘤變形推出來的,不建議大家嘗試。。。
今天t1浪費的時間有點多,導致t3暴力掛掉了
證明考慮期望的線性性,在某乙個維度上進行一次平移就行了。
考場上想了兩個log
\log
log 發現有90分就不想管了,20分鐘寫完走人。
發現我差分一下就是正解。。。
首先還是觀察性質,設t1,
t2
t_1,t_2
t1,t2
表示題目給出的兩棵樹,t
2t_2
t2中的一條邊對t
1t_1
t1中的一條邊有貢獻當且僅當它們互相都在對方的覆蓋路徑上。(看不懂不要問,反正我自己懂,題解上面也有解釋
於是把t
2t_2
t2的邊放到t
1t_1
t1上樹上差分,然後詢問一下t
1t_1
t1中的這條邊在t
2t_2
t2中覆蓋的路徑上有多少點存活。
單點加,鏈求和,差分一下轉化為子樹加,單點求和,由於我們只需要子樹內部的資訊,在dfs的時候利用時間差分一次即可,於是可以用樹狀陣列小常數維護。聽說std寫的線段樹合併mle了
**:
#include
#define ll long long
#define re register
#define cs const
namespace io
template
<
typename t>
inline t get()
inline
intgi()
}using
namespace io;
using std::cerr;
using std::cout;
typedef std::pair<
int,
int> pii;
#define fi first
#define se second
int n;
namespace t2
int in[n]
,out[n]
,dfn;
int fa[n]
,d[n]
,son[n]
,siz[n]
,top[n]
;void
dfs1
(int u,
int p)
++siz[u];}
void
dfs2
(int u,
int tp)
inline
intlca
(int u,
int v)
void
init()
}namespace bit
inline
intquery
(int p)
}namespace t1
int fa[n]
,d[n]
,son[n]
,siz[n]
,top[n]
;void
dfs1
(int u,
int p)
++siz[u];}
void
dfs2
(int u,
int tp)
inline
intlca
(int u,
int v)
void
init()
int ans[n]
; std::vector<
int> ins[n]
,del[n]
;void
work
(int u,
int p,
int eid)
for(
int re e=el[u]
,v=to[e]
;e;v=to[e=nxt[e]])
if(v!=p)
work
(v,u,e>>1)
;for
(int re i=
0;i.size()
;++i)
for(
int re i=
0;i.size()
;++i)
if(eid)
}void
solve()
work(1
,0,0
);for(
int re i=
1;i++i)cout<<<
" ";}}
signed
main()
非常詭異的倍增,做法自己看題解,主要是細節有點多,這裡扔乙個**:
#include
#define ll long long
#define re register
#define cs const
#define int ll
namespace io
template
<
typename t>
inline t get()
inline
intgi()
}using
namespace io;
using std::cerr;
using std::cout;
using pii=std::pair<
int,
int>
;#define fi first
#define se second
cs int n=
2e5+
7,inf=
1e9+
1e7;
int n,m,q;
std::vector<
int> g[n]
;std::vector<
int> pre[n]
;int siz[n]
,rk[20]
[n];
int to[20]
[n],son[n]
,lim[n]
;int d[n]
,q[n]
,qn;
intgo
(int s,
int k)
int p=std::
lower_bound
(pre[s]
.begin()
,pre[s]
.end()
,k)-pre[s]
.begin()
;return
go(g[s]
[p],k-
(p?pre[s]
[p-1]:
0)-1
);}signed
main()
for(
int re i=
1;i<=n;
++i)if(
!d[i]
)q[++qn]
=i;for
(int re i=
1;i<=qn;
++i)
for(
int re i=qn;i;
--i)
to[0
][u]
=son[u]
,rk[0]
[u]=rec;
for(
int re &j=
(lim[u]=0
);to[j]
[u];
++j)
--lim[u]
;}q=gi(
);while
(q--
) cout<<
go(s,k)
<<
"\n";}
return0;
}
怎麼說呢,今天算是最近幾場裡面翻車比較大的一次,t3暴力掛成了0分。
然而這是因為t1用了非常毒瘤的推法推了乙個半小時,然後後面時間就感覺有點不夠用了,前3分鐘t3才調過樣例,然而樣例太弱掛成0分。。。
l:你簡單題做少了
我:。。。
我tm還能說什麼。。。
10 5測試爆零記錄
昨天沒怎麼睡好,今天早上來的時候有點暈乎乎的。開題,一看t3好像做過,但是已經完全忘記了怎麼做了。然後開始xjb推,推得好像對了開始xjb亂寫,十點寫完。感覺t1的o n log 2n o n log 2n o nlog2n 隨便寫,然後就各種亂寫,然後卡了卡常。回頭靜態debug了一波t3,好像平...
圈圈 測試 環境 零星記錄01
1 vc6 程式設計 從這裡進 我是傳送到 桌面快捷方式的 點選 lanuch program 進去 這樣 有一些ddk的環境變數 就自己設定好了,不用人為再次設定 2 進去之後,是這樣 2.1 主要是 工程建立之後,再次開啟的話,不要使用 選單欄 driverwizard load project...
LeetCode刷題記錄 第283題(移動零)
給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。class solution def movezeroes self,nums ...