今有\(n\)人,互不認識,排成一列.現有\(m\)輪操作,每輪操作給出區間\([l,r]\),使區間內互不認識的人相認識.試問每輪操作可以新產生多少對相互認識的人?
考場上只想出了\(10\)pts的暴力分,一一枚舉,複雜度\(\omicron(m\cdot n^)\).現給出\(50\)pts解法:
我們可以開乙個陣列\(f\),\(f[i]\)表示第\(i\)個人向右所能認識的最遠的人,故每次計算改為計算貢獻,然後更新\(f[i]\).又由於\(f[i]\)顯然具有單調性,於是我們可以開線段樹維護,複雜度\(\omicron(m\log n)\)
#include#include#include#include#include#include#include#include#include#define r register
#define next kdjadskfj
#define debug puts("mlg")
#define mod 1000000000
#define mod(x) ((x%mod+mod)%mod)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
inline ll read();
inline void write(ll x);
inline void writeln(ll x);
inline void writesp(ll x);
const ll maxn=600000;
ll n,m;
ll dat1[maxn<<2],dat2[maxn<<2],sum[maxn<<2];
ll lazy[maxn<<2];
inline void build(ll p,ll l,ll r)
ll mid=l+r>>1;
build(p<<1,l,mid);build(p<<1|1,mid+1,r);
dat1[p]=min(dat1[p<<1],dat1[p<<1|1]);
dat2[p]=max(dat2[p<<1],dat2[p<<1|1]);
sum[p]=sum[p<<1]+sum[p<<1|1];
}inline void pushdown(ll p,ll l,ll r)
}ll ansr;
inline ll query(ll p,ll l,ll r,ll u,ll v)
int main() }}
inline ll read()while(ch>='0'&&ch<='9')return x*t;}
inline void write(ll x)if(x<=9)write(x/10);putchar(x%10+'0');}
inline void writesp(ll x)
inline void writeln(ll x)
天神的密碼
2018年,icebound開啟了神殿。而在2019年,icebound正在試圖破解天神的密碼,以期獲得天神的力量。icebound發現,想要得到神的密碼,必須先要完成乙個祭祀儀式。在這個祭祀儀式上,我們首先會追隨神的指引,得到兩個正整數 n和 k。隨後,我們令 x n k,得到天神喜歡的數字x。利...
譯 js中的神奇的型別轉換
true false 1 12 6 2 number 15 3 number153 15 3 number 18number 1 null true foo bar foonan true true false false false false null false false true true...
hrbust oj 1937 神奇的進製轉換
神奇的進製轉換 description xuxu的資料結構要考試了,所以他在很努力的看書,有一天他看呀看呀看,突然看到乙個進製轉換的題目,說是要將乙個十進位制數轉換成二進位制數,他算呀算呀算,然後就把這個問題解決了。可是他很愛思考,他想怎麼樣能夠將這個十進位制數轉換成k進製的數呢?求幫助,help!...