首页 > 其他分享 >杂题练习

杂题练习

时间:2023-11-03 17:33:08浏览次数:36  
标签:limited set int lim 练习 stl length 杂题

stl

众所周知一般来说,随着社会经济的不断发展,stl越来越成为一款强大的工具。

著名cp选手i_wish_a_gilrfriend曾说过:stl,启动!

无敌山鸡王说:我在学习了算法近一年后才了解stl,这是我的巨大损失。

五星上将麦克阿瑟曾说过,如果上帝不让我使用stl,那我将用枪指向上帝。

下面是练习使用stl题单,如果能熟练并轻松切出说明你很会stl。

 

1.CFgym104172 L - Permutation Compression

题解

发现从大的往小的删,是优的。因为先删了小的,对大的没有影响;未删大的就删小的,对小的会有影响,限制可能增多。

于是我们考虑从大的开始删,然后就每次找到当前值$x$作为最大值的最长区间,设长度为$length$,然后贪心的找到$L$数组中一个$L_i \le length$,然后将这个值$x,L_i$分别从数组中删去。这个东西可以用树状数组和set维护。

查看代码

void Solve(int TIME) {
 
    int n, m, k;cin >> n >> m >> k;
    BIT tr(n + 1);
    set<int> del;for (int i = 1;i <= n;i++) del.insert(i);//待删元素
    set<int> limited;int last_dele = n + 1;//限制,上次删的元素
    limited.insert(0);limited.insert(n + 1);
    vi a(n + 1);for (int i = 1;i <= n;i++) cin >> a[i];
    vi b(m + 1);for (int i = 1;i <= m;i++) cin >> b[i], del.erase(b[i]);
    vi l(k + 1);for (int i = 1;i <= k;i++) cin >> l[i];
    multiset<int> set_L;for (int i = 1;i <= k;i++) set_L.insert(l[i]);
    vi pos(n + 1);for (int i = 1;i <= n;i++) pos[a[i]] = i;
    for (int i = 1;i < m;i++) {
        if (pos[b[i]] < pos[b[i + 1]]) continue;
        return cout << "NO" << endl, void();
    }
    for (auto it = del.rbegin();it != del.rend();it++) {
        auto val = *it;
        for (int i = last_dele - 1;i >= val + 1;i--) {
            limited.insert(pos[i]);
        }
        auto right_lim = *limited.upper_bound(pos[val]);
        auto left_lim = *prev(limited.upper_bound(pos[val]));
        int length = right_lim - left_lim - 1; length -= tr.query(left_lim + 1, right_lim - 1);
        auto find_l = set_L.upper_bound(length);if (find_l == set_L.begin()) return NO, void();
        set_L.erase(--find_l);
        tr.add(pos[val], 1);
        last_dele = val;
    }
    YES;
 
}

 

标签:limited,set,int,lim,练习,stl,length,杂题
From: https://www.cnblogs.com/mrsuns/p/17808066.html

相关文章

  • matlab练习程序(随机抽样一致RANSAC)
    RANSAC在图像拼接中有所使用,有时候也在图像理解的相关算法中有所使用。算法简介如下(摘自《图像处理、分析与机器视觉(第3版)》):1.假设我们要将n个数据点X={x1,x1,...,xn}拟合为一个由至少m个点决定的模型(m<=n,对于直线,m=2)。(我这里实际是两个不同均值、协方差高斯分布产生的数据)2.......
  • CF练习题18
    这次的题都是什么怪物!!!ShortColorfulStrip因为\(n=m\),所以最终的形态一定是\(n\)的一个排列。根据题意,发掘几个性质:一个区间染色,一定最先对其中颜色最小的染色。染色要求覆盖的点颜色完全相同。对于第一次来说,先找到颜色为\(1\)的点,位置是\(p\)。染色的区间是\([......
  • java练习:二维码生成和输出
    <!--二维码生成--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>2.2</version></dependency><dependency><groupId>com.google.zxing</groupId&......
  • C语言经典练习题1
    1、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第了个人大2岁,问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数......
  • for语句练习(打印1-10)
    #include<stdio.h>#include<stdlib.h>intmain(){  inti=0;  for(i=1;i<=10;i++)//i=1为初始化部分;i<=10为判断部分;i++为调整部分  {    printf("%d",i);  }  return0;}......
  • do...while循环语句练习(打印1-10)
    #include<stdio.h>intmain(){  inti=1;  do         //do表示将数字带入入口  {    printf("%d",i);//在此打印    i++;  }  while(i<=10);   //满足该条件进行循环打印  return0;}......
  • 结构体与指针练习
    #include<stdio.h>structpeople{charstudycard[20]; charname[20]; intage;};intmain(){structpeoplea={"2022060724","张三",19};structpeople*pb=&a;printf("%s\n",pb->studycard);/*printf("......
  • 「Note」CF 杂题集 6
    前言难度:CF2600-2700(有一道是2500)别问我为啥没有1到5。\(\color{blueviolet}{CF1473F}\)此题是坏题,他卡你空间。每一个元素有选或不选两种状态,并且有依赖项,元素的贡献有正负,数据范围不大,可以自然联系到最大权闭合子图,采用最小割模型。建模方式如下:对于一个正权点\(u......
  • Spring,IOC理论推导,首个Spring练习
    一、首先创建一个maven项目,导入spring-mvc依赖,这个依赖一般会把很多依赖一起导入了,导入这个一个很方便。 二、创建dao层写一个方法 并且对这个接口进行多个实现 这几个实现类的内容只是单纯的打印出这个接口被实现的字样问题来了,用户会有不同的需求,如果用户要变换需求我......
  • 每日一练 | 华为认证真题练习Day124
    1、OSPFv3使用哪个区域号标识骨干区域?A.0B.3C.1D.22、某路由器OSPFv3邻接关系如下,则本路由器是ABR。A.对B.错3、IPv6地址中不包括下面哪种类型的地址?A.任播地址B.广播地址C.组播地址D.单播地址4、如果一个网络的网络地址为10.1.1.0/30,那么它的广播地址是()?A.10.1.1.4B.10......