這道題有這樣乙個解法:
首先把邊依次加到圖中,若當前這條邊與圖中的邊形成了環,那麼把這個環中最早加進來的邊彈出去
並將每條邊把哪條邊彈了出去記錄下來:ntr[i] = j,特別地,要是沒有彈出邊,ntr[i] = 0;
這個顯然是可以用lct來弄的對吧。
然後對於每個詢問,我們的答案就是對l~r中ntr小於l的邊求和,並用n減去這個值
正確性可以想一下:
如果一條邊的ntr >= l,那麼顯然他可以與從l ~ r中的邊形成環,那麼它對答案沒有貢獻
反之如果一條邊的ntr < l那麼它與從l ~ r中的邊是不能形成環的,那麼他對答案的貢獻為-1
#include#includeview code#include
#define lc ch[x][0]
#define rc ch[x][1]#include
using
namespace
std;
inline
intread()
const
int maxn=200010
;const
int maxnode=2000010
;const
int inf=1000000000
;int fa[maxn],pre[maxn],mn[maxn],val[maxn],flip[maxn],ch[maxn][2
];void maintain(int
x) void pushdown(int
x)void rotate(int x,int
d)void splay(int
x)
else
pushdown(x);
}void access(intx)}
void makeroot(int x)
void link(int x,int y)
void cut(int x,int
y)int find(int
x)int query(int x,int
y)int
u[maxn],v[maxn],f[maxn],root[maxn],tot;
intls[maxnode],rs[maxnode],s[maxnode];
void build(int& y,int x,int l,int r,int
pos)
int query(int y,int l,int r,int
pos)
intmain()
if(find(u[i])!=find(v[i])) link(u[i],i+n),link(i+n,v[i]);
else
}for(int i=1;i<=m;i++) build(root[i],root[i-1],0
,m,f[i]);
while(q--)
return0;
}
COJ0985 WZJ的資料結構(負十五)
coj0985 wzj的資料結構 負十五 試題描述 chx有乙個問題想問問大家。給你乙個長度為n的數列a,請你找到兩個位置l,r,使得a l a l 1 a r 中沒有重複的數,輸出r l 1的最大值。以上是附中聯賽加試的一道題。wzj覺得這道題太水了,改了改題目 wzj有乙個問題想問問大家。給你乙...
COJ0989 WZJ的資料結構(負十一)
coj0989 wzj的資料結構 負十一 試題描述 給出以下定義 1.若子串行 l,r 的極差 最大值 最小值 m,則子串行 l,r 為乙個均勻序列。2.均勻序列 l,r 的權值為sum l,r 即序列的元素和。現在給你乙個長度為n的整數序列a,請你求出權值前k大的均勻序列,輸出k行為它們的權值。輸...
COJ 1003 WZJ的資料結構(三)ST表
wzj的資料結構 三 難度級別 b 執行時間限制 3000ms 執行空間限制 51200kb 長度限制 2000000b 試題描述 請你設計乙個資料結構,完成以下功能 給定乙個大小為n的整數組a,m次詢問。每次詢問給你i,j兩個引數,求ai至aj中最大的數。輸入第一行為兩個正整數n,m。第二行為n個...