牛客little w and Discretization

2024-06-11 21:28

本文主要是介绍牛客little w and Discretization,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

玩一下样例发现,只要找到mex就可以知道有((1-mex)的值)所在的位置离散化后和原本的值是一样的,所以询问区间的长度-(1-mex)有几个值就是答案,数据范围3e5,莫队+值域分块求区间mex,计算1-mex有几个位置属于这个值域内,a[i] 1e9,但是可以发现a[i]>3e5后离散化必然和原本的值不一样,所以a[i]=3e5+1;

// Problem: little w and Discretization
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/19684/F
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#define INF (1ll<<60)
using namespace std;
typedef long long ll;
const int N=3e5+9;
const int M=3e5;
int a[N],c[N],bc[N],vis[N],bv[N];
int L[N],R[N],pos[N];
int LL[N],RR[N],PP[N];
int ans[N];
int t,tt;
struct Q{int l,r,id;friend bool operator < (const Q &a,const Q &b){return pos[a.l]^pos[b.l]?pos[a.l]<pos[b.l]:pos[a.l]&1?a.r<b.r:a.r>b.r;}
}que[N];
//另一种写法
// void modify(int x,int val){// int loc=PP[x];// if(!c[x] && val==1){// vis[x]=1;// bv[loc]++;// }// if(c[x]==1 && val==-1){// vis[x]=0;// bv[loc]--;// }// c[x]+=val;// bc[loc]+=val;
// }
/*
c,bc,vis,bv
*/
void add(int pos){c[a[pos]]++;bc[PP[a[pos]]]++;if(c[a[pos]]==1 && c[a[pos]]==1){bv[PP[a[pos]]]++;vis[a[pos]]=1;}
}
void del(int pos){c[a[pos]]--;bc[PP[a[pos]]]--;if(c[a[pos]]==0 && !c[a[pos]]){bv[PP[a[pos]]]--;vis[a[pos]]=0;}
}
ll query1(int l,int r){int p=PP[l];int q=PP[r];if(p==q){for(int i=l;i<=r;i++){if(!vis[i]){return i;}}}else{for(int i=l;i<=RR[p];i++){if(!vis[i]){return i;}}for(int i=p+1;i<=q-1;i++){///if(bv[i]!=RR[i]-LL[i]+1){for(int j=LL[i];j<=RR[i];j++){if(!vis[j]){return j;}}}}for(int i=LL[q];i<=r;i++){if(!vis[i]){return i;}}}return r+1;
}
ll query2(int l,int r){ll res=0;int p=PP[l];int q=PP[r];if(p==q){for(int i=l;i<=r;i++){res+=c[i];}}else{for(int i=l;i<=RR[p];i++){res+=c[i];}for(int i=p+1;i<=q-1;i++){res+=bc[i];}for(int i=LL[q];i<=r;i++){res+=c[i];}}return res;
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]>300000){a[i]=300001;}}t=sqrt(n);for(int i=1;i<=t;i++){L[i]=(i-1)*t+1;R[i]=i*t;}if(R[t]<n){t++;L[t]=R[t-1]+1;R[t]=n;}for(int i=1;i<=t;i++){for(int j=L[i];j<=R[i];j++){pos[j]=i;}}tt=sqrt(M);for(int i=1;i<=tt;i++){LL[i]=(i-1)*tt+1;RR[i]=i*tt;}if(RR[tt]<M){tt++;LL[tt]=RR[tt-1]+1;RR[tt]=M;}for(int i=1;i<=tt;i++){for(int j=LL[i];j<=RR[i];j++){PP[j]=i;}}int m;cin>>m;for(int i=1;i<=m;i++){cin>>que[i].l>>que[i].r;que[i].id=i;}sort(que+1,que+1+m);int l=1,r=0;for(int i=1;i<=m;i++){while(que[i].l>l){del(l++);}while(que[i].l<l){add(--l);}while(que[i].r>r){add(++r);}while(que[i].r<r){del(r--);}ans[que[i].id]=(que[i].r-que[i].l+1)-query2(1,query1(1,M));}for(int i=1;i<=m;i++){cout<<ans[i]<<'\n';}return 0;
}

这篇关于牛客little w and Discretization的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052319

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

牛客《剑指Offer》 -- 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路 特别注意负数的情况,出现负数,将其转化为正数然后求倒数。 class Solution {public:double Power(double base, int exponent) {double total = 1;bool flag = false

牛客网《剑指Offer》 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 负数用补码,其实就是求一个数据在计算机中是存储是怎么样子的。用位运算,就能很好实现。 class Solution {public:int NumberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ((n & f

牛客网《剑指Offer》 矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution {public:int rectCover(int number) {if(number==0) return 0;if(number==1) return 1;if(number==2) return 2;retu

牛客《剑指Offer》 变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路 根据 普通的跳台阶可以总结出 f(n) = f(n-1) + f(n-2) +f(n-3) + 。。。。+ f(1) +1 不妨设 f(0) = 1 , 则易得 class Solution {public:int jumpFloorII(int n

牛客《剑指Offer》 跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路 递归思想,n阶梯子走法等于n-1 加上n-2的。 class Solution {public:int jumpFloor(int number) {if(number==1) return 1;if(number==2) return 2;return jumpFl