題解-BOI 2004 Sequence

Problem

bzoj & Luogu

題目大意:

給定序列\(\{a_i\}\),求一個嚴格遞增序列\(\{b_i\}\),使得\(\sum \bigl |a_i-b_i\bigr|\)最小

Thought

正序:直接對應
逆序:取中位數(證明:“醫院設置”)
最優解一定是分段
每一段臺階式上升
每一段選取中位數
沙漏型左偏樹 合并區間 選取中位數
upd:貌似不需要沙漏型?

Solution

前置技能:小學奧數、可并堆

和上面類似,先不考慮嚴格上升,即先考慮非嚴格上升

序列一定是要分成若干段,每一段的\(b\)值相等,且后一段比前一段大,像臺階一樣(如下圖,是一個\(b(x)\)的偽函數)

1428579-20180628175256062-16221207.jpg

先令\(\forall i\in[1,n],a_i=b_i\),這樣的答案為零,但卻不合法,接下來考慮如何用最小代價使答案合法,考慮對于相鄰兩段數:

設當前前一段取最優值時的\(b\)統一為\(b_1\),后一段統一為\(b_2\),變換之后兩者的統一\(b\)值分別變為\(b_1^{'},b_2^{'}\)

如果\(b_1\leq b_2\),則對于這兩段來說是合法的,無需操作;

如果\(b_1>b_2\),則表示因為要求\(b_1\leq b_2\),而現在是\(b_1>b_2\),要求\(b_1^{'}\leq b_2^{'}\),考慮到兩段的\(b\)變化得越少越好,即\(\bigl | b_1-b_1^{'}\bigr |,\bigl | b_1-b_1^{'}\bigr |\)取最小,則變換之后\(b_1^{'}=b_2^{'}\),我們再考慮\(b_1^{'}(b_2^{'})\)的取值,應為這兩段數合在一起的中位數,證明見下方“附”,找中位數可以用線段樹解決,也可以用堆解決(堆解法見TJOI2010中位數),考慮到兩段需要合并,線段樹需要線段樹合并,而堆只需要可并堆即可

如何把相鄰兩段的處理擴展到整個序列呢,鑒于整個\(b\)序列是遞增的,可以用單調棧實現,棧中的比較方式就是上述對于相鄰兩段的處理

現在解除一開始自己設置的限制,將\(a_i\)設為\(a_i-i\)即可將非嚴格上升序列的做法轉移到嚴格上升序列的做法

附:證明:其實就是小學奧數題 對于一段數\(\{c_i\}\)選取\(x\)使得\(\sum \bigl |x-c_i \bigr |\),最小的\(x\)值的一個取值為\(\{c_i\}\)序列的中位數:

反證法:設原序列有\(n\)個元素,則比\(x\)大/小的數有\(\frac n2\)個,若\(x\)變小或變大,則若越過序列中另一個值時,比\(x\)大/小的數有\(\frac n2±1\)個,統計答案時只會增加\(2\)或不變

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rg registerstruct ios {inline char read(){static const int IN_LEN=1<<18|1;static char buf[IN_LEN],*s,*t;return (s==t)&&(t=(s=buf)+fread(buf,1,IN_LEN,stdin)),s==t?-1:*s++;}template <typename _Tp> inline ios & operator >> (_Tp&x){static char c11,boo;for(c11=read(),boo=0;!isdigit(c11);c11=read()){if(c11==-1)return *this;boo|=c11=='-';}for(x=0;isdigit(c11);c11=read())x=x*10+(c11^'0');boo&&(x=-x);return *this;}
} io;const int N=1001000;
struct Leftist_Tree{int l,r,dis,val;}t[N];
struct node{int l,r,rt,sz,val;node(){}node(const int&L,const int&id){l=L,r=rt=id,sz=1,val=t[id].val;}
}h[N];
int n,top;inline int merge(int u,int v){if(!u||!v)return u|v;if(t[u].val<t[v].val||(t[u].val==t[v].val&&u>v))swap(u,v);int&l=t[u].l,&r=t[u].r;r=merge(r,v);if(t[l].dis<t[r].dis)swap(l,r);t[u].dis=t[r].dis+1;return u;
}inline int del(int u){return merge(t[u].l,t[u].r);}void work(){io>>n;for(rg int i=1;i<=n;++i)io>>t[i].val,t[i].val-=i;h[top=1]=node(1,1);for(rg int i=2;i<=n;++i){int l=h[top].r+1;h[++top]=node(l,i);while(top^1&&h[top-1].val>h[top].val){--top;h[top].rt=merge(h[top].rt,h[top+1].rt);h[top].r=h[top+1].r;h[top].sz+=h[top+1].sz;while(h[top].sz>((h[top].r-h[top].l+2)>>1)){--h[top].sz;h[top].rt=del(h[top].rt);}h[top].val=t[h[top].rt].val;}}return ;
}void Print(){ll Ans=0;for(rg int i=1,p=1;i<=n;++i){if(i>h[p].r)++p;Ans+=abs(h[p].val-t[i].val);}printf("%lld\n",Ans);for(rg int i=1,p=1;i<=n;++i){if(i>h[p].r)++p;printf("%d ",h[p].val+i);}putchar('\n');return ;
}int main(){work();Print();return 0;
}

