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的題目更容易 ...
随机推荐
- 一步一步带你构建第一个 Laravel 项目
参考链接:https://laravel-news.com/your-first-laravel-application 简介 按照以下的步骤,你会创建一个简易的链接分享网站. 安装 Laravel ...
- 《the art of software testing》第四章 测试用例的设计
白盒测试 逻辑覆盖测试: 逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术.它属白盒测试.白盒测试的测试方法有代码检查法.静态结构分析法.静态质量度量法.逻辑覆盖法.基本路径测试法.域测试.符 ...
- [GO]局部变量的特点
package main import "fmt" func main() { //定义在{}里的变量就是局部变量,只能在{}里起作用 //作用域,变量起作用的范围 //执行到定义 ...
- javascript总结7:算术运算符
1 运算符: 加号+ 如果是数字类型的变量相加,那么结果为数字类型; 如果是非数字类型的变量相加,结果为字符串类型 2 减号- 如果是非数字类型的变量相减结果为 NaN 3 乘号 * 如果是非数 ...
- 编写高质量代码改善C#程序的157个建议——建议30:使用LINQ取代集合中的比较器和迭代器
建议30:使用LINQ取代集合中的比较器和迭代器 LINQ提供了类似于SQL的语法来实现遍历.筛选与投影集合的功能. static void Main(string[] args) { List< ...
- 编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组
建议16:元素数量可变的情况下不应使用数组 在C#中,数组一旦被创建,长度就不能改变.如果我们需要一个动态且可变长度的集合,就应该使用ArrayList或List<T>来创建. 而数组本身 ...
- 【Head First Java 读书笔记】(一)基本概念
Java的工作方式 你要做的事情就是会编写源代码 Java的程序结构 类存于源文件里面 方法存在类中 语句存于方法中 剖析类 当Java虚拟机启动执行时,它会寻找你在命令列中所指定的类,然后它会锁定像 ...
- Linq to SQL Like Operator
As a response for customer's question, I decided to write about using Like Operator in Linq to SQL q ...
- 百度离线地图API开发V2.0版本
全面介绍,请看下列介绍地址,改写目前最新版本的百度V2.0地图,已全面实现离线操作,能到达在线功能的95%以上 http://api.jjszd.com:8081/apituiguang/gistg. ...
- 异常:已捕获: "Error creating context 'spring.root': 未将对象引用设置到对象的实例。" (System.Configuration.ConfigurationErrorsException) 捕获到一个 System.Configuration.ConfigurationErrorsException: "Error creating context 'sp
查看所指定name的context是否注册成功,以后用此容器来获取其中的object. 常见的使用方式: Application_Start中使用ContextRegistry.GetContext( ...