NOIP2015模擬11 2晚 我的天

2021-07-11 02:18:01 字數 1198 閱讀 6551

有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...