所有詢問的和
4 4 2
1 2
2 3
3 2
3 4
1 2
1 414
樣例解釋:
upd:保證原圖連通。
「不相交路徑」的定義為不存在相同的邊。可以存在相同的點。重邊視為不同的邊。
對於樣例:
原圖有2個安全點對為(2,3),(3,2)
詢問1答案為4,新增的安全點對為(1,2),(1,3),(2,1)(3,1)
詢問2答案為10,新增的安全點對為(1,2),(1,3),(1,4),(2,1)(2,4),(3,1),(3,4),(4,1),(4,2),(4,3)
因此輸出14n,
q<=2∗
105 m
<=4∗
10530%圖為一棵樹
新增的安全點對肯定在乙個環上
先考慮圖為一棵樹的情況
每次新增一條邊,就會多乙個環,環的大小可以通過lca求出
答案增加相應數量就行了
那麼對於一張圖怎麼辦?tarjan縮環,而縮環後的點的點權就是原來環的點的數量
設環上有k個點,每個點的點權為c[i]
那最後增加的答案就是 (∑
ki=1
c[i]
)2−∑
ki=1
c[i]
2
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define n 200100
#define ll long long
using namespace std;
int n,m,tot=1,last[n*10],next[n*10],to[n*10],b[n*10][2],p[n],dfn[n],low[n],sy[n],f[n][18],deep[n],bz[n],bz2[n],totot=0;
ll g[n][18],sn[n],g1[n][18];
void putin(int x,int y)
void tarjan(int x,int fa)
if(low[x]==dfn[x])}}
ll sqr(ll x)
void dfs(int x)
}ll lca(int x,int y)
int main()
tot=0;tarjan(1,-1);
memset(last,0,sizeof(last));tot=1;memset(bz,0,sizeof(bz));
fo(i,1,m) putin(sy[b[i][0]],sy[b[i][1]]);
deep[1]=1;g1[1][0]=sn[1];g[1][0]=sqr(sn[1]);dfs(1);
ll ans=0;
fo(j,1,17)
fo(i,1,n)
for(;ac;ac--)
printf("%lld",ans);
}
NOIP2016提高組模擬 積木
比賽的時候用了個神奇的小暴力,本來打算拿40分,沒想到暴力出奇蹟,隨機資料下表現優良,居然碾過去了。暴力方法不講,只貼 僅供對拍。正解顯然要用狀態壓縮 看資料範圍 設fs i,0 1 2 s表示當前已選擇的積木集合,i表示在最上方的積木編號,0 1 2表示最上方的積木哪面朝上。轉移方程容易推導。暴力...
計數 NOIP2016提高A組模擬7 15
樣例輸入 2 10 樣例輸出 90資料範圍 剖解題目 題目說的很明了了。思路 求方案數,一般會設計道dp,規律之類的。解法 數字dp,設f i j 表示當前到了第i位,這一位的數字是j的方案數。自然有 f i j f i 1 l f i j 0 l k 且 l 0 and j 0 看到這位數,很明顯...
NOIP2016提高A組模擬9 2 單峰
問1 n,n個數的全排列中有多少個滿足單峰序列的性質,並把答案mod 1e9 7 這題還是很簡單的,一開始打了乙個50分的做法,然後發現答案就是2n 1,然後沒有發現輸入也會爆,於是就得了50分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...