【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& ...
随机推荐
- LeetCode组合总和I~IV和背包问题小结
一.组合总和问题 最近在看leetcode的组合问题,一共四道,总结一下共通之处与不同之处. 原题链接: 组合总和 组合总和II 组合总和III 组合总和IV 对比如下,为了便于对比,将原题目的叙述方 ...
- 小知识:Linux如何删除大量小文件
环境:RHEL 6.5 + Oracle 11.2.0.4 需求:使用df -i巡检发现Inodes使用率过高,需要清理删除文件来解决.如果Inodes满,该目录将不能写,即使df -h查看还有剩余空 ...
- 小知识:如何配置OSW添加私网监控
最近遇到一个Case,Oracle Support要求添加私网(心跳网络)监控. OSW默认是没有私网监控的,如需增加只需配置private.net文件,对应采集信息会存放到archive/oswpr ...
- c语言实现内存池
概要 所谓内存池,顾名思义和线程池的设计原理是一样的,为了减少频繁申请释放内存而带来的资源消耗,减少释放内存后产生的内存碎片. 设计理念 为了方便管理内存池的设计通常是划分出一定数量的内存块,这些内存 ...
- NC16466 [NOIP2015]信息传递
题目链接 题目 题目描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为Ti的同学. 游戏开始时, ...
- CSS实现图形效果
CSS实现图形效果 CSS实现正方形.长方形.圆形.半圆.椭圆.三角形.平行四边形.菱形.梯形.六角星.五角星.心形.消息框. 正方形 <section> <div id=" ...
- Swoole从入门到入土(12)——HTTP服务器[Response]
继上一节了解完请求对象之后,这一节我们着重了解响应对象(Response).响应对象主要用于将数据发现到客户端.当 Response 对象销毁时,如果未调用 end 发送 HTTP 响应,底层会自动执 ...
- Neutron详解
一:简介 一.概述 1. 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要创建.修改和删除网络 ...
- Oracle正则表达式实战
原文链接:http://oracle-base.com/articles/misc/regular-expressions-support-in-oracle.php Introduction Exa ...
- 《深入理解Java虚拟机》(二) GC 垃圾回收机制
@ 目录 一.概述 二.判断对象是否需要被回收方式 1.引用计数法: 2.可达性分析法: 三.垃圾收集算法 1.分代收集理论基础 2.标记-清除算法 3.复制-收集算法 4.标记-压缩(整理)算法 5 ...