题目描述

【题目背景】

蜀汉章武元年(221年),刘备为报吴夺荆州、关羽被杀之仇,率大军攻吴。吴将陆逊为避其锋,坚守不战,双方成对峙之势。蜀军远征,补给困难,又不能速战速决,加上入夏以后天气炎热,以致锐气渐失,士气低落。刘备为舒缓军士酷热之苦,命蜀军在山林中安营扎寨以避暑热。陆逊看准时机,命士兵每人带一把茅草,到达蜀军营垒时边放火边猛攻。蜀军营寨的木栅和周围的林木为易燃之物,火势迅速在各营漫延。蜀军大乱,被吴军连破四十余营。陆逊火烧连营的成功,决定了夷陵之战蜀败吴胜的结果。

【问题描述】

刘备带兵深入吴境,陆逊却避而不出,蜀军只得在山林中安营扎寨。而刘备在扎营时却犯了兵家大忌,将兵营排列成一条直线,远远看去,就像是一条串着珠子的链,美其名曰:链寨。如果吴军将领是一般人,那么这也许不算什么,而陆逊何许人也,他可是江东才子,能力不低于周瑜的一代儒将。他看到刘备这样排阵,心生一计,决定用火攻破阵。然而,火计除了要有风,选定引火点也非常重要,对于刘备的布阵,最佳引火点一定是n个兵营中的一个。而因为风水轮流转,每天的最佳引火点都不一样。我们给每个兵营定下一个固定不变的火攻值Ai,每天定下一个风水值K,对于每天的最佳引火点,显然是所有兵营中火攻值与风水值异或的结果最大的那一个兵营。然而,陆逊是个谨慎的人,他要观察时机,在m天中选定一个最佳的进攻的日期,为此他演算出了这m天每天的风水值,然后他希望你能够告诉他这m天每天最佳引火点的兵营编号。

输入

第一行n,m,代表有n个兵营,m天。

接下来一行有n个非负整数,代表这n个兵营的火攻值。

接下来一行有m个非负整数,代表这m天的风水值。

输出

输出共m行,每行输出一个整数,代表第m天最佳引火点的编号。

如果存在多个最佳引火点使得火攻值与风水值的异或值最小,请任意输出一组解即可。

样例输入

3 2 1 2 3 4 5

样例输出

3 2

提示

【样例解释】

对于第1天,由于4 xor 1=5, 4 xor 2=6, 4 xor 3=7,选择第3个引火点是最佳的。

对于第2天,由于5 xor 1=4, 5 xor 2=7, 5 xor 3=6,选择第2个引火点是最佳的。

【数据规模和约定】

对于30%数据,n<=1000,m<=1000

对于100%数据,n<=100000,m<=100000, 0<=k,ai<=2147483647

题解

一道比较裸的trie树,但是自己原来不怎么会trie树,就凭着感觉打,没想到竟然对了

注意这道题的ai很大,所以我们不能开超大的数组,要编号一下

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #define N 100005
 6 using namespace std;
 7 int n,m,x,cnt;
 8 int p[32];
 9 int a[N];
10 struct node{
11     int l,r,val;
12 }trie[32*N];
13 void insert(int x,int id){
14     int len=0;
15     while (x){
16         p[++len]=x%2;
17         x>>=1;
18     }
19     int y=1;
20     for (int j=32;j>len;j--){
21         if (!trie[y].l) trie[y].l=++cnt;
22         y=trie[y].l;
23     }
24     for (int j=len;j>=1;j--)
25         if (p[j]){
26             if (!trie[y].r) trie[y].r=++cnt;
27             y=trie[y].r;
28         } else{
29             if (!trie[y].l) trie[y].l=++cnt;
30             y=trie[y].l;
31         }
32     trie[y].val=id;
33 }
34 int find(int x){
35     int len=0;
36     while (x){
37         p[++len]=x%2;
38         x>>=1;
39     }
40     int y=1;
41     for (int j=32;j>len;j--)
42         if (!trie[y].r) y=trie[y].l; else y=trie[y].r;
43     for (int j=len;j>=1;j--)
44         if (p[j])
45             if (!trie[y].l) y=trie[y].r;
46                         else y=trie[y].l;
47             else
48             if (!trie[y].r) y=trie[y].l;
49                         else y=trie[y].r;
50     return trie[y].val;
51 }
52 int main(){
53     scanf("%d%d",&n,&m);
54     cnt=1;
55     for (int i=1;i<=n;i++){
56         scanf("%d",&a[i]);
57         insert(a[i],i);
58     }
59     for (int i=1;i<=m;i++){
60         scanf("%d",&x);
61         printf("%d\n",find(x));
62     }
63     return 0;
64 }

View Code

转载于:https://www.cnblogs.com/zhuchenrui/p/7803223.html

