【AtCoder Beginner Contest 330)】[E - Mex and Update ] 线段树+二分
本题可以用线段树+二分的方式实现。代码如下:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer; // Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {
public static void main(String[] args) throws IOException {
int n, q;
StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in));
st.nextToken();
n = (int) st.nval;
st.nextToken();
q = (int) st.nval;
int[] a = new int[n];
tree = new int[4 * n];
int[] b = new int[n + 1];
int[] cnt = new int[n + 1];
for (int i = 0; i < n; i++) {
st.nextToken();
a[i] = (int) st.nval;
if (a[i] <= n) {
cnt[a[i]]++;
if (b[a[i]] == 0) {
b[a[i]]++;
}
}
}
PrintWriter writer = new PrintWriter(System.out);
build(0, b, 0, n);
for (int i = 0; i < q; i++) {
st.nextToken();
int index = (int) st.nval-1;
st.nextToken();
int value = (int) st.nval; int oldvalue = a[index]; if (oldvalue <= n) {
cnt[oldvalue]--;
if (cnt[oldvalue] == 0) {
b[oldvalue]--;
add(oldvalue, -1, 0, 0, n);
}
} a[index] = value;
if (value <= n) {
cnt[value]++;
if (b[value] == 0) {
b[value]++;
add(value, 1, 0, 0, n);
}
} //二分
int left = 0, right = n;
while (left < right) {
int mid = (left + right) / 2;
if(query(0,mid,0,0,n) == mid+1){
left = mid + 1;
}else{
right = mid;
}
}
// System.out.println(left);
writer.println(left);
}
writer.flush();
} static int[] tree; public static int query(int l, int r, int index,int L, int R) {
int ans = 0;
if (l <= L && R <= r) {
return tree[index];
}else {
int mid = (L + R) / 2;
if(mid<l){
return query(l,r,2*index+2,mid+1,R);
}
else if(r<=mid){
return query(l,r,2*index+1,L,mid);
}else{
return query(l,mid,2*index+1,L,mid)+query(mid+1,r,2*index+2,mid+1,R);
}
}
} public static void build(int index, int[] arr, int l, int r) {
if (l == r) {
tree[index] = arr[l];
return;
}
build(2 * index + 1, arr, l, (l + r) / 2);
build(2 * index + 2, arr, (l + r) / 2 + 1, r);
tree[index] = tree[2 * index + 1] + tree[2 * index + 2];
} public static void add(int l, int v, int index, int L, int R) {
if (L == R) {
tree[index] += v;
return;
}
int mid = (L + R) / 2;
if (l <= mid) {
add(l, v, 2 * index + 1, L, mid);
} else {
add(l, v, 2 * index + 2, mid + 1, R);
}
tree[index] = tree[2 * index + 1] + tree[2 * index + 2];
} }
【AtCoder Beginner Contest 330)】[E - Mex and Update ] 线段树+二分的更多相关文章
- AtCoder Regular Contest 080 (ARC080) E - Young Maids 线段树 堆
原文链接http://www.cnblogs.com/zhouzhendong/p/8934377.html 题目传送门 - ARC080 E - Young Maids 题意 给定一个长度为$n$的 ...
- AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组
题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...
- 【AtCoder Regular Contest 080E】Young Maids [堆][线段树]
Young Maids Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一个排列,每次选出相邻的两个放在队头,要求字典序最小. Input ...
- 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 ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
随机推荐
- 设计模式 - 创建型模式 - 单例模式(C++)
1.前言 单例模式属于创建型模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方 ...
- 洛谷P2241 统计方形 ,棋盘问题升级板,给出格子坐标中矩形以及正方形的计算方法
在做这道题之前我们先了解一下棋盘问题 棋盘问题 (qq.com) 对于棋盘问题,我们可以得出对于一个n*n的正方形方格阵如何求其包含的正方形个数 也就是数每个正方形的中间点,然后将其点排列 ...
- NC54586 小翔和泰拉瑞亚
题目链接 题目 链接:https://ac.nowcoder.com/acm/problem/54586 来源:牛客网 题目描述 小翔爱玩泰拉瑞亚 . 一天,他碰到了一幅地图.这幅地图可以分为 \(n ...
- NC20325 [SDOI2009]HH的项链
题目链接 题目 题目描述 HH有一串由各种漂亮的贝壳组成的项链. HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一 段贝壳,思考它们所表达的含义. HH不断地收集新的贝壳,因此他的项链 ...
- 从零开始手写 mybatis(四)- mybatis 事务管理机制详解
前景回顾 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis. 第二节 从零开始手写 mybatis(二)mybatis interceptor ...
- Java判断一个字符串中是否包含数字
知识点 本例考察以下Java知识点: 正则表达式 关于正则表达式: https://www.runoob.com/java/java-regular-expressions.html Characte ...
- Java开发技巧杂记
杂记一 创建项目的spring initializr,要求是创建spring boot3.0,且不在支持java8语言,且要求语言大于17,所以创建项目时,无法创建srping2.0项目了:如果要创建 ...
- rsyslog 系统日志收集上报(可增加自定义项目日志)
Linux 自带应用,没有复杂的依赖关系却有强大的日志采集上报功能 本文以上报阿里云为例 1.基础配置讲解 /etc/rsyslog.conf 为其主配置文件(不用动) /etc/rsyslog.d/ ...
- 网络上收集的C++常见面试题
1. 进程与线程的关系,图解 进程简单理解就是我们平常使用的程序,进程拥有自己独立的内存空间地址,拥有一个以上的线程. 线程可以理解为轻量级的进程,是程序执行的最小单元.在某个进程启动后,会默认产生一 ...
- win32-CreateDIBSection的使用
使用CreateDIBSection 可以创建一个设备无关位图 #include <windows.h> using namespace std; int main() { HDC hdc ...