ZCMU - 1783: 秋实大哥与快餐店

简介: ZCMU - 1783: 秋实大哥与快餐店

题目链接:点击打开链接


题目大意:略。


解题思路:数组大小定义为:2e6+10,数组大小与 n,m 是无关的,只与 cid 的最大值相关,算出对应的最多位数,比如:此题目中 cid 最大值为 1000000,对应的二进制位数最多 20位,根据完全二叉树的结点公式,最多 2^21-1。因为这里是边作为 二进制位,结点作为 链接下一个结点的下标。又因为题目说了是 cid^pid 最大的数,所以根据异或相同则0,不同则1的性质可知,只要是高位二进制各异就是最大的数了,所以 query 函数先尽量找与自己不一样的二进制,实在找不到的话,再选择自己的二进制位。


AC 代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n,m,cnt;
int trie[21*maxn][2];
int val[21*maxn];
void init()
{
    cnt=0;
    mem(val,0); mem(trie,0);
}
void add(int cid)
{
    int rt=0,id;
    for(int i=19;i>=0;i--) // 从 19 开始是因为从最高位开始操作
    {
        id=(cid>>i)&1;
        if(!trie[rt][id]) trie[rt][id]=++cnt; // trie[rt][id] 不能等于 0,以免与初始化混淆
        rt=trie[rt][id];
    }
    val[rt]=cid;
}
int query(int pid)
{
    int rt=0,id;
    for(int i=19;i>=0;i--) // 同上
    {
        id=(pid>>i)&1;
        if(trie[rt][id^1]) rt=trie[rt][id^1];
        else rt=trie[rt][id];
    }
    return val[rt];
}
int main()
{
    while(~scanf("%d",&n))
    {
        init();
        int cid;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&cid);
            add(cid);
        }
        scanf("%d",&m);
        int op,id;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&op,&id);
            if(op) printf("%d\n",query(id));
            else add(id);
        }
    }
    return 0;
}


目录
相关文章
|
数据采集 Web App开发 XML
干了这碗“美丽汤”,网页解析倍儿爽
HTML 文档本身是结构化的文本,有一定的规则,通过它的结构可以简化信息提取。于是,就有了lxml、pyquery、BeautifulSoup等网页信息提取库。一般我们会用这些库来提取网页信息。
|
算法 C++ Python
【每日算法Day 107】面试必考:良心推荐,一题三解,不看后悔一辈子
【每日算法Day 107】面试必考:良心推荐,一题三解,不看后悔一辈子
146 0
|
JavaScript 前端开发
不看后悔系列!原来代码还可以这么写!
不看后悔系列!原来代码还可以这么写!
|
网络协议 Linux
可恶,又被小林装到了!
可恶,又被小林装到了!
可恶,又被小林装到了!
|
算法 搜索推荐
对于蓝桥你不得不知的应试技巧
本文适用于蓝桥杯算法比赛赛前使用
329 0
对于蓝桥你不得不知的应试技巧
|
SQL 前端开发 JavaScript
我面试过的那些烂技术大哥
我并不是一个HR,可是我面试过很多人。有年轻的,有年长的,形形色色。 在不同的年纪和岗位上做面试官的内心感觉是不一样的。下面我来讲讲,我做面试官时的一些体验。