Codeforces Round 967 (Div. 2) D. Longest Max Min Subsequence

假設我們要選a[j]為答案數組b[i],從i從1~m(m為a數組中不同數的個數)

建立一個suf數組,代表以i開頭的后綴有多少個不同且在b[1~i-1]中未出現過的的個數,預處理suf,發現后續我們怎么選數改變suf,suf都始終單調不遞增,我們選擇的j位置滿足suf[j]>=m-i+1。那么枚舉b的每個位置,二分每個位置找出j的范圍即可。在這個范圍內我們奇數選最大,偶數選最小。難點在于

1.每選擇一個數,suf如何改變。選擇的這個數的最后一個位置之前的所有的suf-1,這個我們用線段樹模擬每個位置減去的數,二分時減去這個值即可。

2.數不能選重復。每選定一個數,把這個數出現的所有位置包含的線段樹的點的最大值改為最小,最小值改為最大,保證不可能再選。

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N=3e5+10;
int T,n,m,a[N],suf[N],wz[N];
struct node{int l,r,val,jian,maxx,max_pos,minn,min_pos;
}t[N*4];
struct nod{int zb,qz;
};
void init()
{
}
void build(int p,int l,int r)
{t[p].l=l,t[p].r=r;t[p].jian=0;if(l==r){t[p].val=suf[l];t[p].maxx=t[p].minn=a[l];t[p].max_pos=t[p].min_pos=l;return ;}int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);if(t[p*2].maxx>=t[p*2+1].maxx){t[p].maxx=t[p*2].maxx;t[p].max_pos=t[p*2].max_pos;}else{t[p].maxx=t[p*2+1].maxx;t[p].max_pos=t[p*2+1].max_pos;}if(t[p*2].minn<=t[p*2+1].minn){t[p].minn=t[p*2].minn;t[p].min_pos=t[p*2].min_pos;}else{t[p].minn=t[p*2+1].minn;t[p].min_pos=t[p*2+1].min_pos;}
}
int ask(int p,int x)
{if(t[p].l==t[p].r) return t[p].jian;int mid=(t[p].l+t[p].r)/2;if(x<=mid) return t[p].jian+ask(p*2,x);else return t[p].jian+ask(p*2+1,x);
}
void change(int p,int l,int r)
{if(t[p].l>=l&&t[p].r<=r) {t[p].jian+=1; return ;}int mid=(t[p].l+t[p].r)/2;if(l<=mid) change(p*2,l,r);if(r>mid) change(p*2+1,l,r);
}
nod ask1(int p,int l,int r)
{nod tmp,tmp1;tmp.qz=0;if(t[p].l>=l&&t[p].r<=r){tmp.zb=t[p].max_pos;tmp.qz=t[p].maxx;return tmp;}int mid=(t[p].l+t[p].r)/2;if(l<=mid) tmp=ask1(p*2,l,r);if(r>mid){tmp1=ask1(p*2+1,l,r);if(tmp1.qz>tmp.qz) return tmp1;}return tmp;
}
nod ask2(int p,int l,int r)
{nod tmp,tmp1;tmp.qz=1e9;if(t[p].l>=l&&t[p].r<=r){tmp.zb=t[p].min_pos;tmp.qz=t[p].minn;return tmp;}int mid=(t[p].l+t[p].r)/2;if(l<=mid) tmp=ask2(p*2,l,r);if(r>mid){tmp1=ask2(p*2+1,l,r);if(tmp1.qz<tmp.qz) return tmp1;}return tmp;
}
void change1(int p,int k)
{if(t[p].l==t[p].r) {t[p].maxx=0; t[p].minn=1e9; return ;}int mid=(t[p].l+t[p].r)/2;if(k<=mid) change1(p*2,k);else change1(p*2+1,k);if(t[p*2].maxx>=t[p*2+1].maxx){t[p].maxx=t[p*2].maxx;t[p].max_pos=t[p*2].max_pos;}else{t[p].maxx=t[p*2+1].maxx;t[p].max_pos=t[p*2+1].max_pos;}if(t[p*2].minn<=t[p*2+1].minn){t[p].minn=t[p*2].minn;t[p].min_pos=t[p*2].min_pos;}else{t[p].minn=t[p*2+1].minn;t[p].min_pos=t[p*2+1].min_pos;}
}
void solve()
{cin>>n;init();vector<int> c[n+2];for(int i=1;i<=n;i++){cin>>a[i];c[a[i]].emplace_back(i);}suf[n+1]=a[n+1]=0;map<int,int> b;for(int i=n;i>=1;i--){suf[i]=suf[i+1];if(!b[a[i]]){b[a[i]]=1;suf[i]++;wz[a[i]]=i;}}m=suf[1];build(1,1,n+1);vector<int> ans;int last=0;for(int i=1;i<=m;i++){int l=1,r=n+1,pos;while(l<=r){int mid=(l+r)/2;if(suf[mid]-ask(1,mid)<m-i+1) {pos=mid; r=mid-1;}else l=mid+1;}pos--;int poss;if(i&1) poss=ask1(1,last+1,pos).zb;else poss=ask2(1,last+1,pos).zb;ans.emplace_back(a[poss]);change(1,1,wz[a[poss]]);last=poss;for(int j:c[a[poss]])change1(1,j);}cout<<ans.size()<<endl;for(auto i : ans)cout<<i<<" ";cout<<endl;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie();cin>>T;while(T--) solve();
}

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

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

