首页 > 其他分享 >Codeforces Round 967 (Div. 2)-D

Codeforces Round 967 (Div. 2)-D

时间:2024-08-22 14:39:26浏览次数:10  
标签:967 int 元素 Codeforces pos 序列 Div 字典

Codeforces Round 967 (Div. 2)-D

这些天在留校集训……我之前空余时间在看模电,最近在玩黑猴……九月开学了估计也不能闲下来……但这个博客我还是会抽空更新的╰(°▽°)╯

Problem - D - Codeforces

虽然代码写得特别丑陋,但好歹是我完全想的思路——自己还de了一天bug(゜ー゜

从上午十点开始看题到下午1点过,一直在想思路和可行的方法,期间也考虑过主席树(发现不会),最后还是用回了朴实无华万能的双指针……然后就是debug到了今天早上才过……

分析

题中要求从给出的序列中选出一个长度最长同时在奇数位为负的情况下字典序最小无重复元素子序列

首先,要长度最长又没有重复元素,合法子序列一定是原序列中所有出现过的数的排列,再考虑字典序最小,容易想到要奇数位字典序尽量大、偶数位字典序尽量小,这里为什么要说"尽量"?因为要满足子序列不能乱序且选到原序列中的所有元素,为了方便思考,我们把问题简化一下,考虑如何选到长度最长的字典序最大的无重复子序列

对于 $ 2\ 1\ 3 $ 我们发现合法子序列只能是 $ 2\ 1\ 3 $ ,再考虑有一个重复元素的情况,对于 $ 3\ 2\ 1\ 3 $ 这时的合法子序列是 $ 3\ 2\ 1 $ ,有两个重复元素的情况—— $ 2\ 3\ 2\ 1\ 3 $ ,合法子序列还是 $ 3\ 2\ 1 $ ,考虑每一个元素,我们选了的话就只能选这个元素以后的元素,设这个元素的位置pos,也就是说[pos,n]内要包含所有我们还未选的元素,因此这个显然唯一元素是必选的

代码

void solve(){
    int n;cin>>n;
    vector<int>a(n+1),ans;
    map<int,int>mp;
    rep(i,1,n) cin>>a[i],mp[a[i]]++;
    priority_queue<pair<int,int>>q,_q;
    int sz=mp.size();
    auto erase=[&](int idx)->void{
        while(q.size()&&(-q.top().second<idx||mp[q.top().first]==0)){
            q.pop();
        }
        while(_q.size()&&(-_q.top().second<idx||mp[-_q.top().first]==0)){
            _q.pop();
        } 
    };
    int pos=1,i=1,j=1;
    while(i<=n&&j<=n){
        while(j<=n){
            if(mp[a[j]]==0){
                j++;
            }
            else if(mp[a[j]]==1){
                q.push({a[j],-j});
                _q.push({-a[j],-j});
                break;                
            }
            else{
                mp[a[j]]--;
                q.push({a[j],-j});
                _q.push({-a[j],-j});
                j++;
            }
        }    
        if(j>n) break;
        int st1=-q.top().second,st2=-_q.top().second;
        int mx=a[st1],mi=a[st2];
        if(pos&1){
            i=st1+1;
            mp[mx]=0;
        }
        else{
            i=st2+1;
            mp[mi]=0;
        }
        pos++;
        erase(i);       
        ans.push_back(a[i-1]);
    }
    cout<<ans.size()<<"\n";
    for(auto i:ans) cout<<i<<" ";
    cout<<"\n";
}

标签:967,int,元素,Codeforces,pos,序列,Div,字典
From: https://www.cnblogs.com/mono-4/p/18373798

相关文章

  • Codeforces Round 967 (Div. 2)
    题不难。A.MakeAllEqual题意:一个圆,上面有\(n\)个数,每次可以删去相邻的两个不同数中任意一个,求至少几次使得剩下的数都一样。显然下界是出现次数最多的数且一定能取到,时间复杂度\(O(n)\)。提交记录B.GeneratePermutation题意:要求构造一个排列,使得\(x\)所在位置大......
  • CF 2001 E2 solution (967 Div.2)
    CF2001E2由于对称,所以设\(heap[u]\)为两次确定堆,且第一次弹出的是\(u\),\(heap[u,v]\)是第一次\(u\),第二次\(v\)则答案就是\(\sumheap[u]=2^{n-1}·heap[x]\)其中\(x\)任意。不妨我们考虑第一次都是从第一个叶子弹出,那么对于其他不同的第二个弹出的点,根据对称性......
  • 题解:Codeforces Round 967 (Div. 2) B [思维/构造]
    B.GeneratePermutationtimelimitpertest:1.5secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputThereisanintegersequence\(a\)oflength\(n\),whereeachelementisinitially\(-1\).Misukihastwoty......
  • Divisiblity of Difference
    题目传送门思路首先得知道个性质,即若$a\bmodb=c\bmodb$,那么$(a-c)\bmodb=0$,因为余数在$(a-c)$中被减掉了。于是我们可以把所有余数相同的$a_i$丢进一个vector里,之后再看余数相同的$a_i$的数量有没有$\gek$,有的话就输出前$k$个数,没有就输出No。代码#i......
  • Codeforces Round 966 (Div. 3)
    A.PrimaryTask#include<bits/stdc++.h>usingnamespacestd;usingvi=vector<int>;voidsolve(){strings;cin>>s;if(s.size()<=2){cout<<"NO\n";return;}if(s[0]!......
  • 题解:Codeforces Round 967 (Div. 2) [暴力/贪心]
    A.MakeAllEqualtimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenacyclicarray\(a_1,a_2,\ldots,a_n\).Youcanperformthefollowingoperationon\(a\)atmost\(n-......
  • Codeforces Round 967 (Div. 2) C题 类分治解法
    废话不多说,先上代码t=int(input())whilet>0:n=int(input())pre_d={1:[iforiinrange(2,n+1)]}pair_l=[]whilelen(pre_d)!=0:item=pre_d.items()now_d={}fork,vinitem:forii......
  • Codeforces Round 967 (Div. 2)
    A.MakeAllEqual题意:给定n个数每次可以选2个相邻的数,并且前面的数不能比后面的数大,并且删除其中的一个。这个数组是循环数组,最后一个数是第一个数的前一个数。问最少操作多少次,可以让剩下的数全都相等。思路:红黑树+一次遍历,记录出现次数最多的数,剩下的数全部删掉即可。总结:看......
  • CodeForces 360D Levko and Sets
    洛谷传送门CF传送门求出\(p\)的原根\(g\),对每个\(a_i\)求出一个\(x_i\)表示\(g^{x_i}\equiva_i\pmod{p}\)(这部分可以BSGS)。之后的表述中\(a_i\)指\(x_i\)。那么集合生成方式相当于初始\(c=0\),每次让\(c\gets(c+a_ib_j)\bmod(p-1)\)。根据裴蜀定......
  • 【LGR-196-Div.4】洛谷入门赛 #26 题A - H 详细题解--优化思路简洁代码(C++,Python语
    前言:    觉得这个比赛很有意思的,都是暴力题,涉及一些细节,难度比较适合刚学编程语言的,可以很好的锻炼基础还有手速,最后两题也是比较有意思,之后也准备更新atc的比赛题解和洛谷的一些高质量比赛题解(算法网瘾就是想参加各种比赛)   如果觉得有帮助,或者觉得我写的好,......