慣例先看一遍三道題,t1 一開始反應要求割點,但是這是有向圖,肯定不能求割點,康了一下資料範圍,有40%是樹的,還不錯,決定待會在打。
看t2 字串題,完了我字串最弱了,肯定只能打暴力了,帶著前兩題都不會的心情,看了t3發現是期望,完了爆0了,在一看,發現是sb原題,還簡單一點,趕緊把t3碼了一遍過大樣例,覺得很穩就交了,然後用一點時間把t1樹的分給碼了,然後開始磨t2,發現啥都不會開始dfs,一開始覺得只能拿30pts,後來發現沒有回溯是$o(n^2)$的,打完就沒剩多少時間了,然後考慮t3要不要開long long,覺得沒必要就沒開石樂智。然後想t1無果。
出分發現t3wa 80,然後把開了long long的**交上去a了,我怕不是個傻子,不卡時間為什麼不開long long啊qaq。t2a了,t140,後來聽說用樹的方法跑所有測試點能拿60,艹。少兩句話少拿40.jpg。
扯多了2333
t1 attack:
據說是什麼支配樹裸題,蒟蒻不會,只能照著題解打。
必經關係是一棵樹,這好像就是支配樹?那麼1到k的必經點就是k在這棵樹上的祖先,所以我們在有向圖中跑個拓撲排序,就可以建出這棵樹,但實際上我們並不需要真正建出這棵樹,只需要維護求lca所用的fa陣列和dep陣列即可。另外,因為題目中說所有點都從1開始,所以一開始只要把1入隊就吼了。
再說一下我的sb手殘錯誤
我是大裝置
1 #include2attackusing
namespace
std;
3const
int n=1e5+10;4
const
int inf=1e9+7;5
int first[n],nex[n<<1],to[n<<1
],tot;
6void add(int a,int
b)9 vector in
[n];
10int d[n],du[n],fa[n][18
],v[n],w[n];
11int lca(int x,int
y)18
19int
main()
30 queueq;
31 q.push(1
);32
//d[1]=0;
33/*
for(int i=1;i<=n;++i)43}
*/44
//for(int i=1;i<=n;++i) if(!du[i]) q.push(i)/*,du[i]=inf*/;
45while
(q.size())59}
60}61//
for(int i=1;i<=n;++i,cout<62
for(int i=1;i<=que;++i)70}
71/*
724 3 2
731 2
742 3
752 4
762 3 4
772 2 4
78*/
t2 reverse:
只需要考慮最後一位是什麼就好了,然後誰長就縮誰,直到他們兩個一樣長,就一起縮,博主打的是dfs,細節很多,很難調,所以**就不提供了,所以就以soul神的**為參考吧。
鳴謝soul
1 #include2reverse#define re register
3using
namespace
std;
4int t,a[2010],b[2010]; char s[2010]; int
len;
5 inline bool
cmp()
11signed main()
24else
if(a[0]0
])25
while(b[0]>a[0
])29
else
if(a[0]==b[0
])35}36
if(a[0])
37else puts("-1"
);38}39
return0;
40 }
t3 tree:
原題,不,比原題簡單,然後賽時第乙個提交,成功long long見祖宗,喜提wa80。
題解是什麼方法我也不知道,所以就用自己的方法說了還不是頹的以前的題解。
我們設$f[x]$表示從$x$到$fa[x]$的期望步數,$g[x]$表示從$fa[x]$到$x$的期望步數。
考慮轉移$f[x]=\frac+\sum}$
挺顯然的,就是他可以直接上去,也可能先下去在上去。
化簡得$f[x]=du[x]+\sum$,一遍dfs可以求出
在來考慮g的轉移
$g[x]=\frac+\frac+\frac}$
其實和f的轉移也差不多就是分類討論,可以直接下去,可以到x的兄弟節點也可以到x的父節點的父節點。
化簡得$g[x]=du[fa]+g[fa]+\sum$
然後樹上字首和就可以求出從根到x的期望步數了。
吐槽:考試時知道答案一定是整數就沒開double,然後,關於int,他死了最後都想到開long long了為什麼不交啊,我的首殺。
1tree//yuanti2//
xingkuizuoguo
3 #include4
using
namespace
std;
5const
int n=1e5+10;6
#define int long long
7int first[n],nex[n<<1],to[n<<1
],tot;
8void add(int a,int
b)11
int f[n],g[n];//
f[x] x->fa[x] g[x] fa[x]->x
12int
sumg[n],sumf[n];
13int
du[n];
14void dfs(int x,int
fa)22 sumf[x]=f[x];23}
24void dfs1(int x,int
fa)31}32
void dfs2(int x,int fa)39}
4041
signed main()
51 dfs(1,0
);52 f[1]=0
;53 dfs1(1,0
);54 sumg[1]=g[1
];55 dfs2(1,0
);56
//for(int i=1;i<=n;++i) cout<
//cout<58
//for(int i=1;i<=n;++i) cout<
//cout<60
for(int i=1;i<=n;++i)63}
64/*653
661 2
672 3
68*/
CSP S模擬測試94 題解
高精硬上似乎跑不過,其實可以都取個 log 那麼只需要比較 y times log x 和 sum limits y log i 就好了。includeusing namespace std int t double x,y void work int main 顯然目標區間合法的充要條件是 把位置...
CSP S模擬測試69 題解
一如既往的垃圾,又回到了那個場場墊底的自己,明明考場上都想到正解了,但是就是拿不到分,可能是互奶把rp用光了吧以後一定加強訓練 能力。t1 考場上一直yy矩陣快速冪,雖然自己矩陣快速冪一點都不會還是硬著頭皮yy,發現不可做之後並沒有及時轉化思路,但其實自己預處理的陣列就是正解。切記 不僅矩陣快速冪是...
CSP S模擬測試50 反思 題解
大部分人都覺得t3是道不可做題去剛t1t2了,於是我就僥倖苟到了前面?這場考試比較成功的就是快速水掉了t1t2的部分分,1h拿到88分起碼為之後硬肝t3上了保險 賽後發現就算t3爆零也能rank15?剩下也就沒什麼了 t3的分完全是時間堆出來的,還有運氣成分。因為當時第乙個a掉了二分答案專題的奶牛健...