相關文章

Linux運維新手的修煉手扎之第27天

mysql服務1 主從復制集群&#xff1a;多主機集群【復制】負載過大解決方案&#xff1a;橫向擴展[增加服務器節點分散負載]、縱向擴展[提升單機硬件性能]復制工作原理&#xff1a;前提&#xff1a;基礎數據一樣&#xff0c;主節點上有同步數據用的賬號主角色【二進制日志、binlo…

【Linux】Linux增刪改查命令大全(附頻率評級)

Linux增刪改查命令大全&#xff08;附頻率評級&#xff09;* 《Linux命令全景手冊&#xff1a;增刪改查全場景解析&#xff08;含136個高頻命令&#xff09;》 按使用頻率★分級 | 測試/運維/開發均適用 | 附思維導圖下載一、命令全景表&#xff08;增刪改查頻率評級&#xff0…

SwiftUI 登錄頁面鍵盤約束沖突與卡頓優化全攻略

網羅開發&#xff08;小紅書、快手、視頻號同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

建筑物實例分割數據集-9,700 張圖片 城市規劃與發展 災害評估與應急響應 房地產市場分析 智慧城市管理 地理信息系統(GIS) 環境影響評估

建筑物實例分割數據集-9,700 張圖片&#x1f4e6; 已發布目標檢測數據集合集&#xff08;持續更新&#xff09;&#x1f3e2; 建筑物實例分割數據集介紹&#x1f4cc; 數據集概覽包含類別&#x1f3af; 應用場景&#x1f5bc; 數據樣本展示使用建議&#x1f31f; 數據集特色&am…

LeetCode 刷題【36. 有效的數獨】

36. 有效的數獨 自己做 解&#xff1a;多層for class Solution { public:bool isValidSudoku(vector<vector<char>>& board) {int hight board.size(); //長if (hight 0)return true;int wide board[0].size(); //寬//判斷一行是否出現重復bool…

Java 日志從入門到精通:告別日志混亂

作為一名 Java 開發者&#xff0c;你是否曾在生產環境故障排查時面對過這樣的困境&#xff1a;系統報錯卻找不到關鍵日志&#xff0c;日志文件大到無法打開&#xff0c;或者日志內容雜亂無章根本無法定位問題&#xff1f;日志作為系統運行的 “黑匣子”&#xff0c;其重要性不言…

系統開發 Day1

前端開發 目的&#xff1a; 開發一個平臺&#xff08;網站&#xff09; - 前端開發&#xff1a;HTML CSS JavaScript - web框架&#xff1a;接受請求和處理 - MySQL數據庫&#xff1a;存儲數據的地方快速上手&#xff1a;基于Flask Web框架快速搭建一個網站 深度學習&#xff…

機器視覺任務(目標檢測、實例分割、姿態估計、多目標跟蹤、單目標跟蹤、圖像分類、單目深度估計)常用算法及公開數據集分享

本文按目標檢測、實例分割、姿態估計、多目標跟蹤、單目標跟蹤、圖像分類、單目深度估計七個任務分類&#xff0c;融合數據集介紹、評價指標及推薦算法&#xff0c;方便查閱&#xff1a; 一、目標檢測 目標檢測任務需定位圖像中目標的邊界框&#xff08;bounding box&#xff0…

MongoTemplate中setOnInsert與set方法的深度解析

MongoTemplate中setOnInsert與set方法的深度解析 在Spring Data MongoDB的MongoTemplate中&#xff0c;setOnInsert和set方法都是在更新文檔時使用的&#xff0c;但它們在處理upsert操作&#xff08;即&#xff0c;如果文檔不存在則插入&#xff0c;存在則更新&#xff09;時扮…

利用OJ判題的多語言優雅解耦方法深入體會模板方法模式、策略模式、工廠模式的妙用

