BZOJ2388 旅行規劃

2021-07-24 02:30:29 字數 1735 閱讀 7372

分塊,每一塊維護字首和,觀察發現,一次區間加操作對於

l 前,

r後的區間裡相對的大小關係沒有影響,對於[l

,r] 裡,將每個位置放在平面內作為乙個點(i

,si)

,那麼相當於給區間裡加了乙個斜率。

每個塊維護乙個凸包(上凸下凸應該都可以,下文以上凸為例),如果這個塊被完整覆蓋,就打個斜率的標記,否則暴力重構凸包。

詢問時在區間裡二分,找到乙個最大的斜率(u

,v) 使得其加上區間的斜率標記

<

0 ,這時因為上凸,斜率遞減,而這之前的斜率加上標記全部

>

0 ,所以

u 優於其左側所有點,這條斜率開始之後的斜率加標記全部

<

0,所以v優於其右側所有點,u優於v,所以u是最大值

code:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

const

int maxn = 110000;

const

int maxnn = 400;

struct point

point(ll _x,ll _y)

};struct node

a[maxnn];

ll s[maxn],f[maxn];

int id[maxn],st[maxn],n;

int n,m;

ll multi(point a1,point a2,point x)

double get_k(point x,point y)

void up(ll &x,ll y)

void _build(int t)

a[t].len=len;

}int find_(int t)

return r+1;

}int main()

for(int i=1;i<=id[n];i++)st[i]=(i-1)*n+1;

st[id[n]+1]=n+1;

for(int i=1;i<=id[n];i++) _build(i);

scanf("%d",&m);

while(m--)

else

for(int i=st[t2];i1];i++)

s[i]=s[i]+a[t2].k*i+f[t2];

for(int i=st[t2];i<=r;i++) s[i]+=k*(i-l+1);

for(int i=r+1;i1];i++) s[i]+=k*(r-l+1);

_build(t2);

for(int i=t2+1;i<=id[n];i++)f[i]+=k*(r-l+1);}}

else

else

printf("%lld\n",ret);}}

}return

0;}

bzoj2388 旅行規劃

凸包好題 我一開始想的是線段樹或平衡樹維護最大字首和,但是區間修改很噁心,後來想分塊,發現貌似可以做,修改的話,中間的塊打標記,兩邊的暴力重構,查詢的話就是整塊二分斜率為零的地方,邊上的暴力查詢。o nsqrt n log n 1 include 2 include 3 include 4 incl...

BZOJ2388 旅行規劃

bzoj2388 旅行規劃 又是一道氪金題。bzoj 氪金無極限。附上大美洛谷的題面 洛谷p4192 旅行規劃 oivillage是乙個風景秀美的鄉村,為了更好的利用當地的旅遊資源,吸引遊客,推動經濟發展,xkszltl決定修建了一條鐵路將當地n個最著名的經典連線起來,讓遊客可以通過火車從鐵路起點 ...

BZOJ2388 旅行規劃

bzoj2388 旅行規劃 試題描述 oivillage是乙個風景秀美的鄉村,為了更好的利用當地的旅遊資源,吸引遊客,推動經濟發展,xkszltl決定修建了一條鐵路將當地n個最著名的經典連線起來,讓遊客可以通過火車從鐵路起點 1號景點 出發,依次遊覽每個景區。為了更好的評價這條鐵路,xkszltl為...