【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& ...
随机推荐
- 突破SESSION 0隔离的远程线程注入
与传统的 CreateRemoteThread 函数实现的远线程注入 DLL 的唯一区别在于,突破 SESSION 0 远线程注 入技术是使用比 CreateRemoteThread 函数更为底层的 ...
- 看似简单的input框输入竟然异常卡顿,记一个日常性能问题的排查思路
壹 ❀ 引 我们公司产品主要提供企业项目管理服务,那么自然有配套的desk工单管理系统,用于搜集客户bug以及相关问题反馈.有一天我在测试功能时碰巧发现了一个bug,所以就想着提一个工单记录下方便日后 ...
- NC19872 [AHOI2005]SHUFFLE 洗牌
题目链接 题目 题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小 ...
- OCR 01: EasyOCR
Catalog OCR 01: EasyOCR OCR 02: Tesseract-OCR OCR 03: PaddleOCR Related Links Official site with onl ...
- 焊接LQFP48 和 LQFP64 封装的芯片的记录
记录一下焊接LQFP48 和 LQFP64 封装的芯片的过程 动机 想测一下STC8系列的芯片, 因为同型号的管脚功能基本是相同的, 大封装的可以cover小封装, 而DIP40封装的现在基本买不到, ...
- 【Unity3D】程序纹理简单应用
1 几何纹理应用 本文所有案例的完整资源详见→Unity3D程序纹理简单应用. 1.1 边框 1)边框子图 Border.shadersubgraph 说明:Any 节点用于判断输入向 ...
- Swoole从入门到入土(27)——协程[协程容器]
这一章开始,我们要开始全方位讨论Swoole为我们提供的协程机制.在swoole中所有的协程必须在协程容器里面创建(Swoole\Coroutine\Scheduler),Swoole 程序启动的时候 ...
- win32 - 创建无GUI的消息循环(包含线程窗口的说明)
创建win32窗口需要注册,回调函数一些操作,如果我们不需要窗口的话,可以使用下面代码获得一个仅有消息循环的控制台. ps: 这样做主要对一些不需要窗口但需要消息循环的程序特别有用,比如蓝牙回调. # ...
- CSDN的Markdown编辑器使用说明
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- 第135篇:Three.js基础入门
好家伙,这东西太帅了,我要学会 先放张帅图(都是用three.js做出来的,这我学习动力直接拉满) 还有另外一个 Junni is... 帧数太高,录不了 开始学习 官方文档 1.Thr ...