//為什麼我的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 思維+貪心的更多相关文章

  1. F2. Same Sum Blocks (Hard) 解析(思維、前綴和、貪心)

    Codeforce 1141 F2. Same Sum Blocks (Hard) 解析(思維.前綴和.貪心) 今天我們來看看CF1141F2(Hard) 題目連結 題目 給你一個數列\(a\),要你 ...

  2. D. Maximum Distributed Tree 解析(思維、DFS、組合、貪心、DP)

    Codeforce 1401 D. Maximum Distributed Tree 解析(思維.DFS.組合.貪心.DP) 今天我們來看看CF1401D 題目連結 題目 直接看原題比較清楚,略. 前 ...

  3. bzoj 1034: [ZJOI2008]泡泡堂BNB 貪心

    1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1398  Solved: 727[Submit][Sta ...

  4. 邁向IT專家成功之路的三十則鐵律 鐵律十:IT人思維之道-跳脫框架

    莊子的哲學思想歸本於老子,他認為人要解脫束縛必須做到不從任何的角度與任何的時間來看待事物,而是必須與天地同體,然而也唯有如此才能看清宇宙間萬事萬理的真諦.無論是莊子還是老子,他們畢竟是中國古代的聖賢, ...

  5. [題解](貪心/堆)luogu_P2107小Z的AK計劃

    清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不 ...

  6. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  7. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  8. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  9. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

随机推荐

  1. 10. Regular Expression Matching字符串.*匹配

    [抄题]: Given an input string (s) and a pattern (p), implement regular expression matching with suppor ...

  2. 一个虚拟机网络的XML描述

    <?xml version="1.0" encoding="utf-8"?> <VNET> <ID>1</ID> ...

  3. 面试题:Java必知必会:异常机制详解 背1

    一.Java异常概述 在Java中,所有的事件都能由类描述,Java中的异常就是由java.lang包下的异常类描述的. Trowable是所有异常的超类.  他的常用方法printStackTrec ...

  4. Hyperledger Fabric Transaction Proposal过程

    客户端将交易预提案(Transaction Proposal)通过 gRPC 发送给支持 Endorser 角色的 Peer 进行背书. 这些交易提案可能包括链码的安装.实例化.升级.调用.查询:以及 ...

  5. Win7怎么进入安全模式 三种轻松进入Win7安全模式方法

    发布时间:2013-05-27 11:23 作者:电脑百事网原创 来源:www.pc841.com 13783次阅读 win7的安全模式和XP如出一辙,在安全模式里我们可以删除顽固文件.查杀病毒.解除 ...

  6. 编写高质量代码改善C#程序的157个建议——建议36:使用FCL中的委托声明

    建议36:使用FCL中的委托声明 FCL中存在3类这样的委托声明,它们分别是:Action.Func.Predicate.尤其是在它们的泛型版本出来以后,已经能够满足我们在实际编码过程中的大部分需求. ...

  7. linq to sql 实现左(右)连接,那个方法是对的,该怎么处理

    linq to sql 实现左(右)连接,那个方法是对的var query2 = from tb0 in db.table_0  join tb1 in db.table_1 on table_0.关 ...

  8. ajax 判断账户密码 调取数据模糊查询 时钟

    一.判断账户密码 <Login.html> <head> <meta http-equiv="Content-Type" content=" ...

  9. sqlserver中 多条数据合并成一条数据 (stuff 与 for xml path 连用)

    SQL 列转行,即多行合并成一条   需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district ...

  10. 十一、Node.js监听代码改动自动重启node插件supervisor

    我们慢慢地发现,每次我们稍微改变js代码都需要重启服务才能在浏览器显示新的效果,很麻烦,这里我们可以通过npm命令安装supervisoror插件,安装方法如下 之前章节我们知道安装了nodejs就会 ...