BZOJ1099 : [POI2007]树Drz

时间:2022-06-22 04:12:36

首先1与i交换,n与i交换,i与i+1交换的可以$O(n)$算出。

然后只需要考虑i与x交换(1<i,x<n且|i-x|>1)。

a[i]=h[i-1]

b[i]=h[i+1]

f[i]=|h[i-1]-h[i]|+|h[i+1]-h[i]|

c[i]=min(a[i],b[i])

d[i]=max(a[i],b[i])

则交换i与x对答案的贡献为

-f[i]-f[x]

+|a[i]-h[x]|+|b[i]-h[x]|

+|h[i]-a[x]|+|h[i]-b[x]|

对第二行进行分类讨论:

1.h[x]<=min(a[i],b[i])

a[i]+b[i]-h[x]*2

2.min(a[i],b[i])<=h[x]<=max(a[i],b[i])

|a[i]-b[i]|

3.h[x]>=max(a[i],b[i])

h[x]*2-a[i]-b[i]

对第三行进行分类讨论:

1.h[i]<=min(a[x],b[x])

a[x]+b[x]-h[i]*2

2.min(a[x],b[x])<=h[i]<=max(a[x],b[x])

|a[x]-b[x]|

3.h[i]>=max(a[x],b[x])

h[i]*2-a[x]-b[x]

