jzo5919 逛公園 點雙連通分量

2021-08-29 16:25:58 字數 2643 閱讀 3209

琥珀色黃昏像糖在很美的遠方,思念跟影子在傍晚一起被拉長……

小 b 帶著 gf 去逛公園,公園一共有 n 個景點,標號為 1 . . . n。景點之間有 m 條路徑相連。

小 b 想選擇編號在一段區間 [l, r] 內的景點來遊玩,但是如果這些景點的誘導子圖形成了環,那麼 gf 將會不高興。

小 b 給出很多個詢問 [x, y],想讓你求有多少個區間 [l, r] 滿足 x ≤ l, r ≤ y 且不會使 gf不高興。

對於 30% 的資料,n, m ≤ 100。

對於另外 10% 的資料,n = m + 1。

對於另外 10% 的資料,n = m

對於 100% 的資料,n, m ≤ 3 × 10^5, xi ≤ yi,不存在重邊、自環,不存在一條邊同時存在於兩個不同的簡單環。

誘導子圖:子圖 g′ = (v′, e′),原圖 g = (v, e)。v′ 是 v 的子集,e′ =

先跑個tarjan搞出所有size>1的環,顯然我們的l和r不能包含這些環裡的最大值和最小值

考慮把每個i作為左端點時最右邊能到達的位置記為r[i],顯然這個r是單調的

可以發現我們實際上要對一整段的max(r[i],r)-i+1求和,於是可以二分出第乙個<=r的位置,前半部分字首和,後半部分等差數列求和即可

對於tarjan的各種寫法我到現在都還很懵。比如這一題我的tarjan寫法和別人不一樣就wa了。。。

#include

#include

#include

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define drp(i,st,ed) for (int i=st;i>=ed;--i)

typedef

long

long ll;

const

int inf=

0x3f3f3f3f

;const

int n=

600005

;struct edge e[n*2]

;struct line d[n]

;std:: stack <

int> stack;

int dfn[n]

,low[n]

,r[n]

;int ls[n]

,edcnt=

1,cnt;

ll sum[n]

;bool vis[n]

;int

read()

void

add_edge

(int x,

int y)

; ls[x]

=edcnt;

e[++edcnt]

=(edge)

; ls[y]

=edcnt;

}void

tarjan

(int x,

int fa)

else low[x]

=std::

min(low[x]

,dfn[y]);

if(low[x]

==dfn[x])if

(sum>

1) d[

++cnt]

=(line);}

stack.

push

(x);

} stack.

pop();

}void

dfs(

int now,

int from)

else

if(vis[e[i]

.y]) low[now]

=std::

min(low[now]

,dfn[e[i]

.y]);}

if(low[now]

==dfn[now])if

(size!=

1) d[

++cnt]

=(line);}

}bool

cmp(line a,line b)

intmain

(void

)rep

(i,1

,n)if

(!dfn[i]

)tarjan

(i,0);

// rep(i,1,n) if (!dfn[i]) dfs(i,0);

// printf("%d\n", cnt);

std::

sort

(d+1

,d+cnt+

1,cmp)

;int j=cnt,k=n+1;

drp(i,n,1)

r[i]

=k-1;}

rep(i,

1,n)

for(

int t=

read()

;t--;)

ans=sum[r]

-sum[x-1]

; ans=ans+

1ll*

(1ll

*y-r)*(

1ll*y-r+

1ll)

/2ll

;printf

("%lld\n"

, ans);}

return0;

}

主席樹 HDU5919 CCPC2016長春

題目大意 給乙個長度為n的序列.給q次詢問,每次詢問 l,r l,r l,r 假設裡面有k kk個不同的數.求從左到右第 k2 lceil frac rceil 2k 個不同的數出現的位置.n,q 2e5 n,q leq 2e5 n,q 2e 5題目思路 前置知識點 主席樹求區間不同的數的個數 個人...

hdu5919 主席樹求區間不同數

題目大意 有長度為 n l r 這段區間中所有不同數出現的第乙個位置,按照位置從小到大排完序以後的中間 向上取整 的那個位置是多少?解題思路 把n個元素倒著插進主席樹中,把上次出現的同乙個值的元素的貢獻值 1,新的這個值的貢獻值 1,這樣就可以把這個元素最左側的位置的貢獻保留。查詢區間 l,r 時只...

2019中山紀念中學夏令營 Day1 JZOJ

t1 題目描述 時間限制 1000 ms 空間限制 128000 kb 具體限制 goto problemset 題目描述 wexley最近發現了乙個古老的螢幕遊戲。遊戲的螢幕被劃分成n列。在螢幕的底端,有乙個寬為m列的籃子 m 輸入第一行,兩個整數n m,如題所述 第二行,乙個整數k,表示掉落的蘋...