轉載于:https://www.cnblogs.com/penth/p/9239977.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250024.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【vscode】編譯java時報錯亂碼

報錯如下 解決方案 改變終端的編碼格式 chcp 946注意: chcp 65001 UTF-8編碼chcp 936 GBK2312代碼頁

搭建集群架構

環境搭建進行規劃(磨刀不誤砍柴工). 集群架構組成說明. 負載均衡服務器使用Nginx做搭建,(nginx反向代理軟件) Nginx01<-------->Nginx02 3臺Web網站服務器,Nginx網站web服務功能 2臺負載均衡服務器 (對網站的流量進行分流,減少流量對某臺服務器的壓力) 3臺web服務器, (處…

Model、ModelMap和ModelAndView的使用詳解

1.前言 最近SSM框架開發web項目&#xff0c;用得比較火熱。spring-MVC肯定用過&#xff0c;在請求處理方法可出現和返回的參數類型中&#xff0c;最重要就是Model和ModelAndView了&#xff0c;對于MVC框架&#xff0c;控制器Controller執行業務邏輯&#xff0c;用于產生模型數據…

【mysql】- 初始化

參考 1、寫配置文件 在mysql的根目錄下創建 my.ini&#xff0c;根目錄的截圖和輸入的內容如下所示。 my.ini的內容如下 [mysql] default-character-setutf8[mysqld] character-set-serverutf8 default-storage-engineINNODB sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,…

【FBI WARNING】一些Noip的黑科技 持續整理!

有疑問或錯誤盡管評論&#xff01;&#xff01; 下面以C為準。 本文手&#xff08;粘&#xff09;打&#xff08;貼&#xff09;于各大博客之間 有問題。。。。。 我也不懂 max、min的優化 我們知道&#xff0c;打max、min時&#xff0c;要用分支&#xff08;if語句&#xff09…

@PathVariable注解使用

PathVariable是spring3.0的一個新功能&#xff1a;接收請求路徑中占位符的值 語法&#xff1a; PathVariable("xxx") 通過 PathVariable 可以將URL中占位符參數{xxx}綁定到處理器類的方法形參中PathVariable(“xxx“) RequestMapping(value”user/{id}/{name}”) 請…

【mysql】- 常用命令

DML - 操作表 SELECT * FROM stu;INSERT INTO stu ( id, NAME ) VALUES ( 1, 張三 );INSERT INTO stu ( id, NAME, sex, birthday, score, email, tel, STATUS ) VALUES( 2, 李四, 男, 1999-11-11, 88.888, lisiitcase.cn, 13812345678, 1 );update stu set sex 女 where nam…

JAVA 框架-Spring-AOP面向切面

AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;我們一般稱為面向方面&#xff08;切面&#xff09;編程&#xff0c;作為面向對象的一種補充&#xff0c;用于處理系統中分布于各個模塊的橫切關注點&#xff0c;比如事務管理、日志、緩存等等。AOP實現的關鍵…

互相關和卷積的關系

轉載于:https://www.cnblogs.com/seisjun/p/10134021.html

Thymeleaf3語法詳解

Thymeleaf是Spring boot推薦使用的模版引擎&#xff0c;除此之外常見的還有Freemarker和Jsp。Jsp應該是我們最早接觸的模版引擎。而Freemarker工作中也很常見&#xff08;Freemarker教程&#xff09;。今天我們從三個方面學習Thymeleaf的語法&#xff1a;有常見的TH屬性&#x…

【mysql】約束、外鍵約束、多對多關系

1、約束 DROP TABLE IF EXISTS emp;-- 員工表 CREATE TABLE emp (id INT PRIMARY KEY auto_increment, -- 員工id,主鍵且自增長ename VARCHAR(50) NOT NULL UNIQUE, -- 員工姓名,非空并且唯一joindate DATE NOT NULL, -- 入職日期,非空salary DOUBLE(7, 2) NULL, -- 工資,非空…

SSM+Netty項目結合思路

最近正忙于搬家&#xff0c;面試&#xff0c;整理團隊開發計劃等工作&#xff0c;所以沒有什么時間登陸個人公眾號&#xff0c;今天上線看到有粉絲想了解下Netty結合通用SSM框架的案例&#xff0c;由于公眾號時間限制&#xff0c;我不能和此粉絲單獨溝通&#xff0c;再此寫一篇…

[6]Windows內核情景分析 --APC

APC&#xff1a;異步過程調用。這是一種常見的技術。前面進程啟動的初始過程就是&#xff1a;主線程在內核構造好運行環境后&#xff0c;從KiThreadStartup開始運行&#xff0c;然后調用PspUserThreadStartup&#xff0c;在該線程的apc隊列中插入一個APC&#xff1a;LdrInitial…

THYMELEAF 如何用TH:IF做條件判斷

TestController 增加一個布爾值數據&#xff0c;并且放在model中便于視圖上獲取 package com.how2java.springboot.web; import java.util.ArrayList; import java.util.Date; import java.util.List;import org.springframework.stereotype.Controller; import org.springfr…

【mysql】多表查詢、左外連接、內連接、練習題

多表查詢 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FBdzXkoQ-1659581225088)(C:\Users\L00589~1\AppData\Local\Temp\1659337934641.png)] 左外連接&右外連接 -- 查詢emp表所有數據和對應的部門信息 select * from emp left join dept o…

