bzoj2957 奧妙重重的線段樹

2022-05-20 03:01:39 字數 2553 閱讀 8429

線段樹的query和update竟然還可以結合起來用!

題意:小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建、建了又拆。他經常無聊地看著窗外發呆,數自己能夠看到多少棟房子。

為了簡化問題,我們考慮這些事件發生在乙個二維平面上。小a在平面上(0,0)點的位置,第i棟樓房可以用一條連線(i,0)和(i,hi)的線段表示,其中hi為第i棟樓房的高度。如果這棟樓房上任何乙個高度大於0的點與(0,0)的連線沒有與之前的線段相交,那麼這棟樓房就被認為是可見的。

施工隊的建造總共進行了m天。初始時,所有樓房都還沒有開始建造,它們的高度均為0。在第i天,建築隊將會將橫座標為xi的房屋的高度變為yi(高度可以比原來大---修建,也可以比原來小---拆除,甚至可以保持不變---建築隊這天什麼事也沒做)。請你幫小a數數每天在建築隊完工之後,他能看到多少棟樓房?

開始考慮離線操作,但是後來發現這是乙個三維問題,尋找x1 < x2,y1 < y2,t1 < t2的最長序列,其中x的為位置,y為斜率,t為詢問的順序,但是因為不求他的對數,覺得不能用cdq分治來做,所以考慮線段樹。

當乙個點發生修改的時候,對左區間是沒有影響的,對右區間的影響是左區間的最大值一下的所有點都不計入sum。

考慮維護乙個sum和max即可。

說不定我以後可以想到cdq分治的解法。嘿嘿嘿。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

inline

int read()

#define for(i, x, y) for(int i=x;i<=y;i++)

#define _for(i, x, y) for(int i=x;i>=y;i--)

#define mem(f, x) memset(f,x,sizeof(f))

#define sca(x) scanf("%d", &x)

#define sca2(x,y) scanf("%d%d",&x,&y)

#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define scl(x) scanf("%lld",&x);

#define pri(x) printf("%d\n", x)

#define prl(x) printf("%lld\n",x);

#define clr(u) for(int i=0;i<=n;i++)u[i].clear();

#define ll long long

#define ull unsigned long long

#define mp make_pair

#define pii pair#define pil pair#define pll pair#define pb push_back

#define fi first

#define se second typedef vector

vi;const

double eps = 1e-9

;const

int maxn = 1e5 + 10

;const

int inf = 0x3f3f3f3f

;const

int mod = 1e9 + 7

; int

n,m,k;

struct

treetree[maxn

<< 2

];void build(int t,int l,int

r)

int m = (l + r) >> 1

; build(t

<< 1

,l,m);

build(t

<< 1 | 1,m + 1

,r);

}int query(int t,double

mx)void pushup(int

t)void update(int t,int x,double

k)

int mid = (tree[t].l + tree[t].r ) >> 1

;

if(x <= mid) update(t << 1

,x,k);

else update(t << 1 | 1

,x,k);

pushup(t);

}int

main()

#ifdef vscode

system(

"pause");

#endif

return0;

}

bzoj2957 線段樹應用

線段樹維護區間上公升子序序列長度,其中在up的時候是通過遞迴在深度log的時間內合併的。也就是說線段樹可能可以幹更多的事。include include include include includeusing namespace std const int n 100005 struct aa a...

bzoj2957 線段樹 樓房重建

description 小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建 建了又拆。他經常無聊地看著窗外發呆,數自己能夠看到多少棟房子。為了簡化問題,我們考慮這些事件發生在乙個二維平面上。小a在平面上 0,0 點的位置,第i棟樓房可以用一條連線 i,0 和 i,h...

樓房重建 (BZOJ 2957)

樓房重建 bzoj 2957 小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建 建了又拆。他經常無聊地看著窗外發呆,數自己能夠看到多少棟房子。為了簡化問題,我們考慮這些事件發生在乙個二維平面上。小a在平面上 0,0 點的位置,第i棟樓房可以用一條連線 i,0 和 ...