NOIP2016提高A組模擬9 15 Map

2021-07-22 20:16:05 字數 1734 閱讀 3710

所有詢問的和

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分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...