聯合集訓6 9 El 點分治 雜湊表

2021-08-20 15:05:37 字數 2268 閱讀 9168

轉化題意,就是根據題目所給的式子定義顏色,求同色三角形的個數。

有乙個經典結論:完全圖同色三角形個數=總三角形個數-異色角個數/2。因為每個異色三角形都恰有兩個異色角。

在有向完全圖中結論依然成立,但這裡的異色角就要分別統計兩齣,一入一出,兩齣三種情況。我們只需要分別知道每個點進/出的紅/綠路徑數量即可。這個可以用點分治解決。

具體地,對於乙個分治中心ro

otr oo

t,我們求出它到該分治結構內部所有點的路徑權值(包含ro

otr oo

t),記為di

ssi dis

si

,和內部所有點到它的路徑權值(不包含ro

otr oo

t),記作di

sti dis

ti

。那麼一條路徑(u

,v),

lca(u,

v)=r

oot (u,

v)

,lca(u

,v)=

root

的權值為 di

stu+

diss

v⋅kd

epu dis

tu+d

issv

⋅kde

pu

那麼它模意義下等於x x

就是 x−d

issu

kdep

u=di

ssv' role="presentation">x−d

issu

kdep

u=di

ssvx

−dis

sukd

epu=

diss

v開兩個雜湊表存式子分別左右兩邊的東西,每處理一棵子樹先把其內部資訊在雜湊表中刪去,然後在相互查詢即可。

**:

include#include

#include

#include

#define n 100010

#define ll long long

using namespace std;

const int r=5000000;

int tote,n,mod,k,x,val[n],to[n<<1],nxt[n<<1],con[n],sz[n],dfn[n],ed[n],fd[n],tim,cnts[n],cntt[n],dep[n];

ll diss[n],dist[n],pk[n],ik[n];

bool vis[n];

intread()

void ins(int

x,int

y)ll ksm(ll a,ll b)

struct ha

void add(int

x,int d)

if(hd[id]==0) us[++top]=id;

s[++cnt]=d;f[cnt]=x;

nxt[cnt]=hd[id];

hd[id]=cnt;

}int qry(int

x)

void clr()

}hs,ht;

void getroot(int v,int fa,int size,int &root)

if((sz[v]<<1)0;

if(flag) root=v;

}void dfs(int v,int fa)

ll g(int v)

void solve(int v,int size)

hs.clr();ht.clr();

for(int p=con[root];p;p=nxt[p])

if(!vis[to[p]])

solve(to[p],sz[to[p]]>sz[root]?size-sz[root]:sz[to[p]]);

}int main()

pk[0]=1;

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

pk[i]=pk[i-1]*k

%mod;

ik[n]=ksm(pk[n],mod-2);

for(int i=n-1;i>=0;i--)

ik[i]=ik[i+1]*k

%mod;

solve(1,n);

ll ans=0;

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

ans>>=1;ans=(ll)n*n

*n-ans;

printf("%lld",ans);

return

0;}

聯合集訓6 9 Psy 組合數學 杜教篩

顯然,符合條件的數必須滿足任何長度的字尾字典序必須嚴格大於全串。假設乙個串 t t 可以由幾個相同的串 s role presentation style position relative s s拼接而成,我們稱 t t 為迴圈串。顯然所有迴圈串都是不滿足條件的。那麼對於非迴圈串,那麼其所有迴圈表...

牛客練習賽69E 子串 樹狀陣列

給出乙個n nn的排列,求有多少個區間 l,r l,r l,r 使得最大值是r rr,最小值是lll。首先對於乙個位置的值作為左端點和右端點都有一段合法區間 到左邊第乙個比他小的和右邊第乙個比他大的,當右端點時同理 可以用樹狀陣列預處理每個的合法區間 然後對於兩個點各作為左右端點需要滿足左端點在右端...

牛客練習賽69 E 字串 雜湊

給出乙個長度為n排列p 規定乙個區間 l,r l r 是 fair 的,當且僅當區間中最小值等於 l 並且最大值等於 r 求 fair 區間的個數 我不會正解 首先把每乙個i值對映成 base i 遍歷一邊全排列 然後每次加上base a i 減去base i 求貢獻,如果 l,r 滿足條件,那麼這...