有n個人排成一列。給出m次操作,每次操作讓區間l~r的人互相認識。求每次操作後新增了多少對認識的人。
n,m<=300000
很顯然,每個人認識的人都是乙個區間內的。為了避免算重複,我們可以只計算他左邊和他認識的人。設left[i]表示left[i]~i-1都和i認識,那麼答案就為∑n
i=1i
−lef
t[i]
。然後每次詢問相當於把left[l]~left[r]min上乙個l。
可以用線段樹維護這個過程。
怎麼區間取min?
我們發現left具有不減性,所以我們只需要找出第乙個大於l的地方,然後區間賦值就可以了。
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define n 300005
#define ll long long
using namespace std;
struct notet[n*5];
int n,m,x,y,lazy[n*5];
ll sum,ans;
void back(int v,int
x,int
y,int z)
void down(int v,int l,int r)
}void change(int v,int l,int r,int
x,int
y,int z)
intm=(l+r)/2;down(v,l,r);
if (y
<=m) change(v*2,l,m,x,y,z);
else
if (x>m) change(v*2+1,m+1,r,x,y,z);
else change(v*2,l,m,x,m,z),change(v*2+1,m+1,r,m+1,y,z);
t[v].mx=max(t[v*2].mx,t[v*2+1].mx);
t[v].sum=t[v*2].sum+t[v*2+1].sum;
}int find(int v,int l,int r,int
x) int main()
ans=(ll)n*(n+1)/2-t[1].sum;
printf("%lld\n",ans-sum);
}}
NOIP2015模擬11 2晚 Lala買麵包
給出n個數,求這n個數中有多少個數可以寫成x p x 2,p 2 的形式。n 10 6 每個數 10 14 很容易想到列舉指數。乙個明顯的性質,指數只可能是質數,且最大為50.那麼我們可以直接求出1 50之間的質數,然後列舉判斷。可以用c 黑科技pow作弊。注意精度。我恨實數運算!include i...
NOIP2015模擬11 5 旅行
經過觀察,可以發現題目有乙個比較不錯的性質 1 一條合法的路徑必須由兩條路徑組成,一條是奇數,另一條是偶數。所以我們可以先把每乙個點到達根節點的路徑求出來,深度為奇數的點放進乙個a aa陣列裡,偶數的放進b bb陣列裡,再給他們分別進行排序。然後進行兩兩結合,先把a陣列裡的所有數跟b1b b1 結合...
NOIP2015模擬11 3 裝飾大樓
給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...