貪心(數據結構):COGS 468. [NOI2010]超級鋼琴

★★★☆?? 輸入文件:piano.in?? 輸出文件:piano.out?? 簡單對比
時間限制:2 s?? 內存限制:512 MB

超級鋼琴

【問題描述】

小Z是一個小有名氣的鋼琴家,最近C博士送給了小Z一架超級鋼琴,小Z希望能夠用這架鋼琴創作出世界上最美妙的音樂。

這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為Ai,其中Ai可正可負。

一個“超級和弦”由若干個編號連續的音符組成,包含的音符個數不少于L且不多于R。我們定義超級和弦的美妙度為其包含的所有音符的美妙度之和。兩個超級和弦被認為是相同的,當且僅當這兩個超級和弦所包含的音符集合是相同的。

小Z決定創作一首由k個超級和弦組成的樂曲,為了使得樂曲更加動聽,小Z要求該樂曲由k個不同的超級和弦組成。我們定義一首樂曲的美妙度為其所包含的所有超級和弦的美妙度之和。小Z想知道他能夠創作出來的樂曲美妙度最大值是多少。

【輸入格式】

輸入文件名為piano.in。

輸入文件第一行包含四個正整數n, k, L, R。其中n為音符的個數,k為樂曲所包含的超級和弦個數,L和R分別是超級和弦所包含音符個數的下限和上限。

接下來n行,每行包含一個整數Ai,表示按編號從小到大每個音符的美妙度。

【輸出格式】

輸出文件為piano.out。

輸出文件只有一個整數,表示樂曲美妙度的最大值。

【樣例輸入】

4 3 2 3

3

2

-6

8

【樣例輸出】

11


【樣例說明】

共有5種不同的超級和弦:

  1. 音符1 ~ 2,美妙度為3 + 2 = 5
  2. 音符2 ~ 3,美妙度為2 + (-6) = -4
  3. 音符3 ~ 4,美妙度為(-6) + 8 = 2
  4. 音符1 ~ 3,美妙度為3 + 2 + (-6) = -1
  5. 音符2 ~ 4,美妙度為2 + (-6) + 8 = 4

最優方案為:樂曲由和弦1,和弦3,和弦5組成,美妙度為5 + 2 + 4 = 11。

【數據規模和約定】

總共10個測試點,數據范圍滿足:

所有數據滿足:-1000 ≤ Ai ≤ 1000,1 ≤ L ≤ R ≤ n且保證一定存在滿足要求的樂曲。

  

  這題考慮貪心,用一個三元組記錄node為起點,能取到的右端點區間。

  用ST可以O(1)求出區間中應取哪一個右端點,每次取最大的,處理成兩個子區間,放回heap中,繼續貪心。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 using namespace std;
  5 const int maxn=500010;
  6 int n,K,L,R,s[maxn],pos;
  7 struct Node{
  8     int node,l,r;
  9     Node(int NODE=0,int L=0,int R=0){
 10         node=NODE;l=L;r=R;
 11     }
 12 };
 13 int mm[maxn],Max[maxn][25],Mpos[maxn][25];
 14 
 15 int Query(int l,int r){
 16     if(Max[l][mm[r-l+1]]<Max[r-(1<<mm[r-l+1])+1][mm[r-l+1]]){
 17         pos=Mpos[r-(1<<mm[r-l+1])+1][mm[r-l+1]];
 18         return Max[r-(1<<mm[r-l+1])+1][mm[r-l+1]];
 19     }
 20     else{
 21         pos=Mpos[l][mm[r-l+1]];
 22         return Max[l][mm[r-l+1]];
 23     }
 24 }
 25 
 26 int Q(Node x){
 27     return Query(x.l,x.r)-s[x.node-1];
 28 }
 29 
 30 struct Heap{
 31     int cnt;
 32     Node h[maxn<<1];
 33     void Insert(Node x){
 34         int p=++cnt;
 35         while(p!=1){
 36             if(Q(x)<=Q(h[p>>1]))break;
 37             h[p]=h[p>>1];
 38             p>>=1;
 39         }
 40         h[p]=x;
 41     } 
 42     
 43     void Delete(){
 44         int p=1,a,b;
 45         Node x=h[cnt--];
 46         while(p*2<=cnt){
 47             a=p<<1;b=a|1;
 48             if(b<=cnt&&Q(h[a])<Q(h[b]))a=b;
 49             if(Q(h[a])<=Q(x))break;
 50             h[p]=h[a];
 51             p=a;    
 52         }
 53         h[p]=x;
 54     }
 55 }q;
 56 
 57 int main(){
 58     freopen("piano.in","r",stdin);
 59     freopen("piano.out","w",stdout);
 60     scanf("%d%d%d%d",&n,&K,&L,&R);
 61     
 62     for(int i=1;i<=n;i++)
 63         scanf("%d",&s[i]);    
 64     for(int i=1;i<=n;i++)
 65         s[i]+=s[i-1];
 66     
 67     mm[0]=-1;
 68     for(int i=1;i<=n;i++){
 69         mm[i]=(i&(i-1))==0?mm[i-1]+1:mm[i-1];
 70         Max[i][0]=s[i];
 71         Mpos[i][0]=i;
 72     }
 73     
 74     for(int k=1;k<=mm[n];k++)
 75         for(int i=1;i+(1<<k)-1<=n;i++){
 76             if(Max[i][k-1]>Max[i+(1<<(k-1))][k-1]){
 77                 Max[i][k]=Max[i][k-1];
 78                 Mpos[i][k]=Mpos[i][k-1];
 79             }
 80             else{
 81                 Max[i][k]=Max[i+(1<<(k-1))][k-1];
 82                 Mpos[i][k]=Mpos[i+(1<<(k-1))][k-1];
 83             }
 84         }
 85     
 86     for(int i=1;i<=n-L+1;i++)
 87         q.Insert(Node(i,i+L-1,min(i+R-1,n)));
 88     
 89     long long ans=0;
 90     int p;
 91     Node x;
 92     while(K--){
 93         ans+=Q(q.h[1]);
 94         x=q.h[1];p=pos;
 95         q.Delete();
 96         
 97         if(x.l<p)q.Insert(Node(x.node,x.l,p-1));
 98         if(x.r>p)q.Insert(Node(x.node,p+1,x.r));
 99     }
100     printf("%lld\n",ans);
101     return 0;
102 }

