線段樹 單調棧 UNR 1 爭奪聖杯

2021-07-15 06:19:44 字數 983 閱讀 4935

用單調棧求出left right

可以發現每個點的貢獻是關於left right的分段函式

然後就是分段函式累加求和

當時打的線段樹

看了題解漲姿勢了 可以差分 做到o(n)

#include#include#includeusing namespace std;

typedef pairabcd;

typedef long long ll;

inline char nc()

return *p1++;

}inline void read(int &x)

const int n=1000005;

const ll p=998244353;

ll a[n<<2],b[n<<2];

ll ia,ib; int ql,qr;

inline void modify(int rt,int l,int r)

int mid=(l+r)>>1;

if (ql<=mid)

modify(rt<<1,l,mid);

if (qr>mid)

modify(rt<<1|1,mid+1,r);

}int t; ll ret;

inline void query(int rt,int l,int r)

int n,a[n];

int stack[n],pnt;

int left[n],right[n];

ll ans;

int main()

a[n+1]=1<<30;

pnt=0; stack[++pnt]=n+1;

for (int i=n;i;i--)

for (int i=1;i<=n;i++)

for (int i=1;i<=n;i++)

printf("%lld\n",ans);

return 0;

}

uoj 213 UNR 1 爭奪聖杯 單調棧

給出乙個長度為n的序列a,對於乙個m,定義該序列的價值為a 1 到a m 的最大值 a 2 到a m 1 的最大值 a n m 1 到a n 的最大值。求當m取 1,n 時對應的價值。n 106n 10 6考慮每個元素對答案的貢獻。當取最大值時,我們把權值看做第一關鍵字,下標看做第二關鍵字,這樣每個...

UNR 1 奇怪的線段樹

一道好題,感覺解法非常自然。首先我們只需要考慮一次染色最下面被包含的那些區間,因為把無解判掉以後只要染了乙個節點,它的祖先也一定被染了。然後發現一次染色最下面的那些區間一定是一段連續的左兒子 一段連續的右兒子。證明的話可以看官方題解,感性理解的話不難,同時,任意一段連續的左兒子 右兒子也對應乙個區間...

單調棧 線段樹

sequence 時間限制 c c 3秒,其他語言6秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld your are given two sequences a1 na a1 n and b1 nb b1 n you need to answe...