日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

problem

luogu-P8251

solution

按照題意模擬單調棧。

求出對于 iii 而言,當時單調棧的棧頂元素記為 pip_ipi?。

如果到 iii 時,棧頂已經為 pip_ipi? 了,意味著這中間的所有元素要么是被 iii 彈出,要么就是被 iii 前面的某些元素彈出,這些元素又被 iii 彈出。

總而言之,會發現當詢問的 pi<lp_i<lpi?<liii 所代表的二元組就是成功的。

于是我們只需要求 [l,r][l,r][l,r] 內有多少個 i∈[l,r]s.t.pi<li\in[l,r]\ s.t.\ p_i<li[l,r]?s.t.?pi?<l。

寫個主席樹,或者差分一下轉化成樹狀數組二維數點都行。

code

#include <bits/stdc++.h> using namespace std; #define maxn 500005 struct node { int x, p, k, id; }q[maxn << 1]; int n, Q; int a[maxn], b[maxn], p[maxn], t[maxn], ans[maxn]; stack < int > s;void read( int &x ) {x = 0; char s = getchar();while( s < '0' or s > '9' ) s = getchar();while( '0' <= s and s <= '9' ) {x = ( x << 1 ) + ( x << 3 ) + ( s ^ 48 );s = getchar();} }void print( int x ) {if( x > 9 ) print( x / 10 );putchar( x % 10 + '0' ); }namespace BIT {void add( int x ) { x ++; for(;x <= n;x += x & -x) t[x] ++; }int ask( int x ) { x ++; int cnt = 0; for(x;x;x -= x & -x) cnt += t[x]; return cnt; } }int main() {read( n ), read( Q );for( int i = 1;i <= n;i ++ ) read( a[i] );for( int i = 1;i <= n;i ++ ) read( b[i] );for( int i = 1;i <= n;i ++ ) {while( ! s.empty() and (a[s.top()] == a[i] or b[i] >= b[s.top()]) ) s.pop();if( ! s.empty() ) p[i] = s.top();s.push( i );}for( int i = 1, l, r;i <= Q;i ++ ) {read( l ), read( r );q[i] = (node){ l - 1, l - 1, -1, i };q[i + Q] = (node){ r, l - 1, 1, i };}sort( q + 1, q + (Q << 1 | 1), [](node a, node b){ return a.x < b.x; } );int j = 1; while( ! q[j].x ) j ++;for( int i = 1;i <= n;i ++ ) {BIT :: add( p[i] );for( ;q[j].x == i and j <= (Q << 1);j ++ ) ans[q[j].id] += q[j].k * BIT :: ask( q[j].p );}for( int i = 1;i <= Q;i ++ ) print( ans[i] ), putchar( '\n' );return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。