[xsy1144]選物品

來源:互聯網
上載者:User

標籤:print   線段樹   ret   type   題意   return   printf   modify   class   

題意:給定$a_{1\cdots n},b_{1\cdots n}$,詢問是給定$l,r$,找出$a‘,b‘$使得$\sum\limits_{i=l}^r\max(\left|a‘-a_i\right|,\left|b‘-b_i\right|)$最小

很妙的轉化...

$\max(\left|a_1-a_2\right|,\left|b_1-b_2\right|)=\max(a_1-a_2,a_2-a_1,b_1-b_2,b_2-b_1)$

令$x_1=\frac{a_1+b_1}2,y_1=\frac{a_1-b_1}2$,類似定義$x_2,y_2$,原式變為

$\begin{aligned}\max(x_1+y_1-x_2-y_2,x_2+y_2-x_1-y_1,x_1-y_1-x_2+y_2,x_2-y_2-x_1+y_1)&=\max(x_1-x_2,x_2-x_1)+\max(y_1-y_2,y_2-y_1)\\&=\left|x_1-x_2\right|+\left|y_1-y_2\right|\end{aligned}$

我們現在要找到$x‘,y‘$使得$\sum\limits_{i=l}^r\left|x‘-x_i\right|+\left|y‘-y_i\right|$最小,拆開之後就變成兩個區間中位元,此時可以用可持久化線段樹解決

#include<stdio.h>#include<algorithm>using namespace std;typedef long long ll;struct seg{int l,r,c;ll s;}t[4000010];int r1[100010],r2[100010],v[200010],M,N;void modify(int pr,int&nr,int p,int v,int l,int r){nr=++M;t[nr]=t[pr];t[nr].s+=v;t[nr].c++;if(l==r)return;int mid=(l+r)>>1;if(p<=mid)modify(t[pr].l,t[nr].l,p,v,l,mid);elsemodify(t[pr].r,t[nr].r,p,v,mid+1,r);}ll d,res;void query(int pr,int nr,int k,int l,int r){if(l==r){d=v[l];return;}int mid=(l+r)>>1,lc,rc;ll ls,rs;lc=t[t[nr].l].c-t[t[pr].l].c;rc=t[t[nr].r].c-t[t[pr].r].c;ls=t[t[nr].l].s-t[t[pr].l].s;rs=t[t[nr].r].s-t[t[pr].r].s;if(k<=lc){query(t[pr].l,t[nr].l,k,l,mid);res+=rs-rc*d;}else{query(t[pr].r,t[nr].r,k-lc,mid+1,r);res+=d*lc-ls;}}int a[100010],b[100010];int main(){int n,m,i,x,y;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%d",a+i);for(i=1;i<=n;i++)scanf("%d",b+i);for(i=1;i<=n;i++){v[++N]=a[i]+b[i];v[++N]=a[i]-b[i];}sort(v+1,v+N+1);N=unique(v+1,v+N+1)-v-1;for(i=1;i<=n;i++){modify(r1[i-1],r1[i],lower_bound(v+1,v+N+1,a[i]+b[i])-v,a[i]+b[i],1,N);modify(r2[i-1],r2[i],lower_bound(v+1,v+N+1,a[i]-b[i])-v,a[i]-b[i],1,N);}while(m--){scanf("%d%d",&x,&y);res=0;query(r1[x-1],r1[y],(y-x)/2+1,1,N);query(r2[x-1],r2[y],(y-x)/2+1,1,N);printf("%lld.%d0\n",res/2,res&1?5:0);}}

[xsy1144]選物品

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.