YYHS-吴传之火烧连营(梦回三国系列T3)(trie树)相关推荐

  1. 2016暑期集训10 C吴传之火烧连营

    吴传之火烧连营 时间限制: 1 Sec 内存限制: 128 MB 题目描述 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势.蜀军远征, ...

  2. 魏传之长坂逆袭、蜀传之单刀赴会、吴传之火烧连营

    A.魏传之长坂逆袭 时间限制: 1 Sec  内存限制: 128 MB 题目描述 众所周知,刘备在长坂坡上与他的一众将领各种开挂,硬生生从曹操手中逃了出去,随后与孙权一起火烧赤壁.占有荆益.成就霸业. ...

  3. Jzoj3908 吴传之火烧连营 (梦回三国系列)

    [题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势.蜀军远征,补给困难,又不能速战速决,加上入夏以后天气炎热,以致锐气渐失, ...

  4. trie树——【吴传之火烧连营】

    突然发现好像没有讲过一种叫做tire树的神奇东西. 问题描述: 题目描述 [题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆逊为避其锋,坚守不战,双方成对峙之势 ...

  5. JZOJ 3908 吴传之火烧连营

    题目大意 题目大意就是对于一个序列,多次询问求在 xor K 的情况下最大值. 原题 Description [题目背景] 蜀汉章武元年(221年),刘备为报吴夺荆州.关羽被杀之仇,率大军攻吴.吴将陆 ...

  6. 【NOIP2014模拟11.1B组】吴传之火烧连营(tree)

    题目大意 对于一个序列,多次询问求在 xor K 的情况下最大值. 分析 我们将每一个数拆分成 2 进制,然后映射进一棵 trie 中,然后对于每个询问,根据异或的性质(1 xor 1=0,1 xor ...

  7. 【NOIP2014模拟11.1B组】吴传之火烧连营

    trie,动态开点. 我们可以将输入的a[],b[]全部看成二进制数. 然后按照二进制中的位置从大到小开始建trie. 如果trie不会的可以自己手动普及一下. 建好a[]的trie后,我们可以对于每 ...

  8. Jzoj3907 蜀传之单刀赴会(梦回三国系列)

    [题目背景] 公元215年,刘备取益州,孙权令诸葛瑾找刘备索要荆州.刘备不答应,孙权极为恼恨,便派吕蒙率军取长沙.零陵.桂阳三郡.长沙.桂阳蜀将当即投降.刘备得知后,亲自从成都赶到公安(今湖北公安), ...

  9. YYHS-蜀传之单刀赴会(梦回三国系列T2)(最短路+状压dp)

    题目描述 [题目背景] 公元215年,刘备取益州,孙权令诸葛瑾找刘备索要荆州.刘备不答应,孙权极为恼恨,便派吕蒙率军取长沙.零陵.桂阳三郡.长沙.桂阳蜀将当即投降.刘备得知后,亲自从成都赶到公安(今湖 ...

最新文章

  1. R语言绘制带聚类树的堆叠柱形图
  2. 又见yx — 说说IT公司的团队头儿
  3. python科学计算基础教程pdf下载-Python科学计算基础教程_PDF电子书
  4. 元素,布局方式,BFC和清除浮动
  5. Linux下的一些问题收集及解决方法(一)
  6. easyui required 提交验证
  7. 如何学习挖掘漏洞[参考多方面资料]
  8. 《每日论文》You Only Look Once: Unified, Real-Time Object Detection
  9. Codechef August Challenge 2018 : Coordinate Compression
  10. Dubbo服务导出原理
  11. matlab 正交特征向量,怎么对一个矩阵进行对称正交化?? matlab
  12. 项目:关于分层,DAO、domain、service、servlet的一些理解
  13. 威纶通宏开机后使用初始化宏指令_你按下电脑开机键后,电脑都干了些什么?...
  14. Atitit 提升稳定性 错误处理 全局错误捕获 1.2. 可以uncaughtException来全局捕获未捕获的Error, 使用uncaughtException 2 1.2.1. 使用 t
  15. 使用DevExpress的PdfViewer实现PDF打开、预览、另存为、打印(附源码下载)
  16. 计算机是如何工作的?
  17. javamail 邮件发送、带格式、已保存
  18. fastnest怎么一键排版_文字一键排版工具,排版助手(gidot typesetter)使用攻略
  19. @order 注解用法
  20. 以太坊EVM智能合约交易信息中Input和Logs解码

热门文章

  1. WIN 7下安装WIN 10双系统教程
  2. 2020 计蒜之道 预赛 第一场 A. 五子棋
  3. 利用 Ophis 编写 Commodore 64 programs PRG 程序(四)
  4. QQ 登录/分享接入流程
  5. bat批处理教程_超级详细教程
  6. 新建、扩建、改建、技改区分
  7. 了解膝关节损伤后的支具-关于韧带断裂,半月板术后康复
  8. 使用Windows Embedded Standard 7 DIY互联网电视
  9. 监控储存服务器系统,监控储存服务器系统
  10. 2022年“菲尔兹奖”,颁给了这四位年轻人