1. 程式人生 > >Average(數形結合)

Average(數形結合)

題目連結 https://vjudge.net/problem/UVA-1451

紫書243頁例題,採用數形結合的方法,用deque來維護一個單調結點的佇列,即不包含上凸點的序列,每次都更新結果,記錄最優解。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 100050;

int n, l;
char st[maxn];
int s[maxn];
deque<int> que;

//a,b對應直線斜率大於c,d對應直線,返回值>0,小於則返回值<0,等於返回0 
int check(int a, int b, int c, int d) {
	return (c - d)*(s[a] - s[b]) - (a - b)*(s[c] - s[d]);
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &n, &l);
		scanf("%s", 1 + st);
		que.clear();
		for (int i = 1; i <= n; ++i) {
			s[i] = s[i - 1] + st[i] - '0';
		}
		
		int ansl = 0, ansr = l;//ansl記錄左端點的前一位
		 
		for (int i = l; i <= n; ++i) {
			//加入新結點j前,先把形成的上凸點刪掉
			int j = i - l;
			while (que.size() > 1) {
				int t1 = que[que.size() - 1];//倒數第一個點
				int t2 = que[que.size() - 2];//倒數第二個點
				if (check(t2, t1, t2, j) > 0) que.pop_back();
				else break;
			}
			//加入j
			que.push_back(j);
			//把不可能是解的開頭若干項去掉
			while (que.size() > 1) {
				if (check(que[0], i, que[1], i) <= 0) que.pop_front();
				else break;
			} 
			
			//更新結果 
			int res = check(que[0], i, ansl, ansr);
			if (res > 0 || 0 == res && i - que[0] < ansr - ansl) {
				ansl = que[0];
				ansr = i;
			}
		}
		
		printf("%d %d\n", 1 + ansl, ansr);
	}
	return 0;
}


相關推薦

Average結合

題目連結 https://vjudge.net/problem/UVA-1451紫書243頁例題,採用數形結合的方法,用deque來維護一個單調結點的佇列,即不包含上凸點的序列,每次都更新結果,記錄最優解。#include<bits/stdc++.h> using

UVa 1451:Average結合

題意:給定一個長度為n的01串,選一個長度至少為L的連續子串,使得子串中數字的平均值最大。如果有多解,字串長度應儘量小;如果仍有多解,起點編號儘量小。序列中的字元編號為1~n,因此[1,n]就

HDU3045 Picnic Cows 斜率DP優化結合

滿足 -s 坐標軸 明顯 spl 信息 更新 cow 常數 轉自PomeCat: “DP的斜率優化——對不必要的狀態量進行拋棄,對不優的狀態量進行擱置,使得在常數時間內找到最優解成為可能。斜率優化依靠的是數形結合的思想,通過將每個階段和狀態的答案反映在坐標系上尋找解答的單調

101190E Expect to Wait結合 , 二分, 查分

題意: 告訴你n 個操作過程, + 代表 在t 時刻來了k 個車,  - 代表在t 時刻 來了k 個人,  每個人都要開走車, 沒車的話 一直在佇列裡等, 告訴你每一天開始有多少輛車, 求所有人的等待時間總和, 如果有人拿不到車就輸出 inf。 思路: 數形結合的思想。

error: expected declaration specifiers or '...' before xxxxxx是函

... 編譯 exp 定義 包含 情況 搜索 .... make 在使用帶參有返回值的函數指針做參數時,編譯出現下面情況 …………………… error: expected declaration specifiers or ‘...‘ before ‘FunType‘

動態規劃

最長公共子序列問題 Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裡^_^ 題目描述  給定兩個序列X= 輸入 輸入資料有多

UVA 1451 Average 結合+單調佇列 *

#include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for(int i=a;i<=(int)(b);

使用不帶頭結點的循環鏈表實現隊列據結構

center ios string first family lis out pop 一個隊列 我使用類模版來完畢循環鏈表實現隊列的操作。首先定義一個結點類node用來保存結點信息,然後定義隊列類Queue。接下來我們思考:要完畢隊列的4個基本操作即 1.推斷隊列是否為

Head first java chapter 16 集合與泛型據結構

技術分享 rst image 結構 logs ges nbsp alt log Head first java chapter 16 集合與泛型(數據結構)

Entity Framework:使用特性據註解創建表結構

int32 概念 ann 應該 etime max 繼承 兩個 width 一、理解Code First及其約定和配置   傳統設計應用的方式都是由下而上的,即我們習慣優先考慮數據庫,然後使用這個以數據為中心的方法在數據之上構建應用程序。這種方法非常適合於數據密集的應用或者

樹與二叉樹據結構

二叉樹 n+1 -s 不能 完美性 -1 平衡二叉樹 編號 大於 (1)樹的基本性質 1.樹中的結點數等於所有結點的度數+1。 2.樹中結點的最大度數稱為樹的度。 3.度為m的樹中第i層上至多有mi-1個結點。 4.高度為h的m叉樹至多有(mh-1)/(m-1)個結點。

Code First Migrations更新據庫結構據遷移

ply 示例 文件夾 就會 class .com loss ati user 背景 code first起初當修改model後,要持久化至數據庫中時,總要把原數據庫給刪除掉再創建(DropCreateDatabaseIfModelChanges),此時就會產生一個問題,當

Byte Of Python據結構

元組 麻煩 emp 對象 鍵值 style color index mut 數據結構 數據結構(Data Structure)基本上人如其名——它們只是一種結構,能夠將一些數據聚合在一起。換句話說,它們是用來存儲一系列相關數據的集合。 Python中有四種內置的數據結構——

據庫復習總結16-case關鍵字據透視

isp b- event sub 多行 none 創建 pre group case語法: 練習1:將性別的0、1顯示為男、女 select * from StudentInfo --case:對結果集中的列進行判斷 --例1:顯示學生信息,性別以"男

實戰組操作

class alt emp turn arrays boolean xtend oid AD class Arr{ private int data[]; private int foot; public Arr(int len){ if (len>0) {

Fortify漏洞之Access Control: Database據越權

AR 授權 ase statement 後臺 實施 代碼 parameter AS   繼續對Fortify的漏洞進行總結,本篇主要針對 Access Control: Database(數據越權)的漏洞進行總結,如下: 1、Access Control: Database

據結構順序存儲的線性表

計算機 ear func 可行性 cat 特性 一對一 輸出 code ---恢復內容開始--- 推薦一本學習書籍:程傑的《大話數據結構》。 既然是數據結構,那什麽是數據結構呢?這裏補充一些基本術語和概念。 數據結構: 是一門研究非數值計算的程序設計問題中的操作對象,以及它

shell編程連接postgres據庫據備份

數據 postgre ima img 分享 開始 數據庫 com 數據備份 第一步:通過xshell或者其他工具連接到linux服務, 第二步:創建一個腳本:touch se.sh 第三步:輸入i,代表開始輸入內容 輸入以下命令: 腳本如下:(sql語句可以是任何復雜的

7.DataAnnotations據註解【Code-First 系列】

分享 image first .data length info ima 系列 .net 轉自https://www.cnblogs.com/caofangsheng/p/5023639.html 關於註解的相關學習網頁 http://www.entityframework

51node 1134 最長遞增子序列 據結構

賦值 log 寫法 數字 name 內存 遞增 max scan 題意: 最長遞增子序列 思路: 普通的$O(n^2)$的會超時。。 然後在網上找到了另一種不是dp的寫法,膜拜一下,自己寫了一下解釋 來自:https://blog.csdn.net/Adusts/artic