AtCoder Beginner Contest 260 - AtCoder

D - Draw Your Cards

题意:N张卡牌数字 1-n,以某种顺序排放,每次拿一张,如果这一张比前面某一张小(不是最大的) ,就把它放在比他大的牌中数字最小的,如果没有就单独放在第一个位置,当某个位置的牌数达到k张,就将他们拿走,问最后每张牌都会在第几次操作被拿走,如果没被拿走输出 -1。

题解:可以利用set或者map这种自动排序的迭代器来进行存储,然后利用二分找到第一个比它大的数字,然后进行操作即可。

其中: set的速度可能会比map慢

set写法 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=2e5+5;
const ll inf=1e18;
const ll mod=998244353;
ll n,k;
ll a[N],b[N],pre[N];
set<ll> q;
ll sum[N],ans[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>k;
for(ll i=1;i<=n;i++) pre[i]=-1;
for(ll i=1;i<=n;i++){
ll t;cin>>t;
if(k==1){
ans[t]=i;continue;//k==1特判一下
}
sum[t]=1;
q.insert(t);
if(*(q.rbegin())!=t){
ll pt=*(upper_bound(q.begin(),q.end(),t));//二分找到第一个比他大的
pre[t]=pt;
q.erase(pt);//删除掉,让小的覆盖它
sum[t]+=sum[pt];
if(sum[t]==k){
ll beg=t;
while(beg!=-1){
ans[beg]=i;
beg=pre[beg];
}
q.erase(t);//如果能凑出来,就要全部删掉
}
}
}
for(ll i=1;i<=n;i++) cout<<(ans[i]?ans[i]:-1)<<endl; }

map写法 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=2e5+5;
const ll inf=1e18;
const ll mod=998244353;
ll n,k;
ll a[N],b[N],pre[N];
map<ll,ll> q;
ll sum[N],ans[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>k;
for(ll i=1;i<=n;i++) pre[i]=-1;
for(ll i=1;i<=n;i++){
ll t;cin>>t;
if(k==1){
ans[t]=i;continue;
}
sum[t]=1;
q[t]=1;
if(q.rbegin()->first!=t){
auto pt=q.upper_bound(t);
pre[t]=pt->first;
q.erase(pt);
sum[t]+=sum[pt->first];
if(sum[t]==k){
ll beg=t;
while(beg!=-1){
ans[beg]=i;
beg=pre[beg];
}
q.erase(t);
}
}
}
for(ll i=1;i<=n;i++) cout<<(ans[i]?ans[i]:-1)<<endl;
}

E - At Least One

题意: 给出n对数字,没对数字最少选择其中的一个,找出所有选择的数字都在某个区间内的区间数目

题解: 加入对于每个数  l <= xi <=r,那么对于这个区间肯定满足,那么,对与一个区间 [a,b] (a<=l, b>=r) 肯定也满足,因为肯定也在其中,所以,我们只需要找到某个最小的区间,然后向两边延申即可,其中,更新每一种长度的值可以用差分,为了防止重复,我们可以固定右端点,跑左端点。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=2e5+5;
const ll inf=1e18;
const ll mod=998244353;
ll n,k;
ll a[N],b[N],pre[N];
ll q[N],sum[N];
vector<ll> p[N];
map<ll,ll> mp;
bool check(ll x){
for(auto it:p[x]){
if(mp[it]<=1) return 0;//如果其中某个位置的出现的次数<=1就不能删
}
return 1;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>k;
for(ll i=1;i<=n;i++){
ll x,y;cin>>x>>y;
p[x].push_back(i);//存储每个数字的位置
p[y].push_back(i);
}
ll l=0,r=-1;//左右两个端点
ll le=0;//用来记录遍历过第一对点
for(ll i=1;i<=k;i++){
q[++r]=i;
for(auto it:p[i]){
mp[it]++;//记录第几队点出现的次数
if(mp[it]==1) le++;
}
while(l<=r&&check(q[l])){
for(auto it:p[q[l]]) mp[it]--; //判断左端点的这个点,它可不可以删
l++;
}
if(le==n) {sum[r-l+1]++;sum[i+1]--;}
}
for(ll i=1;i<=k;i++) sum[i]+=sum[i-1],cout<<sum[i]<<" ";//差分遍历
}

AtCoder Beginner Contest 260 (D-E)的更多相关文章

  1. AtCoder Beginner Contest 260 G // imos(累积和算法)

    题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...

  2. AtCoder Beginner Contest 260 F - Find 4-cycle

    题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...

  3. AtCoder Beginner Contest 260 E // 双指针 + 差分

    题目传送门:E - At Least One (atcoder.jp) 题意: 给定大小为N的两个数组A,B,求长度分别为1~M的满足以下条件的连续序列数量,条件为: 对于每个i(从1~N),Ai和B ...

  4. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  5. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  6. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  7. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  8. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  9. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

随机推荐

  1. flink处理延迟

    flink处理延迟 flink主要是处理实时数据的,在处理实时数据的过程中,难免会遇到乱序的存在.以事件时间举例,先发生的事件后到处理算子.flink针对乱序数据的处理主要有三种方式: 拨慢水位线的生 ...

  2. 全新升级的AOP框架Dora.Interception[2]: 基于&ldquo;约定&rdquo;的拦截器定义方式

    Dora.Interception有别于其他AOP框架的最大的一个特点就是采用针对"约定"的拦截器定义方式.如果我们为拦截器定义了一个接口或者基类,那么拦截方法将失去任意注册依赖服 ...

  3. go Cobra命令行工具入门

    简介 Github:https://github.com/spf13/cobra Star:26.5K   Cobra是一个用Go语言实现的命令行工具.并且现在正在被很多项目使用,例如:Kuberne ...

  4. 使用阿里云RDS for SQL Server性能洞察优化数据库负载-初识性能洞察

    简介 数据库性能调优通常需要较高数据库水平,并伴随较多的前期准备工作,比如收集各种性能基线.不同种类的性能指标.慢SQL日志等,这通常费时费力且效果一般,当面对多个数据库时总体拥有成本会大幅增加.今天 ...

  5. SAP BOM 读取

    1.查找 物料号.工厂.物料描述. 表:MARA MARC MAKT 逻辑: 输入物料(选择选项)中的物料编号(MARA-MATNR)和                       输入工厂(选择选项 ...

  6. BluePrism手把手教程2.0 创建流程

    2.0.1 创建流程 2.0.2 设置流程名称 2.0.3 添加流程说明 2.0.4 添加流程成功 2.0.4 打开新建的流程 RPA行业微信交流群,欢迎大家扫码加入一起交流,此群用于RPA行业技术. ...

  7. 如何用空气质量查询API接口进行快速开发

      空气质量的好坏反映了空气污染程度,它是依据空气中污染物浓度的高低来判断的.空气污染是一个复杂的现象,在特定时间和地点空气污染物浓度受到许多因素影响.来自固定和流动污染物的人为污染物排放大小是影响空 ...

  8. Phabricator Conduit API介绍

    在Phabricator页面,可以完成创建和编辑Project.Task等操作.但是如果想实现外部系统可以自主操作Phabricator,那么就需要调用Phabricator Conduit API, ...

  9. kube-scheduler的调度上下文

    前一章节了解到了kube-scheduler中的概念,该章节则对调度上下文的源码进行分析 Scheduler Scheduler 是整个 kube-scheduler 的一个 structure,提供 ...

  10. c:找到出现次数最多的递增数字串

    如题,如何在一亿位整数组成的字符串中找到出现次数最多的递增数字串? 答案: #include <stdio.h> #include <string.h> #define MAX ...