分塊,每一塊維護字首和,觀察發現,一次區間加操作對於
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為...