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

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. 基于keras的文本情感识别

    情感识别是一个典型的分类问题,可以使用Keras来实现,本文是之前整理的笔记,分享出来大家一起学习.   流程描述 Keras文本情感分类基于机器学习算法,会根据大量数据训练出分类模型,然后使用训练好 ...

  2. 精通C语言:打造高效便捷的通讯录管理系统

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言项目 贝蒂的主页:Betty's blog 引言: 在我们大致学习完C语言之后,我们就可以利用目前所学的知识去做一些有意思的项目,而今 ...

  3. AT_abc270_g [ABC270G] Sequence in mod P 题解

    题目传送门 前置知识 大步小步算法 解法 递推式为 \(x_{n}=(ax_{n-1}+b) \bmod p\),发现可以统一消去 \(\bmod p\) ,只在最后参与计算.以下过程省去模运算. 当 ...

  4. Python之凯撒加密

    凯撒加密介绍 在密码学中,恺撒密码是一种最简单且最广为人知的加密技术. 它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文. 例,当偏移量是3的时 ...

  5. centos6关闭防火墙

    service iptable status     --查看防火墙状态 servcie iptables stop     --临时关闭防火墙 chkconfig iptables off      ...

  6. win32- GetMessage的使用

    BOOL bRet; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle th ...

  7. java中sha1.md5,base64到底怎么回事

    MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.MD5用的是哈希函数,在计算机网络中应用 ...

  8. 【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too long. It cannot be more than 4000 characters"错误

    问题描述 使用Docker Compose方式合并多个镜像(Images)文件,然后部署到App Service中,结果失败.报错 Linux Version 太长,不能超过4000个字符. 错误消息 ...

  9. 【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题

    问题描述 在Java应用中,使用 Lettuce 作为客户端SDK与Azure Redis 服务连接,当遇见连接断开后,长达15分钟才会重连.导致应用在长达15分的时间,持续报错Timeout 问题解 ...

  10. 有了 ETL 数据神器 dbt,表数据秒变 NebulaGraph 中的图数据

    本文搭配同主题分享视频阅读更佳,<多数据源的数据治理实践> 如果你装好某款数据库产品,比如:分布式图数据库 NebulaGrpah,跃跃欲试的第一步是不是就让它干活搞数据呢?好的,现在问题 ...