日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces 901C Bipartite Segments

發布時間:2024/10/12 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces 901C Bipartite Segments 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

給一個 \(n\) 個點 \(m\) 條邊的、不含偶環的無向圖,每次詢問 \([l,r]\) ,求 \([l,r]\) 中有多少 \([x,y]\) 使得編號在 \([x,y]\) 中的點組成的誘導子圖是一個二分圖。

\(n,m,q\le 3\times 10^5\)

Solution

顯然這個圖是一個奇環仙人掌。于是在這張圖中,是二分圖的充要條件是不含環。

于是預處理邊雙連通分量,記錄每個 \(ebc\) 的編號最小和最大點,記為 \(mn[i]\)\(mx[i]\)

那么就可以記錄一個數組 \(s[i]\) ,表示編號為 \(i\) 的點向右最遠可以可以擴展到 \(s[i]\) ,使得 \([i,s[i]]?\) 的點組成的誘導子圖是二分圖。

所以初始 \(s[mn[i]]=mx[i] - 1\) ,再用一個后綴最小值就可以得到 \(s\) 數組。顯然 \(s\) 單調不減。

考慮如何回答詢問。考慮一個中轉點 \(p\) ,滿足 \(\forall i \in [l,p-1],s[i]<r\) 以及 \(\forall i\in[p,r],s[i]>=r\) ,那么答案等于
\[ (\sum_{i=l}^{p-1}s[i]-i+1)+(\sum_{i=p}^rr-i+1) \]

#include<bits/stdc++.h> using namespace std;template <class T> void read(T &x) {x = 0; bool flag = 0; char ch = getchar(); for (; ch < '0' || ch > '9'; ch = getchar()) flag |= ch == '-';for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - 48; flag ? x = ~x + 1 : 0; }#define N 300010 #define rep(i, a, b) for (auto i = (a); i <= (b); i++) #define drp(i, a, b) for (auto i = (a); i >= (b); i--) #define ll long longstruct { int v, next; }e[N << 1]; int head[N]; bool isBridge[N << 1]; inline void add(int u, int v) {static int tot = 1; e[++tot].v = v, e[tot].next = head[u], head[u] = tot; }int dfn[N], low[N]; void tarjan(int u, int fa) {static int ind; dfn[u] = low[u] = ++ind;for (int i = head[u], v; i; i = e[i].next) {if (!dfn[v = e[i].v]) {tarjan(v, u), low[u] = min(low[u], low[v]);if (low[v] > dfn[u]) isBridge[i] = isBridge[i ^ 1] = 1;}else if (dfn[v] < dfn[u] && v ^ fa) low[u] = min(low[u], dfn[v]);} }int bl[N], siz[N]; void dfs(int u, int ebc) {siz[bl[u] = ebc]++; // printf("%d\n", u);for (int i = head[u]; i; i = e[i].next) if (!bl[e[i].v] && !isBridge[i]) dfs(e[i].v, ebc); }int mn[N], mx[N], s[N]; ll sum[N];int main() {int n, m; read(n), read(m);rep(i, 1, m) {int u, v; read(u), read(v);add(u, v), add(v, u);}rep(i, 1, n) if (!dfn[i]) tarjan(i, 0);int ebc = 0;rep(i, 1, n) if (!bl[i]) dfs(i, ++ebc);rep(i, 1, n) mx[bl[i]] = i;drp(i, n, 1) mn[bl[i]] = i;rep(i, 1, n) s[i] = n;rep(i, 1, ebc) if (siz[i] > 1) s[mn[i]] = mx[i] - 1;drp(i, n - 1, 1) s[i] = min(s[i], s[i + 1]);rep(i, 1, n) sum[i] = sum[i - 1] + s[i] - i + 1;int q; read(q);while (q--) {int l, r; read(l), read(r);int p = lower_bound(s + l, s + r + 1, r) - s;printf("%lld\n", 1ll * (r - p + 1) * (r - p + 2) / 2 + sum[p - 1] - sum[l - 1]);}return 0; }

轉載于:https://www.cnblogs.com/aziint/p/9643134.html

總結

以上是生活随笔為你收集整理的CodeForces 901C Bipartite Segments的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。