数列的操作 div2
链接:https://www.nowcoder.com/acm/contest/214/F
来源:牛客网
题目描述
clccle是个蒟蒻,她经常会在学校机房里刷题,也会被同校的dalao们虐,有一次,她想出了一个毒瘤数据结构,便兴冲冲的把题面打了出来,她觉得自己能5s内切掉就很棒了,结果evildoer过来一看,说:"这思博题不是1s就能切掉嘛",clccle觉得自己的信心得到了打击,你能帮她在1s中切掉这道水题嘛?
你需要写一个毒瘤(划掉)简单的数据结构,满足以下操作
1.插入一个数x(insert)
2.删除一个数x(delete)(如果有多个相同的数,则只删除一个)
3.查询一个数x的排名(若有多个相同的数,就输出最小的排名)
4.查询排名为x的数
5.求一个数x的前驱
6.求一个数x的后继
输入描述:
第一行,输入一个整数n,表示接下来需要输入n行接下来n行,输入 一个整数num和一个整数x
输出描述:
当num为3,4,5,6时,输出对应的答案
示例1
输入
复制
8 1 10 1 20 1 30 3 20 4 2 2 10 5 25 6 -1
输出
复制
2 20 20 20
说明
大家自己手玩样例算了QWQ
备注:
对于全部数据n<=1e5,且3,4,5,6的操作数少于60000输入数据可能很多,推荐使用快读
补充知识:相关知识点
代码一:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v;
int main()
{int n;scanf("%d",&n);while(n--){int a,b;scanf("%d %d",&a,&b);switch(a){case 1:v.insert(lower_bound(v.begin(),v.end(),b),b);break;case 2:v.erase(lower_bound(v.begin(),v.end(),b));break;case 3:printf("%d\n",((lower_bound(v.begin(),v.end(),b))-v.begin()+1));break;case 4:printf("%d\n",v[b-1]);break;case 5:printf("%d\n",v[lower_bound(v.begin(),v.end(),b)-v.begin()-1]);break;case 6:printf("%d\n",v[upper_bound(v.begin(),v.end(),b)-v.begin()]);break;}}return 0;
}
代码二 大佬的代码,可以当题解https://www.nowcoder.com/acm/contest/view-submission?submissionId=36539930
#include<vector>
#include<iostream>
#include<algorithm>
#include<cstdio>
#define ll long long
using namespace std;
vector<int>v;
int main()
{int n,a,x;scanf("%d",&n);while(n--){scanf("%d %d",&a,&x);if(a==1) v.insert(lower_bound(v.begin(),v.end(),x),x);//可实现从小到大的插入//lower_bound(begin(),end(),x) 在区间内查找大于等于x的第一个位置,返回它//如果所有都比x小则返回最后的位置if(a==2) v.erase(lower_bound(v.begin(),v.end(),x));//在容器中删除某个指定的数字x,由于删除方法中参数是迭代器,所以利用lower_boundif(a==3) printf("%d\n",lower_bound(v.begin(),v.end(),x)-v.begin()+1);//查找某个数字的排名 lower_bound返回的是那个数字的位置(迭代器),减去第一个位置,则为下标,+1则为排名if(a==4) printf("%d\n",v[x-1]);if(a==5) printf("%d\n",v[lower_bound(v.begin(),v.end(),x)-v.begin()-1]);if(a==6) printf("%d\n",*(upper_bound(v.begin(),v.end(),x)));//upper_bound(v.begin(),v.end(),x)返回在区间中第一个大于x的位置(仅大于)//if(a==6) printf("%d\n",*(lower_bound(v.begin(),v.end(),x)));}return 0;
}
代码三 房大佬队友的思路和代码
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<sstream>
#include<stack>
#include<string>
#include<set>
#include<vector>
using namespace std;
#define PI acos(-1.0)
#define EPS 1e-8
#define MOD 1e9+7
#define LL long long
#define ULL unsigned long long //1844674407370955161
#define INT_INF 0x7f7f7f7f //2139062143
#define LL_INF 0x7f7f7f7f7f7f7f7f //9187201950435737471
const int dr[]={0, 0, -1, 1, -1, -1, 1, 1};
const int dc[]={-1, 1, 0, 0, -1, 1, -1, 1};
// ios::sync_with_stdio(false);
// 那么cin, 就不能跟C的 scanf,sscanf, getchar, fgets之类的一起使用了。
int main()
{int n;scanf("%d",&n);vector <int > q;while(n--){int x,y;scanf("%d%d",&x,&y);switch(x){case 1:{int ans=q.size();for(int i=0;i<q.size();++i)if(q[i]>=y){ans=i;break;}q.insert(q.begin()+ans,y);break;}case 2:q.erase(find(q.begin(),q.end(),y));break;case 3:for(int i=0;i<q.size();++i)if(q[i]==y){printf("%d\n",i+1);break;}break;case 4:printf("%d\n",q[y-1]);break;case 5:for(int i=q.size()-1;i>=0;--i)if(q[i]<y){printf("%d\n",q[i]);break;}break;case 6:for(int i=0;i<q.size();++i)if(q[i]>y){printf("%d\n",q[i]);break;}break;}}//for(int i=0;i<q.size();++i)//cout<<q[i]<<" ";}
数列的操作 div2相关推荐
- 贪心算法-数列极差问题(对前篇文章的修改)
package com.work.home_3_1; import java.util.Arrays; /** * 贪心算法-数列极差问题 * 1. 问题描述: * N个正数数列 ...
- Fibonacci数列的实现与改进
Fibonacci数列是初学者接触到的一道关于for循环的习题,它的实现比较简单 int main() {int pos = 0;cout << "Please enter a ...
- 线性结构 —— 分块算法 —— 分块九讲
模型1:区间加法,单点询问 问题:给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,单点查值. 对每个块设置一个加法标记,记录这个块中元素一共加了多少,每次操作对整块直接 O(1) 标记, ...
- [leetcode]Next Greater Element
第一题:寻找子集合中每个元素在原集合中右边第一个比它大的数. 想到了用哈希表存这个数的位置,但是没有想到可以直接用哈希表存next great,用栈存还没找到的数,没遍历一个数就考察栈中的元素小,小的 ...
- 2019年清华计算机系本校保研推免机考题目
时间: 4小时3道题目 形式: 在线OJ测试,每题100分,分为多个子任务分别执行程序记分 操作系统:ubuntu 语言:C / C++ / java / python3 霄之国的列车 简而言之,霄之 ...
- [Codeforces Round #668 (Div. 2)]1405
文章目录 A - Permutation Forgery B - Array Cancellation C - Balanced Bitstring [思维] D - Tree Tag [博弈][df ...
- hdu 3234 Exclusive-OR 题解(并查集,思维)
该死的期末复习终于结束了... 暑假来了\color{#ff0000}{暑假来了}暑假来了!!! 所以我就珂以非常开心的写博客了. 原题链接: hdu 题意简述 多组数据.你有一个没有确定的数列.有一 ...
- 【前缀和与差分】- PAT题目
前缀和与差分 1.前缀和: 前缀和是一种预处理,即给出n个数和m组访问,如果直接每次都在这些数列上操作,会造成超时,前缀和直接对这些访问进行预处理,最后直接得出取出结果进行计算.即O(n+m). 相关 ...
- CUDA实现FFT并行计算
前言 本文是个人学习心得的分享,希望大家在阅读文章后能在评论中一起学习交流!另外还可以访问我的HelloCUDA仓库查看我在学习CUDA中写的一些demo程序. 内容概要 复数的CUDA C++实 ...
最新文章
- jackson反序列化时忽略不需要的字段
- linux中第一个进程的形成,Linux进程管理
- Linux查找大文件 (find的用法)
- 4.Java 面试题整理(JSP 篇)
- linux入门生信,优秀学员的学习方法展示
- VIIRS SDR数据预处理(一)
- 无线网卡mac地址修改
- DCMM GBT 36073-2018 数据管理能力成熟度评估模型(Word版)
- 二叉树遍历之先序遍历算法(非递归、递归)入门详解
- 【日常折腾】Y7000P拆机-更换触控板
- 给大家推荐几本最优秀的编程书
- SQL SERVER数据库日常使用总结
- 东芝移动硬盘计算机不显示,东芝移动硬盘无法识别电脑不显示盘符维修数据恢复...
- 艺龙的执着与固执:等待微信
- Maxwell 16.0 (64-bit) 软件卸载_Win7系统
- ibator mysql 分页,ZUI分页器的使用案例(ECLIPSE SMS项目)
- sugon服务器型号从哪看,sugon服务器初始密码
- 微信公众平台开发-access_token获取及应用(含源码)
- python发送put请求
- 无法将为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型