15059 特教的理性愉悅

2021-10-06 14:20:47 字數 3624 閱讀 6099

問題 c: 特教的理性愉悅

時間限制: 1 sec 記憶體限制: 128 mb

題目描述

某正教授級特級教師忽然想自娛自樂。於是他準備在紙上畫一棵樹。這棵樹開始時只有n個點,然後特教開始逐條畫上一些帶權無向邊(保證任意時刻紙上的任意兩點間至多有一條路徑),直到最後形成一棵樹。

為了達到理性愉悅的目的,特教在加邊的過程中可能會隨意選取兩個點並取出連線它們的路徑,計算該路徑上所有點對距離之和(如果已經有路徑連通)。

例如路徑共有(1,2)(1,3)(1,4)(2,3)(2,4)(3,4)六個點對,距離之和為5+8+10+3+5+2=33。現在特教需要檢驗他的答案是否正確,於是想請你編個程式幫他驗算一下。

輸入第一行為兩個正整數,n,m(n≤100000,m≤250000),表示樹的點數和運算元。

第二行開始的m行為m個操作的具體內容,分為兩種:

(1)「1 u v w」,表示加一條連線u和v的邊,邊權為w;

(2)「2 u v」,表示詢問當前樹上u到v的路徑上所有點對距離之和,如果還不連通則輸出-1。

輸入資料保證加邊合法,u≠v,邊權w為正整數,且其中恰有n-1個(1)操作以及至少1個(2)操作,即m≥n。

輸出對於每個(2)操作輸出一行,表示詢問的結果。

樣例輸入 copy

【樣例1】

4 51 1 2 5

1 2 3 3

2 1 4

1 3 4 2

2 1 4

【樣例2】

10 18

1 2 4 456

1 9 5 801

2 7 3

1 9 7 473

1 9 2 591

1 7 6 409

2 4 2

1 1 7 997

1 3 4 751

1 6 8 576

1 4 10 657

2 4 9

2 2 9

2 9 6

2 4 3

2 10 9

2 7 4

2 9 8

樣例輸出 copy

【樣例1】

-133

【樣例2】

-1456

2094

5911764

7515568

5151

4783

首先,由於形成了一棵樹,因此只要詢問時可達,此時詢問答案和所有邊連完再詢問答案是相同的,因此拿乙個並查集維護是否可達,如果不可達標記一下,所有邊連完後統一處理剩下的答案

然後就是答案處理,可以看出,答案是一段路徑上每個邊權分別乘不同的係數,係數可以如下得到:

第x個123

4-1-

12-1

23-1

234sum46

64換一種計算方式:

第x個123

4-12

34-1

234-

1234

-123

4-12

34sum466

4被刪除的和14

916總和5*1=5

5*2=10

5*3=15

5*4=20

也就是說,對於一條鏈,如果處理出來邊權為149和123的sum,那麼答案就是(len+1)*sum123-sum149

由於這個權值一定是對稱的,計u,v的lca為p,則可以分別處理u-p,v-p兩段再求和。其中計算答案時長度len要用總長度,每一段只擷取前d項,d為到lca的深度差。

然後就是如何維護和擷取149和123了,記正常的sum為111,那麼我們就可以通過前一項來推導

維護:

sum111[p]

=sum111[now]

+x;sum123[p]

=sum123[now]

+sum111[p]

;sum149[p]

=sum149[now]

+sum123[now]*2

+sum111[p]

;

擷取:

sum123[u]

-sum123[p]

-sum111[p]

*d;sum149[u]

-(sum149[p]

+sum123[p]*2

*d+sum111[p]

*d*d)

;

#pragma gcc optimize("ofast")

#include

typedef

long

long ll;

typedef

unsigned

long

long ull;

using

namespace std;

const

int n=

3e5+5;

const

int m=(1

<<16)

+5;const

int mod=

19260817

;//const ll inf=0x3f3f3f3f3f3f3f3f;

const

int inf=

0x3f3f3f3f

;const

double eps=

1e-5

;const

double pi=

acos(-

1);//const int tmp=31;

typedef pair<

int,__int128>pii;

const

int maxh=40;

vectorg[n]

;__int128 sum111[n]

,sum123[n]

,sum149[n]

;int anc[n][40

],dep[n]

;void

dfs(

int now,

int fa)

}for

(auto it:g[now])}

void

swim

(int

&x,int h)

}int

lca(

int x,

int y)

return-1

;}__int128 res[n]

;int tot;

int f[n]

,uu[n]

,vv[n]

;int

getf

(int x)

void

print

(__int128 x)

intmain()

while

(m--))

; g[v]

.push_back()

; f[

getf

(u)]

=getf

(v);

}else

}dfs(1

,0);

for(

int i=

1;i<=tot;i++

)print

(res[i]);

cout<<

'\n';}

return0;

}

老少戀中的愉悅和不安

老少戀,姐弟戀在今天的社會大環境和自由戀愛的炒作下,很少有人再指手畫腳,就像很少人崇尚的自己的戀愛自己做主,自己的身體自己做主,外人說三道四更多的是吃不到葡萄說葡萄酸的心理,還有人拿什麼論理道德來說事最終也只是乙個笑資,當事人該怎麼做出選擇還是會樂意做出自己的抉擇,當然最終能夠體會和承受這份選擇的樂...

編寫令人愉悅的API介面 一

api介面是服務端與客戶端溝通的橋梁.較好的api設計能減少客戶端與服務端的聯調時間,更加關注於自己本身 的優化與業務層的邏輯.良好的api介面應該從這下面幾個方向進行優化 準確的api協議 準確的內容型別 統一的返回型別以及異常處理 良好的介面版本控制體系 api介面路徑盡量簡短統一 效能與安全 ...

設計的理性模型

理性模型,理想的設計過程模型,它具有以下部分 1.目標 2.必要條件 3.效用函式 4.約束條件,包括預算等 5.決策的設計樹 until enough or not allowed do another design to improve until design end while design...