Codeforce842D Vitya and Strange Lesson

题意:一个序列(n<3e5),m个查询,每次序列所有的数亦或x,问这个序列的mex(mex定义是最小没有出现过的非负整数),保留每一次的更改

题解:首先要知道mex怎么求,把每一个数分解为二进制,按高位到低位进行建一颗二叉树,可以o(logn)查询到mex

其次要知道异或有结合率,也就是求一个前缀就可以了

分解每次查询的数,从高位到低位遍历,遍历到该为为bit,判断sum[(t<<1)+bit]这棵树有没有装满,装满的话就答案就在另一棵树

#include <bits/stdc++.h>
#define ll long long
#define maxn 300100
int a[maxn], n, m, sum[1<<20];
using namespace std;
void build(){
    for(int i=0;i<n;i++){
        bitset<19>bit(a[i]);
        int t = 1;
        for(int i=18;i>=0;i--){
            if(bit[i] == 0) t = t*2;
            else t =t*2+1;
        }
        sum[t] = 1;
    }
    for(int i=(1<<20)-1;i>=1;i--)
        sum[i>>1] += sum[i];
}
int query(int temp){
    bitset<19>bit(temp);
    int t = 1, ans = 0, cnt;
    for(int i=18;i>=0;i--){
        cnt = (1<<i);
        ans = ans*2;
        if(bit[i] == 0){
            if(sum[t<<1] == cnt) t = t<<1|1, ans++;
            else t = t<<1;
        }
        else{
            if(sum[t<<1|1] == cnt) t = t<<1, ans++;
            else t = t<<1|1;
        }
    }
    return ans;
}
int main(){
    scanf("%d%d", &n, &m);
    for(int i=0;i<n;i++) scanf("%d", &a[i]);
    build();
    int temp = 0;
    while(m--){
        scanf("%d", &n);
        temp ^= n;
        printf("%d\n", query(temp));
    }
    return 0;
}
时间: 2024-10-03 14:55:51

Codeforce842D Vitya and Strange Lesson的相关文章

CodeForces 842D Vitya and Strange Lesson

题目:http://codeforces.com/problemset/problem/842/D 题意:给你n个数,m次查询,每次将数组全部异或一个数后,求没出现过的最小自然数 要求异或后的最小值我们可以用字典树来解决 而每次对数组异或可以替换每次对异或值异或 之后贪心的选取 每次都走左子树,如果左子树满了,才走右子树,这样就能保证是最小 #include<iostream> #include<cstdio> #include<cstring> #include<

cf842d Vitya and Strange Lesson

#include <iostream> #include <cstdio> using namespace std; int s[2000005][2], cnt, n, m, x, uu, ans, dep[2000005], siz[2000005]; void ins(){ int u=0; for(int i=19; i>=0; i--){ int t=(x&(1<<i))>0; if(!s[u][t]) s[u][t] = ++cnt; u

【Codeforces Round #430 (Div. 2) A C D三个题】

·不论难度,A,C,D自己都有收获! [A. Kirill And The Game] ·全是英文题,述大意:    给出两组区间端点:l,r,x,y和一个k.(都是正整数,保证区间不为空),询问是否在[x,y]区间内存在一个整数p,使得p*k属于[l,r],如果存在,则输出'YES',否则输出'NO'.(1<=l,r,x,y<=107) ·分析:     首先看见了107,发现可以直接O(n)暴力枚举:枚举区间[x,y]的所有数,判断它与k的乘积是否在[l,r]中就可以了.从容AC:    

01-trie练习

一般习惯用递归实现01-trie, 可以看做是区间长度为2的幂的权值线段树, 能实现权值线段树的所有操作, 同时还可以实现一些异或操作 const int N = 1<<20; struct {int ch[2],sum;} tr[N<<1]; void ins(int &o, int d, int x) { if (!o) o=++tot; ++tr[o].sum; if (d>=0) ins(tr[o].ch[x>>d&1],d-1,x); }

HZNU 2019 Summer Selection contest 1

A - Nastya Is Buying Lunch CodeForces - 1136D B - Neko Performs Cat Furrier Transform CodeForces - 1152B C - TV Shows CodeForces - 1061D D - Pairs CodeForces - 1169B E - Increasing by Modulo CodeForces - 1169C F - Good Triple CodeForces - 1169D G - T

[小北De编程手记] : Lesson 08 - Selenium For C# 之 PageFactory &amp; 团队构建

本文想跟大家分享的是Selenium对PageObject模式的支持和自动化测试团队的构建.<Selenium For C#>系列的文章写到这里已经接近尾声了,如果之前的文章你是一篇篇的读下来并动手实践的话,我相信你应该可以模拟日常工作中80%常见的手动测试用例了.请注意:我的用词是模拟用例,而不是书写自动化测试用例.一个企业级的自动化测试的构建不是单靠Selenium一种技术就能Hold住的.所谓模拟指的是只能实现自动化的某个Case,但是不能工程化的使用.在本人所接触过几家公司的自动化测试

JMS and ActiveMQ first lesson(转)

JMS and ActiveMQ first lesson -- jms基础概念和应用场景 2011-6-18 PM 9:30 主讲:kimmking <[email protected]> 整理:林木森 ppt下载地址: http://code.google.com/p/activemq-store-mongodb/downloads/list 下面开始: kimmking:介绍下jms和ActiveMQ.在讲JMS之前,我们聊聊相关的背景.谁知道JMS是什么意思? kimmking:对,是

hdoj 5198 Strange Class 水题

Strange Class Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5198 Description In Vivid’s school, there is a strange class(SC). In SC, the students’ names are very strange. They are in the same format: anbncn(a,

新概念 第一册 lesson 59~60

lesson thirteen Is that all? 1.Review What's the time? It's *** o'clock.    It's ten a.m. It's four p.m. 方式状语: by bus/car/bike on foot 句型: They usually...but today,they... 他们通常都干...事情但今天,他们... e.g. They usually go to school by bus,but today,they are