[JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏
题目
题目大意
给你一个数列,每次给出\(r,a,b\),你要找到\(l\in [a,b]\)使得\([l,r-1]\)的异或和最小,
并且要修改\(r\)位置的数。
思考历程
当我看到这题的时候,已经没有什么时间了……
这题需要一点点的博弈基础(题目大意直接将它省掉了),不过还比较简单,就连我这样的博弈白痴都能会。
搞出了之后就来了个最裸的暴力,交了上去。
WA了……
后面发现是答案为\(-1\)的时候我进行了修改操作……改了之后TLE63……
水法
说实在的这数据真的太水了,也是大把大把的人用暴力过去了。
首先暴力方法加一点点优化就能过了(我在打正解的时候打了个暴力对照一下,将这个暴力交上去,AC……)
接下来介绍一下LYL的分类讨论大法:
有两种暴力方式,一种是直接暴力,一种是求前缀和暴力。
LYL在程序中计算了两种暴力的时间,哪种暴力更优秀就使用哪种暴力……
然后轻轻松松地水过了这题……
正解
正解的做法看起来比暴力复杂多了,是分块套\(Trie\)。
其实也很简单。先前缀和一遍,于是问题就转化成了在\([a-1,b-1]\) 中找到某个数使得它异或\(pre_{y-1}\)最小。
对于每个块建个\(Trie\),如果询问整个块,就在\(Trie\)上面找。如果修改,就打个标记。
对于散块直接拆掉,暴力重构。
时间复杂度为\(O(m\sqrt n *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);
}
else
printf("-1\n");
}
return 0;
}
总结
做题的时候要试着BFS地来做题……这样就可以早点发现这题可做了……
不好维护的东西可以考虑一下分块……
[JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏的更多相关文章
- 【NOI2013模拟】坑带的树(仙人球的同构+圆方树乱搞+计数+HASH)
[NOI2013模拟]坑带的树 题意: 求\(n\)个点,\(m\)条边的同构仙人球个数. \(n\le 1000\) 这是一道怎么看怎么不可做的题. 这种题,肯定是圆方树啦~ 好,那么首先转为广义圆 ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(三)
一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)篇 二.本篇目标: l 说说游戏中各种角色的动作.属性以及重构思路 l 进行代码重构让色狼大叔和 ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)
一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)篇 二.本篇目标: l 说说关于cocos2dx手机分辨率适配 l 对前一篇完成的塔防游戏原型进 ...
- 基于HTML5的WebGL设计汉诺塔3D游戏
在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. http://hightopo.com/demo/hanoi_20151106/index.html ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)
一.前提: 完成Hello Game项目的创建编译. 具体参考:Cocos2dx.3x_Hello Game项目创建篇 二.本篇目标: l 说说关于塔防游戏的想法和思路 l 实现一个简单的塔防游戏 ...
- 三国塔防游戏android源码
三国塔防游戏源码,这个游戏源码比较完整的,因为上传有20M限制,把代码工程包分开了,主文件是TFGame,其他res大家按照安卓包加进去就行,欢迎下载并交流 ,大家可以参考一下吧.<ignore ...
- HTML5塔防游戏——《三国塔防》 - Yorhom's Game Box
h3{ font-size:20px; } HTML5塔防游戏--<三国塔防> 游戏介绍: <三国塔防>是一款基于HTML5和Javascript的2D塔防游戏.游戏中除了塔防 ...
- HTML5另类塔防游戏 -《三国战线》公布
关于本作 游戏介绍 本游戏是一款另类塔防游戏.本作以三国这段历史为题材,提供了从颍川之战到官渡之战.官渡之战到夷陵之战.夷陵之战到五丈原之战等15个关卡.在每一个关卡中,你会控制一名三国武将与出现的敌 ...
- [译]终极塔防——运用HTML5从头创建一个塔防游戏
翻译共享一篇CodeProject的高星力作,原文地址:http://www.codeproject.com/Articles/737238/Ultimate-Tower-Defense 下载演示项目 ...
- 使用Unity创建塔防游戏(Part2)
How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...
随机推荐
- 注册页面-使用form模块搭建
基于Django的form模块,快速的搭建注册页面,每个限制条件,都放在form模块里面,不单独对每一项编写标签,使用模版的 for 循环来渲染. 首先设置form模块 在blogs模块下创建一个bl ...
- YApi导入swagger生成的接口
1.swagger的JSON地址,net或netcore开发环境下 2.配置在内网中,localhost请用对应的IP地址替换,在浏览器地址栏中输入以上地址,会返回一个json格式的文档 3.导入 4 ...
- dubbo源码学习(二) : spring 自定义标签
做dubbo的配置时很容易发现,dubbo有一套自己的标签,提供给开发者配置,其实每一个标签对应着一个 实体,在容器启动的时候,dubbo会对所有的配置进行解析然后将解析后的内容设置到实体里,最终du ...
- Dubbo在安全机制方面是如何解决的
Dubbo在安全机制方面是如何解决的 Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权.Dubbo还提供服务黑白名单,来控制服务所允许的调用方.
- python_django_The requested URL /sunck/login/sunck/showmain/ was not found on this server.错误
在我url匹配过程中出现了这样一个错误: 网页显示: Not Found The requested URL /sunck/login/sunck/showmain/ was not found on ...
- vue App项目 首页
1. 下载 npm i mint-ui -S 2. 引入 import MintUI from 'mint-ui' import 'mint-ui/lib/style.css' Vue.use(Min ...
- vue 学习四 了解组件
1组件的注册 全局注册 import Vue from 'vue'; import com from './component1'; Vue.component("com_name" ...
- python模块:typing
很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种现象就 ...
- element中的tree组件实现菜单分配
返回的菜单数据 tree组件的使用 <el-tree ref="menuList" // :data="menuList" // 展示数据 :props= ...
- 在小程序中引入有赞的vant框架组件
这里给大家讲解小程序中如何引入vant组件(我这里是采用小程序的云开发模板) 1.首先在项目的miniprogram文件夹右键在终端中打开,输入命令npm init初始化生成一个package.jso ...