题目

题目大意

给你一个数列,每次给出r,a,br,a,br,a,b,你要找到l∈[a,b]l\in [a,b]l∈[a,b]使得[l,r−1][l,r-1][l,r−1]的异或和最小,
并且要修改rrr位置的数。


思考历程

当我看到这题的时候,已经没有什么时间了……
这题需要一点点的博弈基础(题目大意直接将它省掉了),不过还比较简单,就连我这样的博弈白痴都能会。
搞出了之后就来了个最裸的暴力,交了上去。
WA了……
后面发现是答案为−1-1−1的时候我进行了修改操作……改了之后TLE63……


水法

说实在的这数据真的太水了,也是大把大把的人用暴力过去了。
首先暴力方法加一点点优化就能过了(我在打正解的时候打了个暴力对照一下,将这个暴力交上去,AC……)
接下来介绍一下LYL的分类讨论大法:
有两种暴力方式,一种是直接暴力,一种是求前缀和暴力。
LYL在程序中计算了两种暴力的时间,哪种暴力更优秀就使用哪种暴力……
然后轻轻松松地水过了这题……


正解

正解的做法看起来比暴力复杂多了,是分块套TrieTrieTrie。
其实也很简单。先前缀和一遍,于是问题就转化成了在[a−1,b−1][a-1,b-1][a−1,b−1] 中找到某个数使得它异或prey−1pre_{y-1}prey−1​最小。
对于每个块建个TrieTrieTrie,如果询问整个块,就在TrieTrieTrie上面找。如果修改,就打个标记。
对于散块直接拆掉,暴力重构。
时间复杂度为O(mn∗10)O(m\sqrt n *10)O(mn​∗10),比较优秀……
然而跑不过暴力……


总结

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <climits>
#include <cassert>
#define N 100010
#define maxK 320
int n,m,K;
int st[N],pre[N];
int r[maxK],bel[N];
struct Node{Node *c[2];
} d[32000001];
int cnt;
Node *root[maxK];
inline void insert(Node *t,int x){for (int i=9;i>=0;--i){if (!t->c[x>>i&1])t->c[x>>i&1]=&d[++cnt];t=t->c[x>>i&1];}
}
int lazy[maxK];
inline void reduce(int k){for (int i=r[k-1]+1;i<=r[k];++i)pre[i]^=lazy[k];lazy[k]=0;
}
inline void rebuild(int k){root[k]=&d[++cnt];for (int i=r[k-1]+1;i<=r[k];++i)insert(root[k],pre[i]);
}
inline int find_min(Node *t,int y){int res=0;for (int i=9;i>=0;--i)if (t->c[y>>i&1])t=t->c[y>>i&1];else{t=t->c[y>>i&1^1];res+=1<<i;}return res;
}
inline int get(int x){return pre[x]^lazy[bel[x]];}
inline int query(int y,int a,int b){int res=INT_MAX,aa=bel[a],bb=bel[b];if (aa==bb){if (lazy[aa])reduce(aa),rebuild(aa);for (int i=a;i<=b && res;++i)res=min(res,pre[i]^y);return res;}if (lazy[aa])reduce(aa),rebuild(aa);if (lazy[bb])reduce(bb),rebuild(bb);for (int i=a;i<=r[aa] && res;++i)res=min(res,pre[i]^y);for (int i=r[bb-1]+1;i<=b && res;++i)res=min(res,pre[i]^y);for (int i=aa+1;i<=bb-1 && res;++i)res=min(res,find_min(root[i],y^lazy[i]));return res;
}
inline void change(int l,int c){int ll=bel[l];if (lazy[ll])reduce(ll);for (int i=l;i<=r[ll];++i)pre[i]^=c;rebuild(ll);for (int i=ll+1;i<=m;++i)lazy[i]^=c;
}
int main(){scanf("%d",&n);for (int i=1;i<=n;++i)scanf("%d",&st[i]),pre[i]=pre[i-1]^st[i];K=sqrt(n);for (int i=1;i*K<=n;++i)r[++m]=i*K;if (n%K)r[++m]=n;for (int i=1;i<=m;++i){root[i]=&d[++cnt];for (int j=r[i-1]+1;j<=r[i];++j){insert(root[i],pre[j]);bel[j]=i;}}int T;scanf("%d",&T);while (T--){int y,a,b;scanf("%d%d%d",&y,&a,&b);int xo=query(get(y-1),a-1,b-1),v=get(y)^get(y-1);if (xo<v){printf("%d\n",v-xo);change(y,v^xo);}elseprintf("-1\n");}return 0;
}

总结

做题的时候要试着BFS地来做题……这样就可以早点发现这题可做了……
不好维护的东西可以考虑一下分块……

[JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏相关推荐

  1. 【线段树】【FeyatCup】——2.法法塔的奖励

    首先感谢并膜拜两位大佬 wyl8899 & 法法塔 感谢两位的出题! 题目: 法法塔是很喜欢写程序的.所以冒着就算码农屌丝一辈子的风险也大无畏地写着程序. 码农们为了表彰法法塔的坚持与执着,决 ...

  2. 序贯高斯模拟和普通克里格法的区别

    序贯高斯模拟和普通克里格法的区别 1.序贯高斯模拟 模拟结果整体分布较离散,突出原始数据的非均质性和不确定性. 可产生多个结果. 2.普通克里格法 模拟结果追求最高的估值精度和最小的估值方差,空间分布 ...

  3. 最近迷上了自走棋塔防游戏,玩法比较休闲,而且耐玩!

    梦塔防-自走棋 梦塔防手游是一款3V3即时对战类手机游戏,也是自走棋模式打造的游戏,游戏以策略元素为主,玩家在游戏中可以自由调配兵种,以及功防阵局,丰富的兵种以及精致的游戏界面,为你提供更好的游戏体验 ...

  4. 365. 水壶问题-暴力模拟倒水过程-递归法

    365. 水壶问题-暴力模拟倒水过程-递归法 有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升.水的供应是无限的.确定是否有可能使用这两个壶准确得到 targetCa ...

  5. [原创]测试用例设计之场景法法

    [原创]测试用例设计之"场景法"法  场景法设计测试用例,主要用在于事件触发流程中,当某个事件触发然后就形成相应的场景流程,不同的事件触发,不同顺序和不同的处理结果,就形成一系列的 ...

  6. 手机h5像素_塔防游戏:全民主公H5,最好玩的塔防游戏

    小编带你发现精彩好玩的游戏! 今天小编推荐的这款游戏叫<全民主公H5>, 本公众号持续更新, 小编将搜罗全网人气最高,最热门的小游戏大全, 仙侠游戏,武侠游戏,魔幻游戏,塔防游戏,SLG策 ...

  7. 开发者已将您从测试计划中移除_深度合作,Ohayoo定制模式为开发者提供更全面的支持|塔防|游戏|休闲游戏|ohayoo|塔防游戏...

    Ohayoo和成都这个城市的缘分由来已久.据统计,在过去一年多时间里,Ohayoo为成都地区超过50家开发者提供了产品调优上的建议,与超过20家开发者建立了实质性的合作关系,并储备了待上线产品10余款 ...

  8. 塔防游戏的路径寻找算法分析

    在塔防游戏中,有很多敌人都是向着同一目标前进的.在众多塔防游戏当中,有一条或几条预定好的路径.在一些塔防游戏中,比如经典的<Desktop Tower Defense>,你可以将塔放在地图 ...

  9. 用Unity开发一款塔防游戏(一):攻击方设计

    大家好.偶尔想起了这个手把手教学的.但现已长满杂草的坑,还是来挖几铲子. 这一期的游戏是最常见的类型之一--塔防. 塔防游戏相信大家并不陌生,几个主要元素如下: 1.敌方士兵 2.我方防御塔 3.我方 ...

  10. GemCraft Labyrinth:超耐玩的在线flash塔防游戏

    GemCraft Labyrinth是一个在线flash塔防游戏,中文名字可以理解为宝石塔防.这个游戏拥有众多的关卡(169关),所以和植物大战僵尸一样十分的耐玩,除此之外,独特的宝石合成模式.技能点 ...

最新文章

  1. PHPCMS修改域名
  2. HDU - 3410 Passing the Message 单调递减栈
  3. 《C++必知必会》读书笔记2
  4. The requested URL was not found on the server
  5. android启动其他app的服务器,Android中通过外部程序启动App的三种方法
  6. 面试从开始到结束, 必备的一些小技巧
  7. Dubbo Metrics 发布新版本 2.0.1 | Dubbo 的度量统计基础设施
  8. 过滤html标签 去除html标签
  9. 数据库复习(前四章)
  10. php支付宝h5接口,支付宝H5支付plus版接口文档.PDF
  11. 程序员整体架构之基础架构
  12. paypal标准支付流程图
  13. python 100days github_GitHub - 382982408/Python-100-Days: Python - 100天从新手到大师
  14. 文件方式实现完整的英文词频统计实例
  15. python之dlib使用摄像头实时检测人脸
  16. 飞飞CMS最新版本DC04电脑端网站模板
  17. 基于Go语言GoFrame+Vue+ElementUI实现的权限控制系统
  18. 【C语言】实现简单通讯录系统(源码)
  19. VVC中对CU进行分类,同时进行分区模式选择
  20. 如何快速获取已发表学术论文的期刊封面及目录(caj格式下载和caj转pdf)

热门文章

  1. 中国供应链金融行业全景调研与发展战略研究规划报告2022-2028年版
  2. 电子元器件3D模型免费下载资源
  3. docker是干什么的_Docker超简单入门教程
  4. PC端微信更新至3.7.0版文件保存至MsgAttach文件夹乱码问题解决
  5. juniper防火墙HA详解
  6. A站、B站、C站、D站、E站、F站、G站、H站、I站、J站、K站、L站、M站、N站、T站…Z站 ?
  7. 说明书丨亲和纯化驴抗绵羊IgG(H+L)二抗
  8. java将sql数据转xml文件_把从SQL中取出的数据转化成XMl格式
  9. html中如何写平方根等,开方符号 数学符号平方根号等怎么输入
  10. 不是技术牛人,如何进去自己梦想的公司