AtCoder Beginner Contest 260 (D-E)
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)的更多相关文章
- AtCoder Beginner Contest 260 G // imos(累积和算法)
题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...
- AtCoder Beginner Contest 260 F - Find 4-cycle
题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...
- AtCoder Beginner Contest 260 E // 双指针 + 差分
题目传送门:E - At Least One (atcoder.jp) 题意: 给定大小为N的两个数组A,B,求长度分别为1~M的满足以下条件的连续序列数量,条件为: 对于每个i(从1~N),Ai和B ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
随机推荐
- 让我们用Vue cli全家桶搭建项目
一般项目都会用到这几个,这里不在详细介绍概念,只是简单的使用.一.搭建cli 1.事先安装好cnpm(淘宝镜像) npm install -g cnpm --registry=https://regi ...
- 获取请求体数据 POST
POST获取请求体 请求体中封装了 POST请求的请求参数 获取流对象 再从流对象中那数据 一种字节流 一种字符流 BufferedReader getReader()获取字符输入流 只能操作字符 S ...
- RPA应用场景-账套建立
所涉人工数量5操作频率 不定时 场景流程 1.客户按照项目开设专项财务管理,每个项目需要在初期建立自己的账套: 2.运营专员通过邮件发送账套建立申请: 3.根据申请进入金蝶运维后台,依据规则完成账套建 ...
- 更强的 JsonPath 兼容性及性能测试之2022版(Snack3,Fastjson2,jayway.jsonpath)
2022年了,重新做了一份json path的兼容性与性能测试.三个市面上流行框架比较性测试. 免责声明:可能测试得方式不对而造成不科学的结果(另外,机器不同结果会有不同),可以留言指出来.以下测试数 ...
- # Vue3 toRef 和 toRefs 函数
Vue3 toRef 和 toRefs 函数 上一篇博文介绍了 vue3 里面的 ref 函数和 reactive 函数,实现响应式数据,今天主要来说一下 toRef 函数和 toRefs 函数的基本 ...
- 字节输入流_InputStream类&FileInputStream类介绍和字节输入流读取字节数据
java.io.InputStream:字节输入流 此抽象类是表示字节输入流的所有类的超类 定义了所有子类共性的方法: int read()从输入流中读取数据的下一个字节 int read(byte[ ...
- 驳"一切不谈考核的管理都是扯淡"
一.引子 以我个人的从业经验认为,研发人员的量化考核,始终是一个世界难题.正巧不久前在园子里看到了"一切不谈考核的管理都是扯淡!"一文(下面简称为"扯淡"),该 ...
- HTML及HTTP协议
web服务的过程: 浏览器发请求 --> HTTP协议 --> 服务端接收请求 --> 服务端返回响应 --> 服务端把HTML文件内容发给浏览器 --> 浏览器渲染页面 ...
- 函数式接口的概念&函数式接口的定义和函数式接口的使用
函数式接口概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambd ...
- 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用
在我们实际项目开发过程中,往往需要根据实际情况,对组件进行封装,以更简便的在界面代码中使用,在实际的前端应用中,适当的组件封装,可以减少很多重复的界面代码,并且能够非常简便的使用,本篇随笔介绍基于El ...