本题可以用线段树+二分的方式实现。代码如下:

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 ] 线段树+二分的更多相关文章

  1. AtCoder Regular Contest 080 (ARC080) E - Young Maids 线段树 堆

    原文链接http://www.cnblogs.com/zhouzhendong/p/8934377.html 题目传送门 - ARC080 E - Young Maids 题意 给定一个长度为$n$的 ...

  2. 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 ...

  3. 【AtCoder Regular Contest 080E】Young Maids [堆][线段树]

    Young Maids Time Limit: 50 Sec  Memory Limit: 512 MB Description 给定一个排列,每次选出相邻的两个放在队头,要求字典序最小. Input ...

  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 ...

  10. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

随机推荐

  1. C语言中如何使两个整型变量计算出浮点型结果

    遭遇的问题 在学习时有一个课后题要求计算两个变量的加减乘除以及取余,想到除法可能会计算出小数,就用浮点型接收除法的结果 int a,b: double div; div = a / b; 但是算出来的 ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 Scrum 简介)--学习笔记

    2.7.2 Scrum 简介 SCRUM 是什么 SCRUM 精髓 SCRUM 框架 角色 SCRUM 是什么 SCRUM 是迄今为止最著名的敏捷方法,主要用于开发.交付和持续支持复杂产品的一个框架, ...

  3. C# 二十年语法变迁之 C# 2,C# 3 ,C# 4参考

    C# 二十年语法变迁之 C# 2,C# 3 ,C# 4参考 https://benbowen.blog/post/two_decades_of_csharp_i/ 自从 C# 于 2000 年推出以来 ...

  4. js 实现call和apply方法,超详细思路分析

    壹 ❀ 引 我在 五种绑定策略彻底弄懂this 一文中,我们提到call,apply,bind属于显示绑定,这三个方法都能直接修改this指向.其中call与apply比较特殊,它们在修改this的同 ...

  5. 2023牛客暑期多校训练营3 ABDHJ

    比赛链接 A 题解 知识点:数学. 当 \(x = 0\) 时,当且仅当 \(y = 0\) 可行. 当 \(x \neq 0\) 时,一定可行,答案为 \(|x-y|\) . 时间复杂度 \(O(1 ...

  6. 吴X凡绯闻女友小怡同学被骂到清空社交平台?各大平台连敏感词库都没有的吗?

    敏感词都没有的平台 最近某加拿大籍贯的 rapper 被曝私生活不检点,且极有可能涉及诱X未成年少女,成为一个 raper. 当然至于是否属实,其实一个人是否是海王,微信.QQ 聊天记录里面记得清清楚 ...

  7. SpringBoot+Shiro+LayUI权限管理系统项目-2.业务模型分析

    1.项目模型介绍 1.1 部门表 部门编码.部门名称.上级部门 1.2 角色表 角色编码.角色名称 1.3 权限表 权限名称.权限标识.权限类型.上级权限.URL.权限图标.是否外部打开 1.4 用户 ...

  8. Oracle使用由字符串索引的二维数组

    –参考文章:http://www.oracle.com/technetwork/issue-archive/2014/14-sep/o54plsql-2245345.html –SAMPLE DATA ...

  9. Java集合框架学习(十) LinkedHashMap详解

    LinkedHashMap介绍 1.Key和Value都允许null: 2.维护key的插入顺序: 3.非线程安全: 4.Key重复会覆盖.Value允许重复. 类定义 public class Li ...

  10. win32- 窗口模板

    主要用于日常的win32窗口的测试 #include <Windows.h> #include <stdio.h> #include <iostream> usin ...