当前位置:网站首页>ABC260 E - At Least One(双指针)
ABC260 E - At Least One(双指针)
2022-08-01 13:22:00 【Harris-H】
ABC260 E - At Least One(双指针)
一开始想到two pointers 了,但是不知道怎么快速维护是否满足条件。
原来开一个vector,然后用cnt变量存当前达到的组数。然后只对变为 0 0 0的桶影响cnt。
因为每个 i i i 对应的vector 至多遍历两次。
因此复杂度是: O ( n + m ) O(n+m) O(n+m)
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> A(N), B(N);
for (int i = 0; i < N; i++) cin >> A[i] >> B[i];
vector<vector<int>> inv(M + 1);
for (int i = 0; i < N; i++) {
inv[A[i]].push_back(i);
inv[B[i]].push_back(i);
}
vector<int> cnt(N), ans(M + 3);
int cnt_zero = N;
for (int i = 1, j = 1; i <= M;) {
while (j <= M and cnt_zero != 0) {
for (auto& x : inv[j]) {
if (cnt[x] == 0) cnt_zero--;
cnt[x]++;
}
j++;
}
if (cnt_zero != 0) break;
ans[j - i]++, ans[M + 1 - i + 1]--;
for (auto& x : inv[i]) {
cnt[x]--;
if (cnt[x] == 0) cnt_zero++;
}
i++;
}
for (int i = 1; i <= M; i++) {
ans[i] += ans[i - 1];
cout << ans[i] << " \n"[i == M];
}
}
根据双指针,我们可以枚举左端点,右端点其实我们只需要更新 r = m a x ( r , m x [ l + + ] ) r=max(r,mx[l++]) r=max(r,mx[l++])
这里 m x [ v a l ] mx[val] mx[val] 是所有左端点为 v a l val val对应的最大右端点值。
显然 l + + l++ l++之后, r r r 必须大于等于 m x [ l ] mx[l] mx[l]。
特别地,当 l = 1 l=1 l=1, r r r 为所有左端点的最大值。这样 r r r是最小的 r r r。
然后双指针 O ( 1 ) O(1) O(1)更新即可。
注意 l ≤ min { b [ i ] } l\le \min\{b[i]\} l≤min{ b[i]} ,不然无解。
时间复杂度: O ( n ) O(n) O(n)
// Problem: E - At Least One
// Contest: AtCoder - AtCoder Beginner Contest 260
// URL: https://atcoder.jp/contests/abc260/tasks/abc260_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// Date: 2022-07-30 23:13:40
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {
402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
if(x>y) x=y;
}
PII a[N];
int left_mx[N];
int is_right[N];
ll pre[N];
int n,m;
bool ck(int x){
for(int i=1;i<=n;i++){
if(x<a[i].x) return false;
}
return true;
}
int main(){
ll mn = 1e18;
cin>>n>>m;
rep(i,1,n){
cin>>a[i].x>>a[i].y;
cmx(left_mx[a[i].x],a[i].y);
cmn(mn,1LL*a[i].y);
}
int l=1,r=m,ans=0;
while(l<=r){
int mid = l+r>>1;
if(ck(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
//printf("%d %d\n",1,ans);
for(int i=1,j=ans;i<=mn;cmx(j,left_mx[i++])){
pre[j-i+1]++,pre[m-i+2]--;
}
rep(i,1,m) pre[i]+=pre[i-1];;
rep(i,1,m){
printf("%lld ",pre[i]);
}
return 0;
}
边栏推荐
- formatdatetime function mysql (date sub function)
- Why does the maximum plus one equal the minimum
- AI目标分割能力,无需绿幕即可实现快速视频抠图
- AD单片机九齐单片机NY8B062D SOP16九齐
- 如何使用OpenCV测量图像中物体之间的距离
- 代理商替代义隆153 Aip4210
- 消息中间件解析 | 如何正确理解软件应用系统中关于系统通信的那些事?
- [Cloud Enjoying Freshness] Community Weekly Vol.73- DTSE Tech Talk: 1 hour in-depth interpretation of SaaS application system design
- SQL函数 STR
- 树和二叉树的转换
猜你喜欢

50W+小程序开发者背后的数据库降本增效实践

shell 中的 分发系统 expect脚本 (传递参数、自动同步文件、指定host和要传输的文件、(构建文件分发系统)(命令批量执行))

iPhone难卖,被欧洲反垄断的服务业务也难赚钱了,苹果的日子艰难

PyTorch 进阶之路:在 GPU 上训练深度神经网络

快速幂---学习笔记

什么是一致性哈希?可以应用在哪些场景?

10年稳定性保障经验总结,故障复盘要回答哪三大关键问题?|TakinTalks大咖分享

AtCoder Beginner Contest 261 D - Flipping and Bonus

又拿三个大奖?!多力就是要让你吃的更营养更健康

【5GC】5G网络切片与5G QoS的区别?
随机推荐
代理商替代义隆153 Aip4210
制售假劣农资、非法占用耕地……公安部公布十起危害粮食生产安全犯罪典型案例
leetcode:1201. 丑数 III【二分 + 数学 + 容斥原理】
Programmer's Romantic Tanabata
MySQL调优
【无标题】
Towhee 每周模型
Grafana9.0发布,Prometheus和Loki查询生成器、全新导航、热图面板等新功能!
sql中常用到的正则表达
tensorflow2.0 handwritten digit recognition (tensorflow handwriting recognition)
通讯录(静态版)(C语言)(VS)
脚本语言Lua的基础知识总结
opencv 保存图片imwrite
大中型网站列表页翻页过多怎么优化?
高仿项目协作工具【Worktile】,从零带你一步步实现组织架构、网盘、消息、项目、审批等功能
【每日一题】952. 按公因数计算最大组件大小
Qt实战案例(55)——利用QDir删除选定文件目录下的空文件夹
什么是元编程
PAT1165 Block Reversing(25)
leetcode: 1201. Ugly Number III [Dichotomy + Mathematics + Inclusion and Exclusion Principle]