轉化題意,就是根據題目所給的式子定義顏色,求同色三角形的個數。
有乙個經典結論:完全圖同色三角形個數=總三角形個數-異色角個數/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 滿足條件,那麼這...