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的題目更容易 ...
随机推荐
- “Device eth0 has different MAC address than expected, ignoring.”问题
配IP后进行激活的时候提示如下错误:("Device eth0 has different MAC address than expected, ignoring.") 百度了下, ...
- 11.BETWEEN 操作符
BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围. BETWEEN 操作符 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围.这些值可以是数值 ...
- 5.WHERE 子句
WHERE 子句用于规定选择的标准. WHERE 子句 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句. 语法 SELECT 列名称 FROM 表名称 WHERE 列 运 ...
- p2148 [SDOI2009]E&D
传送门 分析 https://www.luogu.org/blog/flashblog/solution-p2148 代码 #include<bits/stdc++.h> using na ...
- C#中GUID的生成格式(Guid.ToString方法 )
GUID 是微软对UUID这个标准的实现.UUID是由开放软件基金会(OSF)定义的.UUID还有其它各种实现,不止GUID一种 public string ToString( string ...
- HDU 3365 New Ground (计算几何)
题意:给定点A[0~n-1]和B[0],B[1],A[0].A[1]映射到B[0].B[1],求出其余点的映射B[2]~B[n-1]. 析:运用复数类,关键是用模板复数类,一直编译不过,我明明能编译过 ...
- up6-chrome 45+安装教程
up6-Chrome 45+安装说明 说明:只需要安装up6.exe即可,up6.exe为插件集成安装包. 1.以管理员身份运行up6.exe.up6.exe中已经集成Chrome 45插件.
- Java IO流的回顾与梳理(必记必会必写)
- Android 学习笔记 文本文件的读写操作
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- 全新的membership框架Asp.net Identity
在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp.net Identity. 每一次改 ...