在線評測系統&#xff08;Online Judge, OJ&#xff09;的核心是判題引擎&#xff0c;其關鍵挑戰在于如何高效、安全且可擴展地支持多種編程語言。在博主的項目練習過程中&#xff0c;借鑒了相關設計模式實現一種架構設計方案&#xff0c;即通過組合運用模板方法、策略、工廠等…

[FOC電機控制]霍爾傳感器于角度問題

如果電機有1對極(p1&#xff0c;那么每旋轉一圈的機械角度&#xff0c;電氣角度會轉動一圈&#xff08;360&#xff09;。如果電機有2對極(p2&#xff0c;那么每旋轉一圈的機械角度&#xff0c;電氣角度會轉動兩圈&#xff08;720&#xff09;。

阿里云 Flink

阿里云 Flink 是阿里云基于Apache Flink打造的企業級實時計算平臺&#xff0c;旨在為用戶提供高效、穩定、易用的流處理與批處理能力&#xff0c;幫助企業快速構建實時數據處理鏈路&#xff0c;支撐實時業務決策。核心特性流批一體計算繼承 Apache Flink “流批一體” 的核心優…

企業級高性能web服務器

1 web服務基礎 1.1 正常情況的單次web服務訪問流程&#xff1a; 正常情況下&#xff0c;單次 Web 服務訪問流程從用戶在客戶端發起請求開始&#xff0c;到最終在客戶端展示內容結束&#xff0c;涉及客戶端、網絡傳輸、服務器端等多個環節&#xff0c;以下是詳細過程&#xff…

免費PDF編輯軟件 pdf24-creator 及其安裝包

最近發現了一款還算是不錯的PDF編輯和閱讀軟件 pdf24-creator&#xff0c;官方下載網站為&#xff1a;https://tools.pdf24.org/zh/creator&#xff0c;但是官方下載如果沒有魔法的話&#xff0c;下載速度很慢&#xff0c;比百度網盤下載還滿&#xff0c;因此我把它分享到網盤。…

openvela之ADB

ADB&#xff08;Android Debug Bridge&#xff09;是一款功能豐富的命令行工具&#xff0c;旨在實現開發工作站與設備&#xff08;如模擬器、實體設備&#xff09;之間的通信。通過 ADB&#xff0c;開發者可以便捷地在設備上執行命令、傳輸文件、調試應用等。本文將詳細介紹 AD…

如何控制需求交付節奏

有效控制需求的交付節奏&#xff0c;其核心在于將產品開發過程從一個不可預測的、時快時慢的混亂狀態&#xff0c;轉變為一套產出穩定、流程順暢、步調可持續的系統化交付機制。要成功構建這套機制&#xff0c;實現有節奏的價值交付&#xff0c;必須綜合運用五大關鍵策略&#…

匯編中常用寄存器介紹

X86-32位寄存器 4個數據寄存器&#xff1a;EAX、EBX、ECX和EDX; 2個變址和指針寄存器&#xff1a;ESI和EDI; 2個指針寄存器&#xff1a;ESP和EBP; 1個指令指針寄存器&#xff1a;EIP; 6個段寄存器&#xff1a;ES、CS、SS、DS、FS和GS; 1個標志寄存器&#xff1a;EFlags。 在X8…

SOMGAN:用自組織映射改善GAN的模式探索能力

論文信息 論文題目:Improving mode exploring capability ofgenerative adversarial nets by self-organizing map(利用自組織映射提高生成對抗網絡的模式探索能力) 期刊:Neurocomputing 摘要:生成對抗網絡(GANs)的出現將生成模型的研究推向了一個新的高潮。支持這一進步…

《匯編語言:基于X86處理器》第12章 復習題和練習

本篇記錄了《匯編語言&#xff1a;基于X86處理器》第12章 復習題和練習的筆記。12.6復習題和練習12.6.1 簡答題1.假設有二進制浮點數1101.01101&#xff0c;如何將其表示為十進制分數之和?答&#xff1a;1101.01101(1x)(1x)(0x)(1x)(0x)(1x)(1x)(1x)(1x) 13.406252.為什么十進…

ApacheCon Asia 2025 中國開源年度報告:Apache Doris 國內第一

上周剛落下帷幕的 ApacheCon Asia 2025 中&#xff0c;一個數據讓所有人都為之震撼&#xff1a;全球 Apache 基金會項目 OpenRank 排行榜中&#xff0c;Apache Doris 位居第二&#xff0c;在中國 Apache 項目中更是穩居第一。 這個排名意味著什么&#xff1f;在 Apache 基金會管…