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. .NetCore实现图片缩放与裁剪 - 基于ImageSharp

    前言 (突然发现断更有段时间了 最近在做博客的时候,需要实现一个类似Lorempixel.LoremPicsum这样的随机图片功能,图片有了,还需要一个根据输入的宽度高度获取图片的功能,由于之前处理图 ...

  2. 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  3. 以脚本形式运行python库

    技术背景 当我们尝试运行python的帮助文档时,会看到如下这样的一个说明: $ python3 -h usage: python3 [option] ... [-c cmd | -m mod | f ...

  4. 从解析HTML开始,破解页面渲染时间长难题

    摘要:在本文中,将重点关注网页的初始渲染,即它从解析 HTML 开始. 我将探索可能导致高渲染时间的问题,以及如何解决它们. 本文分享自华为云社区<页面首屏渲染性能指南>,作者:Ocean ...

  5. Detecting Rumors from Microblogs with Recurrent Neural Networks(IJCAI-16)

    记录一下,很久之前看的论文-基于RNN来从微博中检测谣言及其代码复现. 1 引言 现有传统谣言检测模型使用经典的机器学习算法,这些算法利用了根据帖子的内容.用户特征和扩散模式手工制作的各种特征,或者简 ...

  6. 关于 用fscanf读文件,把文件中用##分割的内容分开

    今天呀,被学弟问了一个问题 文件里存的是"123##456##0##1644444.....##" 为什么用fscanf(fp, "%s##%s......", ...

  7. go-zero微服务实战系列(十一、大结局)

    本篇是整个系列的最后一篇了,本来打算在系列的最后一两篇写一下关于k8s部署相关的内容,在构思的过程中觉得自己对k8s知识的掌握还很不足,在自己没有理解掌握的前提下我觉得也很难写出自己满意的文章,大家看 ...

  8. JAVA编程练习01作业

    1.已知y与x的关系:,要求:从键盘上输入一个x的值,输出其对应的y的值. 2. 输入一个圆半径(r),计算并输出圆的面积和周长. 3.输入一个三位正整数n,输出其个位.十位和百位上的数字. 4.根据 ...

  9. java。多态

    package Demo.oop.APP.Demo05; public class application { public static void main(String[] args) { //一 ...

  10. S32K148-CAN收发

    最近在搞一个转换板开发,大概意思把CAN信号转换成SPI信号,方案有两种:1)通过硬件电路直接把信号的bit位一位一位移给两个集成芯片:2)通过MCU接收CAN信号,再把信号变量转换成SPI信号发送给 ...