首页 > 其他分享 >Codeforces Round #852 (Div. 2)(C,D)

Codeforces Round #852 (Div. 2)(C,D)

时间:2023-02-13 15:46:25浏览次数:48  
标签:852 int Codeforces long maxn Div include mex

Codeforces Round #852 (Div. 2)(C,D)

B

这个题大意是给你一个\(x\),\(y\),\(x\)是极大值(\(a_i>a_{i+1},a_i>a_{i+1}\))的和,

\(y\)是极小值(\(a_i<a_{i+1},a_i<a_{i+1}\))的和

然后还告诉我们每两个相邻的数相差\(1\),\(a_1\)和\(a_2\)和\(a_n\)

我们要求最短的一个数组满足这个和的条件

案例给出我们这个和是由多个数组成,其实这个也可以由一个数组成,那么我们只需要构造一个最高点\(x\),最低点\(y\),这样也是最短长度,其实我们不太需要考虑这么多,\(cf\)其实很多套路的

然后我直接构造即可

其实这次的\(B\)我还想了好久,看了题目案例,还以为需要考虑很多,想多了

C

C

这个题的大意是给你一个数组,我们有一个要求得到一对\(l\),\(r\),要求在\([l,r]\)这一段的数,其中所有的数的最大值和最小值不在两端,在中间,问有多少对这样的\(l\),\(r\)

我第一印象就是直接求,枚举\(l\)从\(1\)开始,\(r\)从\(n\)开始,\(l\)向右移动,\(r\)向左移动,如果满足条件就输出答案

#include <iostream>
using namespace std;
const int maxn=2e5+10;
#define int long long 
int t;
int n;
int a[maxn];
void solve()
{
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    if (n<=2)
    {
        cout<<-1<<'\n';
        return ;
    }
    int step=1;
    int l=1,r=n;
    int mi=1,mx=n;
    while (l<r)
    {
        int ll=l,rr=r;
        while (a[l]==mi&&l<r)//只能一个一个移动,可能中间会出现可能的情况
        {
            l++;
            mi++;
        }
        while (a[l]==mx&&l<r)
        {
            l++;
            mx--;
        }
        while (a[r]==mi&&l<r)
        {
            r--;
            mi++;
        }
        while  (a[r]==mx&&l<r)
        {
           r--;
           mx--;
        }
        if (l==ll&&r==rr) break;//这个就是l,r上不是最小值
    }
    if (r-l<=1) cout<<-1<<'\n';//不可以是两个相邻或者是长度为1的
    else cout<<l<<" "<<r<<"\n";
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

D

D

这个题大意还是求\([l,r]\)这一段的\(p\)和\(q\)的\(mex\)是一样的的数量

我们只需要列举每一个\(mex\)的值,然后对于每一种\(mex\)的\(l\)和\(r\)都会有一个范围,然后直接求即可

具体看代码

#include <iostream>
#include <cmath>
using namespace std;
const int maxn=2e5+10;
#define int long long 
int t,p[maxn],q[maxn],invp[maxn],invq[maxn],n;
void solve()
{
    int ans=0;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>p[i];
        invp[p[i]]=i;
    }
    for (int i=1;i<=n;i++)
    {
        cin>>q[i];
        invq[q[i]]=i;
    }
    int maxl=n+1,minr=0;
    for (int mex=2;mex<=n+1;mex++)
    {
        minr=max(minr,max(invp[mex-1],invq[mex-1]));//r至少也要包括[1,mex-1]的数
        maxl=min(maxl,min(invp[mex-1],invq[mex-1]));//l最大l是最小的那一个mex-1的位置,那么这个l,r的范围里面一定有[1,mex-1](p和q里面)
        int maxr=n,minl=1;
        if (mex<=n)
        {
            if (invp[mex]<maxl)
            {
                minl=max(minl,invp[mex]+1);//在后面一个,不可选mex
            }
            else 
            {
                maxr=min(maxr,invp[mex]-1);//在前面面一个,不可选mex
            }
            if (invq[mex]<maxl)
            {
                minl=max(minl,invq[mex]+1);
            }
            else
            {
                maxr=min(maxr,invq[mex]-1);
            }
        }
        if (minl<=maxl&&minr<=maxr)
        {
            ans+=(maxl-minl+1)*(maxr-minr+1);
        }
    }
    int len=min(invp[1],invq[1])-1;//这个是mex=1的情况
    ans+=len*(len+1)/2;
    len=n-max(invp[1],invq[1]);
    ans+=len*(len+1)/2;
    len=abs(invp[1]-invq[1])-1;
    ans+=len*(len+1)/2;
    cout<<ans<<'\n';
    return ;
}
signed main ()
{
    int t=1;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

标签:852,int,Codeforces,long,maxn,Div,include,mex
From: https://www.cnblogs.com/righting/p/17116578.html

相关文章

  • Codeforces Round #852 (Div. 2)
    F.Rebrending题目抽象为现有长度为\(n\)的数组\(a_1,a_2,\cdots,a_n\),\(m\)次询问,每次询问\(\min\limits_{l\lei,j\ler,i\neqj}|a_i-a_j|\)\((1\lel<r\len)......
  • #0033. Educational Codeforces Round 3
    609A贪心优先选大的USBflashdrive609B先处理每个genre的书有多少本,然后直接枚举每次购买的是哪两种genre然后乘法原理即刻609C手下考虑balanced的长啥样。假设这n......
  • #0032. Educational Codeforces Round 2
    600A简单题但有个坑点在于会有空字符串600B一道可以用来实验upper_bound的题600C挺有趣的一道题。首先考虑怎样的字符串可以通过permutation变成palindrome:条件是至......
  • 自动生成div
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Docu......
  • Codeforces Round #852 (Div. 2)
    A.YetAnotherPromotion题意:买土豆,一种卖a元一公斤,买m公斤送一公斤;一种卖b元一公斤。求买n公斤土豆最少花多少钱。解:完全没有思考,把a*n,b*n,买尽可能多m倍数的土豆剩......
  • Codeforces Round #851 (Div. 2)-F. XOR, Tree, and Queries-树、异或、并查集
    题目:https://codeforces.com/contest/1788/problem/F题解:(首先他和线性基没什么瓜系)想这个问题大概可以分成几个部分:1、很自然地考虑记\(p_x\)表示从根节点走到x路径......
  • Codeforces Round #851 (Div. 2) D
    链接:https://codeforces.com/contest/1788/problem/D题意:数轴上有n个点,每个点会以相同的v向最近的点移动(若左右距离相等则向左),两点相遇则暂停,问最终数轴上剩下的点数即为......
  • Codeforces Round #547 (Div. 3) F2. Same Sum Blocks (贪心——最多不重叠区间数量
    题目https://codeforces.com/problemset/problem/1141/F2题意忽略;给出一个数组,求和相等的,不重叠子串的最大数量,并输出(题目有点绕)思路先求出数组前缀和,然后找出......
  • div、td 、p 等容器内强制换行和不换行的方法
    转载自:http://www.divcss5.com/html/h50327.shtml1、强制不换行,同时以省略号结尾。<divstyle="width:100px;overflow:hidden;white-space:nowrap;text-overflow:ellipsi......
  • Codeforces Round #851 (Div. 2) A-E
    比赛链接A题意给一串只包含\(1,2\)的数,找到最小的\(k\)使得\(\prod_{i=1}^ka_i=\prod_{i=k+1}^na_i\)。题解知识点:枚举。因为只有\(1,2\),所以考虑左右两......