【UESTC1060/ZCMU1783】秋实大哥与快餐店(字典树)
2016-12-23 14:54
489 查看
记录一个菜逼的成长。。
PS:
一道字典树问题,纯粹考数据结构,涉及建树与匹配。
今年校赛的一道题。。
还好学长队友强,一看就给了思路,然后就由作为主键盘手的我来敲。
用键盘敲的时候有点忐忑,后来用手写了下,就有了信心。
RE了一发,2Y.
———————–分割线————————-
就是把菜的编号转化成21位的二进制数,不够补零。
然后就是插入,节点的值左0右1,根节点不放数。叶子节点放菜的编号。
接着是匹配,因为是按位异或,我们也把客人编号转化成21位二进制数,从末端开始匹配,如果是0(我们需要匹配1)并且右孩子不为-1,就进入右孩子,如果为1(我们需要匹配0)并且左孩子不为-1,就进入左孩子,直到叶子节点,返回值。
具体的看代码实现吧。
PS:
一道字典树问题,纯粹考数据结构,涉及建树与匹配。
今年校赛的一道题。。
还好学长队友强,一看就给了思路,然后就由作为主键盘手的我来敲。
用键盘敲的时候有点忐忑,后来用手写了下,就有了信心。
RE了一发,2Y.
———————–分割线————————-
就是把菜的编号转化成21位的二进制数,不够补零。
然后就是插入,节点的值左0右1,根节点不放数。叶子节点放菜的编号。
接着是匹配,因为是按位异或,我们也把客人编号转化成21位二进制数,从末端开始匹配,如果是0(我们需要匹配1)并且右孩子不为-1,就进入右孩子,如果为1(我们需要匹配0)并且左孩子不为-1,就进入左孩子,直到叶子节点,返回值。
具体的看代码实现吧。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cstdlib> #include <vector> #include <set> #include <map> #include <queue> #include <stack> #include <list> #include <deque> #include <cctype> #include <bitset> #include <cmath> #include <cassert> using namespace std; #define ALL(v) (v).begin(),(v).end() #define cl(a,b) memset(a,b,sizeof(a)) #define bp __builtin_popcount #define pb push_back #define mp make_pair #define fin freopen("D://in.txt","r",stdin) #define fout freopen("D://out.txt","w",stdout) #define lson t<<1,l,mid #define rson t<<1|1,mid+1,r #define seglen (node[t].r-node[t].l+1) #define pi 3.1415926 #define exp 2.718281828459 #define lowbit(x) (x)&(-x) typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII; typedef pair<LL,LL> PLL; typedef vector<PII> VPII; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; template <typename T> inline void read(T &x){ T ans=0; char last=' ',ch=getchar(); while(ch<'0' || ch>'9')last=ch,ch=getchar(); while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar(); if(last=='-')ans=-ans; x = ans; } int bit[25]; int tree[1<<22|100]; int change(int x) { int ind = 0; while(x){ bit[ind++] = x % 2; x /= 2; } for( ; ind < 21; ind++ ){ bit[ind] = 0; } return ind; } void Insert(int x) { int ind = change(x); int t = 1; while(ind - 1 >= 0){ if(bit[ind-1] == 0){ t <<= 1; tree[t] = 0; } else { t = t<<1|1; tree[t] = 1; } if(ind-1 == 0){ tree[t] = x; return ; } ind--; } } int solve(int x) { int ind = change(x); int t = 1; while(ind-1 >= 0){ if(bit[ind-1] == 0){ t = t<<1|1; if(tree[t] == -1){ t -= 1; } } else { t <<= 1; if(tree[t] == -1){ t += 1; } } if(ind-1 == 0)return tree[t]; ind--; } } int main() { int n,m; while(~scanf("%d",&n)){ cl(tree,-1); for( int x,i = 0; i < n; i++ ){ scanf("%d",&x); Insert(x); } scanf("%d",&m); while(m--){ int ope,x; scanf("%d%d",&ope,&x); if(!ope){ Insert(x); } else { printf("%d\n",solve(x)); } } } return 0; }
相关文章推荐
- UESTC 1060 秋实大哥与快餐店(字典树)
- 2015 UESTC 数据结构专题C题 秋实大哥与快餐店 字典树
- [UESTC 1060]秋实大哥与快餐店
- CDOJ 1060 秋实大哥与快餐店 字典树
- UESTC_秋实大哥与快餐店 2015 UESTC Training for Data Structures<Problem C>
- UESTC_秋实大哥与连锁快餐店 2015 UESTC Training for Graph Theory<Problem A>
- USETC 1060 秋实大哥与快餐店
- uestc data structure n 秋实大哥与快餐店
- UESTC_秋实大哥与花 2015 UESTC Training for Data Structures<Problem B>
- 2015 UESTC Training for Search Algorithm & String - J - 全都是秋实大哥 【KMP】
- UESTC 1074 秋实大哥搞算数 栈模拟
- 跟着卿学姐写线段树。。。 ( 秋实大哥与花 UESTC - 1057)
- 2015 UESTC 数据结构专题D题 秋实大哥与战争 变化版本的线段树,合并区间,单点查询
- 2016 UESTC Training for Data Structures N - 秋实大哥搞算数 CDOJ 1074 栈 表达式求值
- [UESTC 1061]秋实大哥与战争
- UESTC-1073-秋实大哥与线段树
- 2015 UESTC 数据结构专题D题 秋实大哥与战争 SET的妙用
- uestc data structure D - 秋实大哥与战争
- UESTC_秋实大哥与战争 2015 UESTC Training for Data Structures<Problem D>
- 2015 UESTC 搜索专题J题 全都是秋实大哥 kmp