汕頭市隊賽 SRM16 T2

描述

? ? ? 貓和老鼠,看過吧?貓來了,老鼠要躲進洞里。在一條數軸上,一共有n個洞,位置分別在xi,能容納vi只老鼠。一共有m只老鼠位置分別在Xi,要躲進洞里,問所有老鼠跑進洞里的距離總和最小是多少。

輸入格式

? ? ? 兩個用空格隔開的整數m和n。

? ? ? 這一行m個數字分別表示老鼠的位置

? ? ? 接下來n行每行兩個數字分別表示洞的位置和容納量

輸出格式

? ? ? 一個整數,表示最小的距離總和。(如果無解,輸出-1)

樣例輸入

4 5
6 2 8 9
3 6
2 1
3 6
4 7
4 7

樣例輸出

11
——————————————————————————
?n <= 500, m <= 500 的時候可以寫費用流 但是要比較好的建圖方式
nm的建圖肯定要掛
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=2e3+7,inf=0x3f3f3f3f;
const LL mx=1e15;
int read(){int ans=0,f=1,c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9') {ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
int n,m,q[M],vis[M];
int N,S,T;
LL ans,d[M];
struct node{int to,next,flow;LL cost;}e[M*M];
int first[M],cnt=1,cur[M];
void ins(int a,int b,int flow,LL cost){e[++cnt]=(node){b,first[a],flow,cost}; first[a]=cnt;}
void insert(int a,int b,int flow,LL cost){ins(a,b,flow,cost); ins(b,a,0,-cost);}
bool spfa(){for(int i=S;i<=T;i++) d[i]=mx;int head=0,tail=1;q[0]=T; vis[T]=1; d[T]=0;while(head!=tail){int x=q[head++]; if(head>M) head=0;for(int i=first[x];i;i=e[i].next){int now=e[i].to;if(e[i^1].flow&&d[x]+e[i^1].cost<d[now]){d[now]=d[x]+e[i^1].cost;if(!vis[now]){if(d[now]<d[q[head]]){head--; if(head<0) head=M; q[head]=now;}else{q[tail++]=now; if(tail>M) tail=0;}vis[now]=1;}}            }vis[x]=0;}return d[S]<mx;
}
int dfs(int x,int a){if(x==T||a==0)return a;vis[x]=1;int flow=0,f;for(int& i=cur[x];i;i=e[i].next){int now=e[i].to;if(!vis[now]&&d[x]==e[i].cost+d[now]&&(f=dfs(now,min(a,e[i].flow)))>0){e[i].flow-=f; e[i^1].flow+=f;ans+=e[i].cost*f; flow+=f;a-=f;if(a==0)break;}}vis[x]=0;return flow;
}
int x[M];
LL sum;
struct pos{int y,k;}qq[M];
bool cmp(pos a,pos b){return a.y<b.y;}
int main()
{n=read(); m=read();S=0; T=n+m+1;for(int i=1;i<=n;i++) x[i]=read(),insert(S,i,1,0);for(int i=1;i<=m;i++) qq[i].y=read(),qq[i].k=read(),sum+=qq[i].k;if(sum<n){printf("-1\n"); return 0;}sort(qq+1,qq+1+m,cmp);for(int i=1;i<=m;i++) insert(i+n,T,qq[i].k,0);for(int i=1;i<=m;i++){if(i>1) insert(i+n,i+n-1,inf,qq[i].y-qq[i-1].y);if(i<m) insert(i+n,i+n+1,inf,qq[i+1].y-qq[i].y);}for(int i=1;i<=n;i++){int k1=1; while(qq[k1+1].y<=x[i]&&k1<m) k1++;int k2=m; while(qq[k2-1].y>=x[i]&&k2>1) k2--;if(qq[k1].y<=x[i]) insert(i,k1+n,1,x[i]-qq[k1].y);if(qq[k2].y>=x[i]) insert(i,k2+n,1,qq[k2].y-x[i]);}while(spfa()){for(int i=0;i<=T;i++) cur[i]=first[i]; dfs(S,inf);}printf("%lld\n",ans);return 0;
}
View Code

n <= 5000, m <= 5000 的時候就需要dp了

先將洞和老鼠按位置從小到大排一波序

因為老鼠選的洞必然是單調遞增的 我們可以考慮dp

f【i】【j】表示前i個洞選j只老鼠

轉移方程 f【i】【j】=f【i-1】【k】+(k+1到j 的距離

然后發現是三方的寫法 然后就后面可以用單調隊列優化dp降一波復雜度

然后就是n方寫法了

這里我們每次可以算一下每只老鼠到 第i個洞的 前綴

隊列里扔的就是f【j】+(前綴數組)s【j】就好啦

f【i】=q【l】+s【i】就好辣

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=5e3+7;
const LL inf=1e15;
int read(){int ans=0,f=1,c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9') {ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
int l,r,n,m,x[M];
struct pos{int y,k;}e[M];
bool cmp(pos a,pos b){return a.y<b.y;}
LL sum,f[M],s[M];
LL pabs(LL x){return x>=0?x:-x;}
struct node{LL v; int pos;}q[M];
int main()
{n=read(); m=read();for(int i=1;i<=n;i++) x[i]=read();for(int i=1;i<=m;i++) e[i].y=read(),e[i].k=read(),sum+=e[i].k;if(sum<n){printf("-1\n"); return 0;}sort(x+1,x+1+n);sort(e+1,e+1+m,cmp);for(int i=1;i<=n;i++) f[i]=inf;for(int i=1;i<=m;i++){l=1; r=0;for(int j=1;j<=n;j++) s[j]=s[j-1]+pabs(x[j]-e[i].y);for(int j=0;j<=n;j++){while(l<=r&&q[r].v>=f[j]-s[j]) r--;while(l<=r&&(j-q[l].pos)>e[i].k) l++;q[++r].v=f[j]-s[j]; q[r].pos=j;f[j]=q[l].v+s[j];}}printf("%lld\n",f[n]);return 0;
}
View Code

?

轉載于:https://www.cnblogs.com/lyzuikeai/p/7440311.html

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

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

相關文章

基于django和vue的xdh官網設計

前言 本項目是使用三段分離的設計 前臺 使用materialize框架搭建的前臺頁面,后端使用的django寫的接口 后臺 使用Amazon UI 模板搭建的界面,管理各個部分的內容 項目環境 python3.7.2 django2.2.9 vue axios jQuery materialize mysql摘 要 本設計采用前后端分離的設計…

C#調用WebService實例和開發(轉)

http://www.cnblogs.com/peterpc/p/4628441.html 一、基本概念 Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求&#xff0c;輕量級的獨立的通訊技術。是:通過SOAP在Web上提供的軟件服務&#xff0c;使用WSDL文件…

智能情緒分析技術_簡單分析人工智能的表現在計算機網絡應用技術中的優勢

簡單分析人工智能的表現在計算機網絡應用技術中的優勢大數據時代背景下&#xff0c; 計算機網絡技術迅猛發展&#xff0c; 而人工智能技術的發展也進一步推動了計算機網絡技術的發展&#xff0c; 兩者相互融合&#xff0c; 相互促進&#xff0c; 實現了雙贏發展。從人工智能技術…

隨筆:關于關于

突然感覺挺累的。 我愛你。 北京&#xff0c;加油。轉載于:https://www.cnblogs.com/zhengzeze/p/7448878.html

MV預測過程詳解

第一步&#xff1a;確定相鄰塊 MV 預測以宏塊分割&#xff08;或亞宏塊分割&#xff0c;如果宏塊存在亞分割&#xff09;為單位&#xff0c;同一個宏塊分割&#xff08;或亞宏塊分割&#xff09;內所有 4*4 塊 MV 預測值相同。以每個宏塊分割&#xff08;或亞宏塊分割&…

Django models中關于blank與null的補充說明

建立一個簡易Model class Person(models.Model):GENDER_CHOICES((1,Male),(2,Female),)namemodels.CharField(max_length30,uniqueTrue,verbose_name姓 名) birthdaymodels.DateField(blankTrue,nullTrue)gendermodels.IntegerField(choicesGENDER_CHOICES)accountmodels.In…

python 人臉關鍵點檢測_opencv+python+dlib人臉關鍵點檢測、實時檢測

安裝的是anaconde3、python3.7.3&#xff0c;3.7環境安裝dlib太麻煩&#xff0c;在anaconde3中新建環境python3.6.8&#xff0c;在3.6環境下安裝dlib-19.6.1-cp36-cp36m-win_amd64.whl&#xff0c;下載地址&#xff1a;https://pypi.org/project/dlib/19.6.1/#filesvscode更改配…

Zabbix2.2.6郵件報警設置方法

http://www.jb51.net/article/56973.htm 這篇文章主要介紹了Zabbix郵件報警設置方法,在Zabbix服務端設置郵件報警&#xff0c;當被監控主機宕機或者達到觸發器預設值時&#xff0c;會自動發送報警郵件到指定郵箱說明&#xff1a;Zabbix監控服務端、客戶端都已經部署完…

Skip宏塊與Direct預測模式淺析

對于我來說&#xff0c;這個是一個老問題了。以前藍風車專門給我講解&#xff0c;我都沒搞懂&#xff08;真有點對不起藍風車的細心教誨哈。呵呵~~~&#xff09;。今天終于弄清楚了&#xff0c;特此總結出來&#xff0c;請大家指正。 B_Skip類型宏…

自律

生活上的自律 寫出自律的代碼 身體上的自律 日常生活中&#xff0c;存在這么兩條路。一條路誘惑我們只根據自己的沖動和直覺來生活。這條路可以稱為「寵物之路」&#xff0c;因為所有的動物&#xff0c;包括家里養的寵物狗走的都是這條路。餓了就吃&#xff0c;吃完就算。…

解決兼容性的庫

HTML5標簽兼容方案&#xff1a;html5shiv.js [GitHub地址&#xff1a;https://github.com/aFarkas/html5shiv/] IE8不支持HTML5的新標簽&#xff0c;如<header>、<nav>等標簽在IE8無法渲染。html5shiv.js可幫助IE6-8瀏覽器兼容HTML5語義化標簽。 使用方法&#xff…

H.264 中的相關問題

幀內解碼時&#xff0c;在解碼端&#xff0c;首先通過當前宏塊左邊、上邊已經解碼完成的宏塊使用當前宏塊的預測模式&#xff08;預測模式計算過程請參見我的論文《H.264數字視頻差錯控制技術的研究》&#xff0c;在群FTP“本群原創資料”目錄中&#xff09;得到當前宏塊的像素…

wenzhixin bootstrap-table 點擊table單元格改變顏色

bootstrap-table用于展示數據非常方便&#xff0c;也需要滿足一些個性化需求。比如點擊窗格&#xff08;td&#xff09;標記下顏色&#xff0c;用于目測 代碼如下&#xff0c;轉載請注明 $("table").on(click-row.bs.table, function (e, row, $el) {//el[0] is tr …

tornado學習筆記day01-高并發性能web框架

tornado的安裝 這里我使用的是虛擬環境中的pip安裝,配合清華大學鏡像源安裝的 pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple我的第一個tornado程序 import tornado.web import tornado.ioloopclass IndexHandler(tornado.web.RequestHandler):主頁處理…

python99乘法表while翻譯_Python學習之while練習--九九乘法表

效果如下&#xff1a;實現代碼;m 1n 1while(m<10):while(n<m):print(n,"*",m,"",m*n,end \t)n 1print(\n)n 1m 1解析&#xff1a;這是一個很簡單的while嵌套程序&#xff0c;首先分析九九乘法表是從上往下逐行增加&#xff0c;且第一列乘積為1…

ASP.NET Core 2加入了Razor頁面特性

最近發布的ASP.NET Core 2.0&#xff0c;連同新發布的.NET Core 2和Entity Framework Core 2.0y&#xff0c;一并構成了.NET Core 2.0生態中的三元組。此發布給出了多個新特性和改進&#xff0c;其中包括通用性能的改進、Razor頁面、新的開發模板以及更好的Azure Diagnostics支…

matlab 矩陣拼接

E[a&#xff0c;b]%水平方向上的拼接 E[a &#xff1b;b] %垂直方向上的拼接 轉載于:https://www.cnblogs.com/hsy1941/p/7124083.html

JM8.5中的7種宏塊模式問題 - zhoujunming的專欄 - CSDN博客

JM8.5中的7種宏塊模式問題 收藏 Outline: 1、 CFG文件中有關可變尺寸宏塊模式的相關選項2、 7種宏塊模式對應的數值常量3、 7種宏塊模式被分成宏塊和亞宏塊4、 如何對宏塊和亞宏塊的運動估計&#xff0c;采用一個共同的函數來處理5、 遺留問題1、CFG文件中有關可變尺寸宏塊…

tornado學習筆記day02-進階與提升

整理基礎工程 請看第一天的配置文件目錄,搭建了一個框架的基礎目錄 Application settings debug 作用 可以設置tornado是否工作在調試模式下面,默認為false,即工作在生產模式下 true的特性: 自動重啟: tornado程序會監控源代碼文件,會自動重啟服務器,減少我們手動重啟…

python123測驗2答案八邊形_Python試卷

3、寫一個函數&#xff0c;計算一個給定的日期是該年的第幾天。def getday(self,yNone,mNone,dNone):date datetime(y,m,d)days date.strftime(%j)return days4、寫一個函數&#xff0c;給定N&#xff0c;返回斐波那契數列第N項。def getn_vlaue(self,n):if n<2:return 1e…