?

轉載于:https://www.cnblogs.com/TenderRun/p/5316913.html

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

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

相關文章

java實現選擇排序 帶打印,選擇排序算法的JAVA實現

選擇排序算法的JAVA實現package Utils.Sort;/***利用選擇排序法對數組排序&#xff0c;數組中元素必須實現了Comparable接口。*/public class ChooseSort implements SortStrategy{/***對數組obj中的元素以選擇排序算法進行排序*/public void sort(Comparable[] obj){if (obj …

angularjs初始化時不顯示模板內容, 不顯示html, 不顯示template

template的內容可能在需要的數據準備好之前就顯示出來了, ng-cloak可以解決這個問題 ng-cloak <div id"template1" ng-cloak>{{ hello }}</div> <div id"template2" class"ng-cloak">{{ world }}</div>

左右箭頭滑動列表

//slideshow 左右箭頭滑動一組li焦點圖 autoSlide();function autoSlide(){clearAutoSsetInterval(autoFunS,5000);}function autoFunS(){var loc$(".slideshow-box ul").css("left");if(loc"-2370px"){loc"1185";}var newlocparseInt…

20159206《網絡攻防實踐》第四周學習總結

20159206《網絡攻防實踐》第四周學習總結 教材學習內容總結 本章主要介紹了網絡嗅探和協議分析 網絡嗅探是一種常用的竊聽技術&#xff0c;利用計算機的網絡接口截獲目的地為其他計算機的數據報文&#xff0c;以監聽數據流中所包含的用戶賬戶密碼或私密信息等。 網絡泄灘具有很…

四六級php,詳解四六級查詢API+網頁

這個API是第三方API&#xff0c;第三方API的工作原理大都基于此&#xff0c;本文主要起一反三之作用&#xff0c;代碼的不處周之還望及時指出。開發環境&#xff1a;WinServer2012 php7.0 Apache2.4.8思路&#xff1a;向官方查詢界面傳遞參數&#xff0c;使用curl抓取結果網頁…

終于把joomla 的 protostar 模版的菜單,從垂直改到水平了

protostar-applying-menu-class-suffixes-horizontal-vs-vertical-menus.html joomla 3.7.5 附帶的這個template , 菜單丑的要死。 估計是新改的。 看網上的其他站點都沒這毛病。 最后終于找到解決方法了。“ nav-pills“ 前面是有空格的 To make the menu horizonal, you can …

Find non-overlap jobs with max cost

Given a set of n jobs with [start time, end time, cost] find a subset so that no 2 jobs overlap and the cost is maximum.Job: &#xff08;start_time, end_time] --- cost 如果只是求maxCost, 一維就可以做。 但是如果要知道有選了哪些job&#xff0c;則需要存成二維。…

php 跨區域,PHP跨時區的功能實現

現在有一個跨時區的應用&#xff0c;不同時區登錄的用戶需要看到自己時區的時間&#xff0c;同時也要能夠進行時區的切換。我的思路是&#xff0c;系統中所有存儲的時間都是GMT(UTC)時間&#xff0c;用戶登錄時&#xff0c;根據用戶所在的時區進行對應的顯示。首先了解一下PHP中…

js實現向上滾動效果

源碼&#xff1a;<style type"text/css"> #up_zzjs{border:1px solid #ccc;width:170px;height:182px;line-height:20px;overflow:hidden;} #up_zzjs #up_li{list-style-type:none;margin:0;padding:0;margin-left:6px;} /*系統支持ie8就選line-heigh…

利用數據的商業智能分析工具

商業智能可以定義為獲取和轉換原始數據的技術和工具&#xff0c;這些信息可以為業務運營提供有意義的好處。 商業智能的發展 商業智能&#xff08;BI&#xff09;是一個可追溯到19世紀中期的術語&#xff0c;基本上是一樣的定義。但作為結構化數據的自動化處理的參考&#xff0…

管理之道(三) - 不要吝惜贊美

多一句贊美 人們相互希望得越多&#xff0c;想要給予對方的越多……就必定越親密。   幾天前&#xff0c;我和一位朋友在紐約搭計程車&#xff0c;下車時&#xff0c;朋友對司機說&#xff1a;“謝謝&#xff0c;搭你的車十分舒適。”這司機聽了愣了一愣&#xff0c;然后說&a…

優酷視頻整段代理php,thinkphp仿優酷帶數據源碼|php仿優酷視頻源碼帶后臺功能強大...

本項目是仿優酷官網&#xff0c;優酷官網是一個集多種知識面為一體的網站&#xff0c;能全面的鍛煉我們的技能,所以我們決定仿優酷網。本項目后臺主要實現了&#xff1a;用戶管理、分類管理、視頻管理、評論管理、權限管理、輪播管理、網站配置和廣告管理以及登錄退出等模塊。前…

Centos7安裝Oracle JDK

查看Linux是否自帶的JDK&#xff0c;如有openJDK&#xff0c;則卸載1 java -version 1 rpm -qa | grep -E ^open[jre|jdk]|j[re|dk] 卸載openjdk1 su root 2 3 yum -y remove java java-1.7.0-openjdk 下載oracle jdk1 wget --no-cookies --header "Cookie: oraclelice…

前端每周清單第 30 期:WebVR 指南,Vue 代碼分割范式,理想的 React 架構特性

前端每周清單專注前端領域內容&#xff0c;以對外文資料的搜集為主&#xff0c;幫助開發者了解一周前端熱點&#xff1b;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎關注【前端之巔】微信公眾號&#xff08;ID&#xff1a;frontshow&#xff…

Oracle(3)——Oracle圖形界面工具創建數據庫

具體操作步驟詳情&#xff1a; 1.圖形界面工具首界面 Database Configuration Assistant 點擊下一步 2.默認 點擊下一步 3.默認 點擊下一步 4.設置全局數據庫名、SID 為新建數據庫起一個“全局數據庫名”&#xff0c;比如這里對數據庫名和SID&#xff1a;FKXT 點擊下一步 5.設置…

rsa 加密 js php,security.js+RSA做出加密功能

這次給大家帶來security.jsRSA做出加密功能&#xff0c;的注意事項有哪些&#xff0c;下面就是實戰案例&#xff0c;一起來看一下。在項目中遇到要對用戶輸入的密碼進行RSA加密的需求&#xff0c;總結一下實現過程&#xff1a;JS rsa加密加密//引入security.js文件var btn doc…

多線程面試題系列(12):多線程同步內功心法——PV操作上

上面的文章講解了在Windows系統下實現多線程同步互斥的方法&#xff0c;為了提高在實際問題中分析和思考多個線程之間同步互斥問題的能力&#xff0c;接下來將講解PV操作&#xff0c;這也是操作系統中的重點和難點。本文將會先簡要介紹下PV操作的來源和基本使用方法&#xff0c…

兩離散序列卷積matlab,離散序列卷積和(用matlab實現)

數字信號處理實驗報告實驗一離散時間序列卷積和MATLAB實現(一)實驗目的&#xff1a;學會用MATLAB對信號與系統分析的方法&#xff0c;理解離散序列卷積和的計算對進行離散信號與系統分析的重要性。(二)實驗原理&#xff1a;1、離散時間序列f1(k)和f2(k)的卷積和定義&#xff1a…

linux命令學習-4-lsof

lsof&#xff08;list open files&#xff09;是一個列出當前系統打開文件的工具。在linux環境下&#xff0c;任何事物都以文件的形式存在&#xff0c;通過文件不僅僅可以訪問常規數據&#xff0c;還可以訪問網絡連接和硬件。 在終端下輸入lsof即可顯示系統打開的文件&#xff…

IOS6+ 下,使用position:sticky實現粘性布局

回顧一下 開通博客之后&#xff0c;潦草的寫了幾篇&#xff0c;之后由于沒時間&#xff0c;加上文筆不好等等&#xff08;好吧&#xff0c;都是借口&#xff09;&#xff0c;基本上就沒怎么寫過了&#xff0c;其實平時也做了一些記錄&#xff0c;但就是犯懶&#xff0c;沒有去整…