首页 > 其他分享 >Codeforces Round #828 (Div. 3) F

Codeforces Round #828 (Div. 3) F

时间:2022-11-28 01:33:13浏览次数:33  
标签:int Codeforces len pos 枚举 828 Div now 我们

F. MEX vs MED

一开始写了个感觉每个点只会搞一次的那种线性 感性理解了很对 结果又wa又t

int left=l-z-1,right=n-r;
            int cnt=2*now;
            for(int len=min(n-z,cnt);len>=r-l+1;len--)
                ans+=min({left,right,len-(r-l+1),right+left+r-l+1-(len)})+1;
            for(int i=z;i<l;i++)s.erase(a[i]);
            l=z;
            now=*s.begin();         

现在回过头来看 我们这样枚举区间长度的话还是很容易构造出近似n2的做法

回归正题

我们发现只有mex(0,1,2...x-1)都存在一个区间内的时候 我们该区间小于x2的长度时 这时我们可以左右开始延展!
没错“延展”这个很有用途 为我们后面埋下了伏笔
但是我们这里延展的时候为了不重复计算 我们要用一个set来实时更新一下下一个阻断点
比如有时候我们现在枚举x-1完了 我们要吃掉x 但是去吃掉x的途中 我们还吃掉了x+1 x+2
这下我们下一个阻断点就必须是x+3了 这样才不会重复计算
但是我们考虑如何计算贡献
我们知道
我们给定了一个大区间 然后有个小区间在中间 让后最长不超过x
2长度
这时候其实我们直接暴力枚举即可 但是枚举的方向同x的方向
比如我们x在左我们就让l去左 这样就保证了每个点只枚举了一次!
这样就做完了
最后我们特判一下最后一个点一定是结束的时候囊括了所有数但是我们s已经empty了 所以 +1 即可

void solve(){
    int n;cin>>n;
    set<int>s;
    for(int i=1;i<n;i++)s.insert(i);
    vector<int>a(n+1),pos(n+1);
    for(int i=1;i<=n;i++)cin>>a[i],pos[a[i]]=i;
    int l=pos[0],r=pos[0],now=1;
    long long ans=0;
    while(s.size()){
        int z=pos[now];
        if(z<l){
            for(int i=z+1;i<=l;i++)
                ans+=max(0,min(2*now+i-1,n)-r+1);
            for(int i=z;i<l;i++)s.erase(a[i]);
            l=z;
            now=*s.begin();
        }else{
            for(int i=r;i<z;i++)
                ans+=max(0,l-max(i-2*now+1,1)+1);
            for(int i=r+1;i<=z;i++)s.erase(a[i]);
            r=z;
            now=*s.begin();
        }
    }
    cout<<ans+1<<endl;
}

标签:int,Codeforces,len,pos,枚举,828,Div,now,我们
From: https://www.cnblogs.com/ycllz/p/16931210.html

相关文章

  • Codeforces div2 #836
    B核心思路:这题我们会发现其实n为奇数的时候是非常好处理的。主要是n为偶数。我们不能难发现,奇数其实就是偶数的扩展情况,这里其实主要有点比较难看出123这个的关系,但是我......
  • 『题解』Codeforces 1758B XOR = Average
    Description构造一个\(a\)序列,使\(a_1\oplusa_2\oplusa_3\oplus\cdots\oplusa_n=\dfrac{sum(a)}{n}\)。Solution第一眼看到这道题,我想到的是分情况讨论。......
  • Codeforces Round #739 (Div. 3) F1
    F1.NearestBeautifulNumber(easyversion)很像网络赛北大出的那题感觉这题是简化版我们只需要把所有数都搞出来然后二分即可我们先枚举k1的情况这个很简单先枚......
  • 『题解』Codeforces 808D Array Division
    题目传送门解题思路首先统计\(n\)个数字和为\(sum\),那么一半就是\(sum=sum\div2\)从\(1\)到\(n\)枚举,累计进前缀和\(ans\)中,如果发现第\(i\)个数字累......
  • 『题解』Codeforces 1743A Password
    Problem现有\(4\)位密码,满足以下条件:给定数位的集合\(S\),密码中没有用到这些数位。密码中恰好包含两个数位,每个数位出现了两次。求符合条件的密码个数。Solution......
  • 『题解』Codeforces 1742C Stripes
    Problem在\(8\times8\)的网格上,轮流染上红色和蓝色。红色只能染一整行。蓝色只能染一整列。问最后用的是哪种颜色。Solution题目说明了至少会染一个条纹,所以我......
  • 『题解』Codeforces 1702A Round Down the Price
    题意这道题其实就是让你求出当前数字与\(10\)的整数幂次的差值(注意不能向上取,只能向下取)。而且题目也标注了\(1\lek\le9\),所以我们可以让\(i\)从\(0\sim9\)......
  • Codeforces Round #836 (Div. 2) A-D
    比赛链接A题意给一个字符串\(s\),对其加倍,即每个字符后面追加一个相同字符。加倍后可以重排列,要求构造一个回文串。题解知识点:构造。既然可以重排列了,那顺序是随意......
  • Codeforces Round #825 (Div. 2)
    A核心思路:这题的第一反应是直接统计a所有的0的数目和b所有的0的数目,然后两式相减。但是我们会发现一个问题,因为有些是可能不需要排序的,所有还有记录下a和b所有不同的个数......
  • NPC:费解的开关、sumdiv
    1、费解的开关​​https://ac.nowcoder.com/acm/contest/998/D​​题目大意:如图。分析:简单分析可知,每个开关至多点击1次,因为你同一个开关点2次又反转回来了相当于没点,而且题......