51Nod1962 區間計數

2022-03-27 08:53:33 字數 957 閱讀 7572

這題與之前那道區間最值的題非常類似,依舊是二分區間,然後統計跨過中間點的區間貢獻。

我們要選出小於等於和小於的,這樣就可以算出相等的區間長了。

複雜度o(nlogn)

by:大奕哥

1 #include2

using

namespace

std;

3 typedef long

long

ll;4 ll ans;intn;5

const

int n=350005;6

void add(ll x)

7int a[2][n],p[2][3],l[2][n],r[2

][n];

8void solve(int ll,int

rr)9

11int mid=ll+rr>>1

;12 solve(ll,mid);solve(mid+1

,rr);

13for(int k=0;k<=1;++k)

1418

for(int k=0;k<=1;++k)for(int i=0;i<=3;++i)p[k][i]=mid;

19for(int i=mid;i>=ll;--i)

2027

if(l[0][i]==l[1][i])add(max(0,min(p[0][0],p[1][0])-mid));

28else

if(l[0][i]>l[1][i])add(max(0,min(p[1][2],p[0][0])-p[1][1

]));

29else add(max(0,min(p[0][2],p[1][0])-p[0][1

]));30}

31int pos=mid+1;32

for(int i=mid+1;i<=rr;++i)

3337}38

intmain()

39

51Nod1962 區間計數

兩個數列 請求出ans,ans定義如下 ans ni 1 nj i max max 注 內表示式為真,則為1,否則為0.1 n 3.5 1051 ai,bi n 樣例解釋 7個區間分別為 1,4 1,5 2,4 2,5 3,3 3,5 4,5 input 第一行乙個整數n 第二行n個整數ai 第三行...

51nod1962區間計數

考慮每個值作為最大值的區間實際上可以用單調棧求出來,即找到左邊第乙個比它大的數l i 右邊第乙個比它大的r i 那就是左端點在 l i i 右端點在 i,r i 的區間是以第i個數作為最大值。用乙個掃瞄線去做,維護當前線上矩形交的長度now。具體是這樣的 開2n個線段樹,對於每一種最大值開線段樹,分...

51nod 1712 區間求和

解法 這個題首先考慮乙個簡單情況 對於區間 x,y 權值為多少。容易寫出公式 f x y s y s x 1 sum y sum x 1 x 1 sum x 1 y x 1 其中s x 表示 從第乙個元素到第x個元素的 所有有序二元組的和 題目中定義的 sum表示字首和 這裡要求的是所有a x a ...