BZOJ - 2457 思維+貪心
//為什麼我的Chrome OS更新後變成強制繁體了??
題目要求使用最少的雙端隊列來維護一個單調非降序列
先來看下規律
首先,val肯定是單調非降的,在相等val範圍內的id可以xjb亂放不影響
其次,在單調可解的val範圍內,id一定是中間小兩邊大(中間是最初維護的,而兩邊是不斷地插入肯定越來越大)
即id在某一範圍內是v型分布的
因為val是單調的,所以對不同的val進行分塊管理對應的id,很顯然最低成立的條件是相同val(塊)的id肯定是緊挨著的,而且是每一個塊逐步往右靠(單調嘛)
如果不可解,那就意味著id的分布至少是vv型的,即至少多了一個極大值拐點,那麼拐點數+1就是使用隊列的數量
所以問題轉換成給定你未管理好的id,求最少的拐點數
貪心策略是能相同單調性就盡可能相同單調,否則相反單調
(一個錯誤策略是盡可能遞減單調,因為當前遞減的話對應三種不同高度的右下""塊狀id是最優的,然而GG,原因待查)
AC代碼
/*H E A D*/
struct A{
int id,val;
}a[maxn];
bool cmp(A a,A b){
if(a.val!=b.val)return a.val<b.val;
return a.id<b.id;
}
int main(){
int n;
while(~iin(n)){
rep(i,1,n){
a[i].val=read();
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
vector<A> block[maxn];
int now=0;
rep(i,1,n){
if(i==1||a[i].val!=block[now][0].val){
now++;
block[now].push_back(a[i]);
}else{
block[now].push_back(a[i]);
}
}
int ans=0;
rep(i,1,now) sort(block[i].begin(),block[i].end(),cmp);//trend=+1
vector<int> que;
int trend;
rep(i,1,now){
if(i==1){
for(int j = block[i].size()-1; j >= 0; j--){
que.push_back(block[i][j].id);
}
trend=-1;
}else if(trend==-1){
if(block[i].back().id<que.back()){
for(int j = block[i].size()-1; j >= 0; j--){
que.push_back(block[i][j].id);
}
trend=-1;
}else{
for(int j = 0; j < block[i].size(); j++){
que.push_back(block[i][j].id);
}
trend=1;
}
}else{
if(block[i][0].id>que.back()){
for(int j = 0; j < block[i].size(); j++){
que.push_back(block[i][j].id);
}
trend=1;
}
else{
for(int j = block[i].size()-1; j >= 0; j--){
que.push_back(block[i][j].id);
}
trend=-1;
ans++;
}
}
}
println((ans+1));
}
return 0;
}
錯誤策略部分代碼
rep(i,1,now){
if(i==1){
for(int j = block[i].size()-1; j >= 0; j--){
que.push_back(block[i][j].id);
}
trend=-1;
}else if(trend==-1){
if(block[i][0].id>que.back()){
for(int j = 0; j < block[i].size(); j++){
que.push_back(block[i][j].id);
}
trend=1;
// ans++;
}else if(block[i].back().id<que.back()){
for(int j = block[i].size()-1; j >= 0; j--){
que.push_back(block[i][j].id);
}
trend=-1;
}else{
for(int j = block[i].size()-1; j >= 0; j--){
que.push_back(block[i][j].id);
}
trend=-1;
ans++;
}
}else{
if(block[i][0].id>que.back()){
for(int j = 0; j < block[i].size(); j++){
que.push_back(block[i][j].id);
}
trend=1;
}else if(block[i].back().id<que.back()){
for(int j = block[i].size()-1; j >= 0; j--){
que.push_back(block[i][j].id);
}
trend=-1;
ans++;
}else{
for(int j = block[i].size()-1; j >= 0; j--){
que.push_back(block[i][j].id);
}
trend=-1;
ans++;
}
}
BZOJ - 2457 思維+貪心的更多相关文章
- F2. Same Sum Blocks (Hard) 解析(思維、前綴和、貪心)
Codeforce 1141 F2. Same Sum Blocks (Hard) 解析(思維.前綴和.貪心) 今天我們來看看CF1141F2(Hard) 題目連結 題目 給你一個數列\(a\),要你 ...
- D. Maximum Distributed Tree 解析(思維、DFS、組合、貪心、DP)
Codeforce 1401 D. Maximum Distributed Tree 解析(思維.DFS.組合.貪心.DP) 今天我們來看看CF1401D 題目連結 題目 直接看原題比較清楚,略. 前 ...
- bzoj 1034: [ZJOI2008]泡泡堂BNB 貪心
1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1398 Solved: 727[Submit][Sta ...
- 邁向IT專家成功之路的三十則鐵律 鐵律十:IT人思維之道-跳脫框架
莊子的哲學思想歸本於老子,他認為人要解脫束縛必須做到不從任何的角度與任何的時間來看待事物,而是必須與天地同體,然而也唯有如此才能看清宇宙間萬事萬理的真諦.無論是莊子還是老子,他們畢竟是中國古代的聖賢, ...
- [題解](貪心/堆)luogu_P2107小Z的AK計劃
清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不 ...
- A. Arena of Greed 解析(思維)
Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...
- E. Almost Regular Bracket Sequence 解析(思維)
Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...
- C2. Power Transmission (Hard Edition) 解析(思維、幾何)
Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...
- F. Moving Points 解析(思維、離散化、BIT、前綴和)
Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...
随机推荐
- 为什么rand和srand总是同时出现?
如果没有srand,那么rand在我电脑上运行每次返回的随机数是一样的.如果如果先调用srand,而且srand的参数不一样,那么最后产生的随机数就会不一样?那怎么然srand的参数是不一样的呢? 是 ...
- 数组 array 矩阵 list 数据框 dataframe
转自 : http://blog.csdn.net/u011253874/article/details/43115447 <span style="font-size:14px;& ...
- Luogu 3957 [NOIP2017]普及组 跳房子
写了好久,感觉自己好菜,唉…… 首先发现这个$g$的取值具有单调性,可以想到二分答案,然后考虑用$dp$来检验,这样子可以写出朴素的转移方程: 设$f_i$表示以$i$结尾的最大价值,那么有$f_i ...
- App测试从入门到精通之功能测试
App的功能测试指的是针对软件需求以及用户要求针对APP功能进行测试.简单点理解就是保证App功能的正确性,不要系统出现Bug.让用户用户的舒服,用的爽!好了,我们看下关于App的功能测试要点有哪些? ...
- java IO Nio 文件拷贝工具类Files
public static void main(String[] args) throws Exception { Files.copy(Paths.get("file/text.txt&q ...
- 20169219《移动平台开发实践》移动APP设计应该考虑到的问题
1.开发流程包括: (1)用户需求分析 (2)产品原型设计 (3)UI视觉设计 (4)APP开发 (5)项目测试 (6)发布 App开发经过UI设计完成之后,便会进入开发阶段. (1)服务器端:编写接 ...
- win32的计数增减操作的原子操作--InterLockedIncrement和InterlockedDecrement
InterLockedIncrement and InterLockedDecrement 实现数的原子性加减. 什么是原子性的加减呢? 举个例子:如果一个变量 Long value =0; 首先说一 ...
- 使用JS完成首页定时弹出广告图片
一.需求分析 在首页中的顶部做一个定时弹出广告图片. 二.技术分析 隐藏图片: display: none 定时操作: setInterval(“显示图片的函数”, 3000); 三.代 ...
- angular 输入属性
import { Component, OnInit, Input } from '@angular/core'; @Component({ selector: 'app-order', templa ...
- javascript framework js常用框架
js常用框架 一.node.js 二.angularjs.js 三.react.js 四.webpack.js 五.flux.js 六.vue.js 七.bootstrap ...