這題與之前那道區間最值的題非常類似,依舊是二分區間,然後統計跨過中間點的區間貢獻。
我們要選出小於等於和小於的,這樣就可以算出相等的區間長了。
複雜度o(nlogn)
by:大奕哥
1 #include2using
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 ...