所以分9种情况进行讨论,用扫描线+线段树即可完成询问。时间复杂度$O(n\log n)$。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=50010,inf=~0U>>1;
int n,m,i,now,h[N],a[N],b[N],c[N],d[N],f[N],loc[N],v[131073],ans[N];ll H[N],B[N],sum;
struct Q{int x,l,r,z,t;Q(){}Q(int _x,int _l,int _r,int _z,int _t){x=_x,l=_l,r=_r,z=_z,t=_t;}}q[N*3];
inline bool cmp1(Q a,Q b){return a.x==b.x?a.t<b.t:a.x<b.x;}
inline bool cmp2(Q a,Q b){return a.x==b.x?a.t<b.t:a.x>b.x;}
inline int getl(ll x){
x=x*n;
int l=1,r=n,mid,t;
while(l<=r)if(B[mid=(l+r)>>1]>=x)r=(t=mid)-1;else l=mid+1;
return t;
}
inline int getr(ll x){
x=x*n+n-1;
int l=1,r=n,mid,t;
while(l<=r)if(B[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline int getx(ll x){
int l=1,r=n,mid,t;
while(l<=r)if(B[mid=(l+r)>>1]>=x)r=(t=mid)-1;else l=mid+1;
return t;
}
inline int abs(int x){return x>0?x:-x;}
inline void up(int&a,int b){if(a>b)a=b;}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
void build(int x,int a,int b){
v[x]=inf;
if(a==b)return;
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
void change(int x,int a,int b,int c,int p){
if(a==b){v[x]=p;return;}
int mid=(a+b)>>1;
c<=mid?change(x<<1,a,mid,c,p):change(x<<1|1,mid+1,b,c,p);
v[x]=min(v[x<<1],v[x<<1|1]);
}
void ask(int x,int a,int b,int c,int d){
if(c>d||v[x]>=now)return;
if(c<=a&&b<=d){up(now,v[x]);return;}
int mid=(a+b)>>1;
if(c<=mid)ask(x<<1,a,mid,c,d);
if(d>mid)ask(x<<1|1,mid+1,b,c,d);
}
inline void query(int l,int r,int p){
int x=loc[p-1],y=loc[p+1];
if(x>y)swap(x,y);
if(y<l||x>r){
ask(1,1,n,l,r);
return;
}
if(l<=x&&y<=r){
ask(1,1,n,l,x-1);
ask(1,1,n,x+1,y-1);
ask(1,1,n,y+1,r);
return;
}
if(l<=x){
ask(1,1,n,l,x-1);
ask(1,1,n,x+1,r);
return;
}
ask(1,1,n,l,y-1);
ask(1,1,n,y+1,r);
}
void S11(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(c[i],loc[i],0,a[i]+b[i]-h[i]*2-f[i],0);
q[++m]=Q(h[i],getr(c[i]),0,a[i]+b[i]-h[i]*2-f[i],i);
}
for(sort(q+1,q+m+1,cmp2),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else{
now=inf,query(1,q[i].l,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
void S12(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(c[i],loc[i],0,abs(a[i]-b[i])-h[i]*2-f[i],0);
q[++m]=Q(d[i],loc[i],0,0,n);
q[++m]=Q(h[i],getr(c[i]),0,a[i]+b[i]-f[i],i);
}
for(sort(q+1,q+m+1,cmp1),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else if(q[i].t==n)change(1,1,n,q[i].l,inf);
else{
now=inf,query(1,q[i].l,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
void S13(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(d[i],loc[i],0,-h[i]*2-a[i]-b[i]-f[i],0);
q[++m]=Q(h[i],getr(c[i]),0,a[i]+b[i]+h[i]*2-f[i],i);
}
for(sort(q+1,q+m+1,cmp1),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else{
now=inf,query(1,q[i].l,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
void S21(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(c[i],loc[i],0,a[i]+b[i]-f[i],0);
q[++m]=Q(h[i],getl(c[i]),getr(d[i]),abs(a[i]-b[i])-h[i]*2-f[i],i);
}
for(sort(q+1,q+m+1,cmp2),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else{
now=inf,query(q[i].l,q[i].r,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
void S22(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(c[i],loc[i],0,abs(a[i]-b[i])-f[i],0);
q[++m]=Q(d[i],loc[i],0,0,n);
q[++m]=Q(h[i],getl(c[i]),getr(d[i]),abs(a[i]-b[i])-f[i],i);
}
for(sort(q+1,q+m+1,cmp1),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else if(q[i].t==n)change(1,1,n,q[i].l,inf);
else{
now=inf,query(q[i].l,q[i].r,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
void S23(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(d[i],loc[i],0,-a[i]-b[i]-f[i],0);
q[++m]=Q(h[i],getl(c[i]),getr(d[i]),abs(a[i]-b[i])+h[i]*2-f[i],i);
}
for(sort(q+1,q+m+1,cmp1),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else{
now=inf,query(q[i].l,q[i].r,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
void S31(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(c[i],loc[i],0,a[i]+b[i]+h[i]*2-f[i],0);
q[++m]=Q(h[i],getl(d[i]),0,-a[i]-b[i]-h[i]*2-f[i],i);
}
for(sort(q+1,q+m+1,cmp2),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else{
now=inf,query(q[i].l,n,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
void S32(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(c[i],loc[i],0,abs(a[i]-b[i])+h[i]*2-f[i],0);
q[++m]=Q(d[i],loc[i],0,0,n);
q[++m]=Q(h[i],getl(d[i]),0,-a[i]-b[i]-f[i],i);
}
for(sort(q+1,q+m+1,cmp1),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else if(q[i].t==n)change(1,1,n,q[i].l,inf);
else{
now=inf,query(q[i].l,n,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
void S33(){
for(m=0,i=2;i<n;i++){
q[++m]=Q(d[i],loc[i],0,h[i]*2-a[i]-b[i]-f[i],0);
q[++m]=Q(h[i],getl(d[i]),0,h[i]*2-a[i]-b[i]-f[i],i);
}
for(sort(q+1,q+m+1,cmp1),build(1,1,n),i=1;i<=m;i++){
if(!q[i].t)change(1,1,n,q[i].l,q[i].z);
else{
now=inf,query(q[i].l,n,q[i].t);
if(now<inf)up(ans[q[i].t],q[i].z+now);
}
}
}
int main(){
for(read(n),i=1;i<=n;i++)read(h[i]);
for(i=1;i<n;i++)sum+=abs(h[i]-h[i+1]);
if(n>2){
f[1]=abs(h[1]-h[2]),f[n]=abs(h[n]-h[n-1]);
for(i=2;i<n;i++){
a[i]=h[i-1],b[i]=h[i+1];
c[i]=min(a[i],b[i]),d[i]=max(a[i],b[i]);
f[i]=abs(h[i]-h[i-1])+abs(h[i]-h[i+1]);
}
for(i=3;i<n;i++){
up(ans[1],abs(h[i]-h[2])+abs(h[1]-h[i-1])+abs(h[1]-h[i+1])-f[1]-f[i]);
up(ans[i],abs(h[i]-h[2])+abs(h[1]-h[i-1])+abs(h[1]-h[i+1])-f[1]-f[i]);
}
for(i=2;i<n-1;i++){
up(ans[n],abs(h[i]-h[n-1])+abs(h[n]-h[i-1])+abs(h[n]-h[i+1])-f[n]-f[i]);
up(ans[i],abs(h[i]-h[n-1])+abs(h[n]-h[i-1])+abs(h[n]-h[i+1])-f[n]-f[i]);
}
up(ans[1],abs(h[1]-h[n-1])+abs(h[n]-h[2])-f[1]-f[n]);
up(ans[n],abs(h[1]-h[n-1])+abs(h[n]-h[2])-f[1]-f[n]);
if(n>2){
for(i=2;i<n-1;i++){
up(ans[i],abs(h[i-1]-h[i+1])+abs(h[i]-h[i+1])+abs(h[i+2]-h[i])-f[i]-f[i+1]+abs(h[i]-h[i+1]));
up(ans[i+1],abs(h[i-1]-h[i+1])+abs(h[i]-h[i+1])+abs(h[i+2]-h[i])-f[i]-f[i+1]+abs(h[i]-h[i+1]));
}
up(ans[1],abs(h[1]-h[3])-abs(h[2]-h[3]));
up(ans[2],abs(h[1]-h[3])-abs(h[2]-h[3]));
up(ans[n],abs(h[n]-h[n-2])-abs(h[n-1]-h[n-2]));
up(ans[n-1],abs(h[n]-h[n-2])-abs(h[n-1]-h[n-2]));
}
if(n>4){
for(i=1;i<=n;i++)B[i]=H[i]=(ll)h[i]*n+i-1;
sort(B+1,B+n+1);
for(i=1;i<=n;i++)loc[i]=getx(H[i]);
S11(),S12(),S13(),S21(),S22(),S23(),S31(),S32(),S33();
}
}
for(i=1;i<=n;i++)printf("%lld\n",sum+ans[i]);
return 0;
}

  

BZOJ1099 : [POI2007]树Drz的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. BZOJ 1103&colon; &lbrack;POI2007&rsqb;大都市meg &lbrack;DFS序 树状数组&rsqb;

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  3. BZOJ 1103&colon; &lbrack;POI2007&rsqb;大都市meg&lpar; 树链剖分 &rpar;

    早上数学考挂了...欲哭无泪啊下午去写半个小时政治然后就又可以来刷题了.. 树链剖分 , 为什么跑得这么慢... ------------------------------------------- ...

  4. bzoj 1106 &lbrack;POI2007&rsqb;立方体大作战tet 树状数组优化

    [POI2007]立方体大作战tet Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 821  Solved: 601[Submit][Status][ ...

  5. BZOJ1103 &lbrack;POI2007&rsqb;大都市meg 【树剖】

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3038  Solved: 1593 [Submit][S ...

  6. 树状数组【bzoj1103】&colon; &lbrack;POI2007&rsqb;大都市meg

    1103: [POI2007]大都市meg 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡 ...

  7. 树状数组 - BZOJ 1103 &lbrack;POI2007&rsqb;大都市

    bzoj 1103 [POI2007]大都市 描述 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员 Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景. ...

  8. &lbrack;bzoj1103&rsqb;&lbrack;POI2007&rsqb;大都市meg&lowbar;dfs序&lowbar;树状数组

    大都市meg bzoj-1103 POI-2007 题目大意:给定一颗n个点的树,m次操作.将一条路的边权更改成0:查询一个点到根节点的点权和.开始的时候所有边的边权都是1. 注释:$1\le n,m ...

  9. bzoj1103&colon; &lbrack;POI2007&rsqb;大都市meg&lpar;树链剖分&rpar;

    1103: [POI2007]大都市meg 题目:传送门 简要题意: 给你一棵树,给出每条边的权值,两个操作:1.询问根到编号x的最短路径的权值和  2.修改一条边的边权 题解: 很明显啊,看懂了题基 ...

随机推荐

  1. java你可能不知道的事&lpar;2&rpar;--堆和栈

    在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...

  2. github 仓库管理

    一.远程仓库有master和dev分支1. 克隆代码 git clone https://github.com/master-dev.git # 这个git路径是无效的,示例而已 2. 查看所有分支 ...

  3. vsm 的理解

    vsm相对于最原始的sm多了这样一个部分 if(depthcampare <=zInSM) fPercentLit  = 1;//noshadow; else { variance = zzIn ...

  4. Android CoordinatorLayout &plus; AppBarLayout&lpar;向上滚动隐藏指定的View&rpar;

    在新的Android Support Library里面,新增了CoordinatorLayout, AppBarLayout等. 实现的效果: 向下滚动RecylerView,Tab会被隐藏,向上滚 ...

  5. jsoup 解析html 页面数据

    我html 页面元素: /html/body/table[2]/tbody/tr[1]/td/table/tbody/tr[1]/td[2]/font/html/body/table[2]/tbody ...

  6. BaiduMap&lowbar;SDK&lowbar;DEMO&lowbar;3&period;0&period;0&lowbar;for&lowbar;Xamarin&period;Android&lowbar;by&lowbar;imknown

    2.4.2 已稳定, 同一时候已经放置到分支/Release 2.4.2了. 3.0.0 已开发完毕, 可是不推荐大家用于项目中, 请观望或者自己进一步调试. 个人感觉尽管3.0.0简化了开发, 可是 ...

  7. Starting httpd&colon; &lpar;98&rpar;Address already in use&colon; make&lowbar;sock&colon; could not bind to address &lbrack;&colon;&colon;&rsqb;&colon;80

    netstat -tulpn| grep :80 killall -9 httpd /etc/init.d/httpd start  or service httpd start

  8. TensorFlow 辨异 —— tf&period;placeholder 与 tf&period;Variable

    https://blog.csdn.net/lanchunhui/article/details/61712830 https://www.cnblogs.com/silence-tommy/p/70 ...

  9. Flask开发微电影网站&lpar;九&rpar;

    1.后台管理之电影管理 1.1 电影管理之所有电影收藏列表 1.1.1 电影管理之电影收藏列表视图函数 在admin目录下的views.py文件中定义电影收藏列表视图函数 电影收藏列表视图函数需要被登 ...

  10. &lbrack;转&rsqb; - Weiflow——微博机器学习框架

    Weiflow--微博机器学习框架 本文从开发效率(易用性).可扩展性.执行效率三个方面,介绍了微博机器学习框架Weiflow在微博的应用和最佳实践. 在上期<基于Spark的大规模机器学习在微 ...