首页 > 其他分享 >[Codeforces] CF1790D Matryoshkas

[Codeforces] CF1790D Matryoshkas

时间:2023-12-10 19:22:40浏览次数:30  
标签:CF1790D int Codeforces 玩具 Matryoshkas ZYH 序列

CF1790D Matryoshkas

题意

ZYH 的玩具有很多种类,每种玩具都是一段连续的区间(如 \([3,4,5]\) )

ZYH 有很多种玩具,但是他不慎把所有玩具的元素乱序混合到了一起。例如玩具 \([1,2,3,4]\) 和玩具 \([2,3]\) 混合到一起后可能是 \([2,2,3,4,3,1]\)。

给定混合后的序列 \(a\),SA 想知道 ZYH 最初最少有多少个玩具。

思路

其实这道题就是要从一个大序列中提取若干个连续子序列(顺序可交换)

那么,首先肯定将其排序。

接着,考虑用 \(f_i\) 表示有多少个末尾为 \(i-1\) 的子序列(即,接下来需要找 \(i\) 插入这个序列)

来手玩一下样例:

最初的 \(f\) 是这样的:

i 1 2 3 4 5
\(f_i\)

首先插入 \(1\) , \(1\) 前面并没有一个串(也就是 \(f_1=0\) ,所以直接更新 \(f_2\) 为 \(1\) 即可:

i 1 2 3 4 5
\(f_i\) 1

这时插入\(2\),此时\(f_2=1\),那么说明这个\(2\)可以和以前的某个序列接上,那么现在\(f_2\)就是\(0\),转而\(f_3\)是\(1\):

i 1 2 3 4 5
\(f_i\) 0 1

接着,又来个一个\(2\),但是此时\(f_2\)已经为\(0\),所以直接加在\(f_3\):

i 1 2 3 4 5
\(f_i\) 0 2

随后的两个\(3\)可以将\(f_3\)变为\(0\),而将\(f_4\)变为\(2\):

i 1 2 3 4 5
\(f_i\) 0 0 2

最后一个数是\(4\),发现\(f_4\)不为\(0\),那就接在它后面并更新:

i 1 2 3 4 5
\(f_i\) 0 0 1 1

所以最后的答案就是\(f\)中所有数之和

代码

#include<bits/stdc++.h>
using namespace std;
const int Maxn=2e5+10;
int n,ans;
int a[Maxn];
void run()
{
    cin>>n;map<int,int>f;ans=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        if(f[a[i]]!=0) f[a[i]]--;
        f[a[i]+1]++;
    }
    for(map<int,int>::iterator it=f.begin();it!=f.end();it++)
    {
        ans+=it->second;
    }
    cout<<ans<<endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--) run();
}

标签:CF1790D,int,Codeforces,玩具,Matryoshkas,ZYH,序列
From: https://www.cnblogs.com/lyk2010/p/17893080.html

相关文章

  • Codeforces Round 803 (Div. 2)
    基本情况A题秒了。B题经典+2。(经典不开longlong)C题读错题,没得思路。B.RisingSandProblem-B-Codeforces思路好想,分类讨论找规律就行。这里还是要强调一下认真分析数据:InputThesecondlineofeachtestcasecontains\(n\)integers\(a_1,a_2,\ldots,a_n\)......
  • Codeforces Round 914 (Div. 2)
    基本情况脑子最卡的一集。A题读假题,卡了快一小时。B题代码太复杂,出错不好修改,一直调。虽然最后都出来了,但是没有剩下任何时间看后面题目了。A.Forked!Problem-A-Codeforces一开始不知道犯得什么病,觉得可以斜着走一格算作一步,然后情况就太多了,非常不好处理。后面突......
  • Codeforces Round 914 (Div. 2)
    C.ArrayGame题意:给定一个n的数组以及k的操作数,每次可以选择下表为i,j(i<j)得到一个abs(a[i]-a[j])的数放在数组末尾,问你k次操作后,数组中最小的数是多少?思路:首先k>=3选相同的下表两次,一定结果是0,是最小。k==1遍历出下表两两相减的绝对值最小以及本身数组中最小的即可k==2要将数......
  • CodeForces 1902F Trees and XOR Queries Again
    洛谷传送门CF传送门如果我们能把\(x\toy\)路径上的所有点权插入到线性基,那么可以\(O(\logV)\)查询。但是因为线性基合并只能\(O(\log^2V)\)(把一个线性基的所有元素插入到另一个),所以只能倍增做\(O((n+q)\logn\log^2V)\),过不了。考虑\(O(n\logV)\)预处理出......
  • Codeforces Round 904 (Div. 2)
    [CodeforcesRound904(Div.2)](https://codeforces.com/contest/1894)A.SimpleDesign暴力就行了1e9跑不满的#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve(){intx,k;cin>>x>>......
  • Codeforces Round 801 (Div. 2)
    基本情况A就开始犯病,导致+2.B、C都过样例了,但是都错。B.CircleGame赛时推出来奇数必输,也知道偶数不是必赢,但是思路不清楚。这里我没意识到一个很关键的性质。奇数堆拿的石堆会变,这也导致了必输,比如三个堆\(1,2,3\)。表粗的为JOE。123123显然JOE拿的石堆是变化的......
  • [Codeforces] CF1763B Incinerate
    CF1763BIncinerate题意为了消灭人类,怪物协会向地球表面派出了\(n\)只怪兽。第\(i\)只怪物有一个生命值\(h_i\)和一个攻击力\(p_i\).凭借他最后的一击,真螺旋焚烧炮,Genos可以对所有活着的怪物造成\(k\)点伤害。换句话说,Genos可以通过一次攻击降低所有怪物\(k\)点......
  • Codeforces Round 909 (Div. 3)
    https://codeforces.com/contest/1899  一个小游戏#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;intn;intmain(){cin>>n;while(n--){intx;......
  • [Codeforces] CF1704C Virus
    CF1704CVirus题意有一个长度为\(n\)的环,即对于\(1\leqi\leqn\),满足第\(i\)个与第\(i+1\)个房子相邻,特别地,第\(n\)个房子与第\(1\)个房子也相邻。一开始,这\(n\)个房子中有\(m\)个房子被病毒感染了。在之后的每天早上,都可以选择一个未被感染的房子并对其进行保护,被保......
  • [Codeforces] CF1703E Mirror Grid
    CF1703EMirrorGrid题意给定一个\(n\timesn\(n\le100)\)的01矩形,求至少修改多少次后能使矩形旋转0°,90°,180°,270°后所形成的矩形都完全相同。思路吸纳分为两种情况讨论:\(n\)为奇数那么会出现这种情况:(以\(5\times5\)为例)如上图,我们就可以将其分为五个部分,每个......