「2017 山东三轮集训 Day6」C(0/1 Trie)

2024-01-30 01:18
文章标签 2017 集训 day6 山东 trie 三轮

本文主要是介绍「2017 山东三轮集训 Day6」C(0/1 Trie),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

如果没有与和或的话可以用可持久化 0 / 1 t r i e 0/1 \ trie 0/1 trie 和 异或 t a g tag tag 解决这个问题
考虑与和或操作
与1和或0是没有意义的,与 0 和或 1 的意义就在于把某一位全部变成 0 或 1
而某一位全部一样过后我们就可以直接记录这一位的状态
于是修改后当某一位由不一样变成完全一样的时候,我们就暴力重构 t r i e trie trie 树,显然只会重构 l o g log log
区间 k k k 大和主席树一样,在 0 / 1 t r i e 0/1\ trie 0/1 trie 上二分就可以了
复杂度 O ( n l o g ( A i ) 2 ) O(nlog(A_i)^2) O(nlog(Ai)2)
不对劲过后暴力重构的方法比较巧妙

#include<bits/stdc++.h>
#define cs const
using namespace std;
int read(){int cnt = 0, f = 1; char ch = 0;while(!isdigit(ch)){ ch = getchar(); if(ch == '-') f = -1; }while(isdigit(ch)) cnt = cnt*10 + (ch-'0'), ch = getchar();return cnt * f;
}
cs int N = 5e4 + 50, M = 32;
int n, m, a[N];
int same[M], tag[M], Xor;
namespace T{cs int N = ::N * 32;int nd, rt[N], ch[N][2], sz[N];void clear(){memset(sz,0,sizeof(int)*(nd+1));memset(ch,0,sizeof(int)*(nd+1)*2);nd=rt[0]=0;}void ins(int las, int &x, int v, int i){x=++nd; sz[x] = sz[las]+1; if(i<0) return;int c=same[i]?0:((v>>i)&1); ch[x][c^1]=ch[las][c^1];ins(ch[las][c],ch[x][c],v,i-1);}int query(int a, int b, int k, int i){if(i<0) return 0;if(same[i]) return query(ch[a][0],ch[b][0],k,i-1)+(tag[i]<<i);else{int c=Xor>>i&1;int sm=sz[ch[b][c]]-sz[ch[a][c]];if(k<=sm) return query(ch[a][c],ch[b][c],k,i-1);else return query(ch[a][c^1],ch[b][c^1],k-sm,i-1)+(1<<i);} }void build(){clear();for(int i=1; i<=n; i++)ins(rt[i-1],rt[i],a[i],30);}
}
int main(){n = read(), m = read();unsigned int And=-1, Or=0; for(int i=1; i<=n; i++) a[i]=read(), And=And&a[i], Or=Or|a[i];for(int i=0; i<=30; i++) same[i]=((And>>i)==(Or>>i));T::build();while(m--){char op[5]; scanf("%s", op);if(op[1]=='o'){int x = read(); Xor ^= x;for(int i=0; i<=30; i++) if(same[i]&&(x>>i&1)) tag[i]^=1;}if(op[1]=='n'){int x = read(); bool FLAG = false;for(int i=0; i<=30; i++)if(!(x&(1<<i))){if(same[i]) tag[i] = 0;else{ FLAG=true; same[i]=1; tag[i]=0; }} if(FLAG) T::build();}if(op[1]=='r'){int x = read();bool FLAG = false;for(int i=0; i<=30; i++)if(x&(1<<i)){if(same[i]) tag[i] = 1; else{ FLAG=true; same[i]=1; tag[i]=1; }} if(FLAG) T::build();}if(op[1]=='s'){int l=read(),r=read(),k=read();cout << T::query(T::rt[l-1],T::rt[r],k,30) << '\n';}} return 0;
}

这篇关于「2017 山东三轮集训 Day6」C(0/1 Trie)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658695

相关文章

2014暑假集训搜索专题

A - 漫步校园 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Description LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。整个HDU校园呈方形布局,可划

2017 版本的 WebStorm 永久破解

1.  在IntelliJ官网中下载 最新版本的WebStorm   下载地址:https://www.jetbrains.com/webstorm/download/#section=windows 2. 获取注册码    获取地址:http://idea.lanyus.com/   点击获取注册码,然后将注册码复制,再打开最新版的WebStorm,将注册码粘贴到激活框中就大功告

Python高效实现Trie(前缀树)及其插入和查找操作

Python高效实现Trie(前缀树)及其插入和查找操作 在Python面试中,考官通常会关注候选人的编程能力、问题解决能力以及对Python语言特性的理解。Trie(前缀树)是一种高效的数据结构,广泛应用于字符串处理、自动补全、拼写检查等场景。本文将详细介绍如何实现一个Trie,并提供插入和查找操作,确保代码实用性强,条理清晰,操作性强。 1. 引言 Trie(前缀树)是一种树形数据结构,

Trie 类型的题目总结

trie字典树可以用来查找单词或者搜索剪枝用。 Implement Trie (Prefix Tree) 实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法。(模板必须记住;没有儿子建立儿子,有儿子走儿子;) class Trie {private class TrieNode {public TrieNode[] children;public b

寒假集训第二天——线性表

现在时间是北京时间1点23分,第二天集训。。。 昨天花了老长时间把线性表看了下,表示很有压力,不大会用。。。 先说下我学到的线性表的皮毛。。。 首先是链表的构建,构建有两种方式: 顺序链表(尾插法建单链表) #include<stdio.h>struct node{int date;struct node *next;};int main(){int i,n;node *he

寒假集训第一天——结构体

期待已久的寒假集训终于开始了,第一天讲的内容比较简单——结构体,之前就学了点。。。 表示普通的结构体会用,涉及到指针都不大会,今天算是学了点指针的用法。。。 作业描述如下: 结构体 今天作业  1.定义一个acmer结构体,包括以下信息:姓名,学号,手机号,做题数,出生日期,其中出生日期date也是一个结构体,包括年、月、日  2.建立结构体数组,实现对多个同学

寒假集训——字典树(模板)

struct node{int v;node *next[26];} T[1000000];int t=0;node *newnode(){node *p=new node;//动态分配//node *p=&T[t++];//静态分配p->v=0;for(int i=0; i<26; i++)p->next[i]=NULL;return p;}void insertnode(node

寒假集训——二叉树

#include <iostream>#include <stdio.h>#include <string.h>#include <queue>using namespace std;typedef struct node{char date;node *lch,*rch;}Bn,*Bt;void cbtree(Bt &T)//先序建二叉树{char c;scanf("%c"

网易2017秋招编程题集合--完全解析

前言 一些大公司的真题里面总有些含金量很高的几个题,网易2017秋招编程题集合里面也有几个题是非常好的,比如说第三题跳石板,第四题黑暗的字符串都是很好的题目。特别是第四题的那种思路之前几乎完全没有接触过,还有第六题最大的奇约数里面还有部分数学思维在里面。 1.回文序列 题目描述:如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如: {1, 2, 1}, {15, 7

【Trie树】模板题-POJ-2001

题意: 给你若干个单词,写出能每个单词的最短前缀 也就是说这个前缀能准确代表这个单词,和其他单词 without ambiguity  思路: 建立字典树存下这几个单词,ct 数组记录每个节点的子节点数,显然子树宽度只有1的话,这个单词就被确定了,改造一下我们的 find_word 函数就行啦 哦。。这个结构体要怎么搞还坑了我一下,要向下面那样定义! 代码: #include