noi2018

day0 筆試沒啥問題&#xff0c;基本都是100 day1 時間有點緊&#xff0c;念了2h題目&#xff0c;能寫80848&#xff0c;第一題不會可持久化所以只能暴力。第二題感覺沒第三個好做。第三題sa亂搞&#xff0c;隨機串只hash長度小于20的。 最后幾分鐘才改過了所有小樣例&#xff0…

Python自建collections模塊

本篇將學習python的另一個內建模塊collections,更多內容請參考:Python學習指南 collections是Python內建的一個集合模塊&#xff0c;提供了許多有用的集合類。 namedtuple 我們知道tuple可以表示不變集合&#xff0c;例如&#xff0c;一個點的二維左邊就可以表示成&#xff1a;…

Thymeleaf th:include、th:replace使用

最近做到頁面數據展示分頁的功能&#xff0c;由于每個模塊都需要分頁&#xff0c;所以每個頁面都需要將分頁的頁碼選擇內容重復的寫N遍&#xff0c;如下所示&#xff1a; 重復的代碼帶來的就是CtrlC&#xff0c;CtrlV ,于是了解了一下thymeleaf的fragment加載語法以及th:includ…

(OS X) OpenCV架構x86_64的未定義符號:錯誤(OpenCV Undefined symbols for architecture x86_64: error)...

原地址&#xff1a;http://www.it1352.com/474798.html 錯誤提示如下&#xff1a; Undefined symbols for architecture x86_64:"cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:_main in test-41a30e.o"cv::namedWindow(std::__1::basic…

【算法】大根堆

const swap (arr, i, j) > {const tmp arr[i];arr[i] arr[j];arr[j] tmp; } const heapInsert (arr , i) > { // 插入大根堆的插入算法while(arr[i] > arr[Math.floor((i - 1) / 2]) {swap(arr, i, Math.floor((i - 1) / 2);i Math.floor((i - 1) / 2; } } cons…