题目描述

Description
法法塔和wyl8899都喜欢玩游戏。但是每次玩游戏法法塔都被wyl8899虐。

为了安慰可怜的法法塔,wyl8899决定大发慈悲,修改了一下游戏规则。

是这样的,这儿有一堆石子排成一列,每次wyl8899让hza选择一个区间进行游戏。游戏嘛,就是采用最普通的规则:两人轮流操作,每次选择一堆石子,取掉不为0的石子数,没法操作者失败。法法塔要做的是这样的:

我们现在定义一个区间的弱菜值:表示如果法法塔先取石子,而且法法塔第一步取的石子规定是最右边的那堆的话,为了必胜,第一步需要取的石子数。如果没法获胜的话,那么弱菜值就是-1。

法法塔要选择一个区间[l,r],使得r为wyl8899给定的某个数,l属于[a,b],a,b也是wyl8899给定的,要求这个区间的弱菜值是满足前面的条件中最大。请给出这个最大的弱菜值。

如果最大弱菜值不为-1,法法塔就会马上取走该区间最右端的石子堆最大弱菜值数量的石子。

Input
第一行一个正整数n,描述了石子的堆数,接下来一行n个数,描述每堆石子的数目。

接下来一行m,表示将进行要进行m次游戏,每次游戏由三个值刻画,r,a,b。r表示被选定的右端点,[a,b]表示选择的区间的左端点的范围

Output
对于每个询问输出最大的弱菜值。

Sample Input
输入1:

12

662 477 125 483 17 560 232 59 176 928 807 659

5

5 2 5

4 4 4

2 1 2

6 4 6

6 2 3

输入2:

7

230 883 456 1020 966 899 610

2

7 1 2

2 1 2

输入3:

11

392 808 14 71 393 79 11 74 713 232 142

5

8 3 8

9 5 9

3 1 1

8 2 8

7 4 6

Sample Output
输出1:

17

483

477

560

-1

输出2:

352

883

输出3:

74

713

-1

-1

-1

Data Constraint
n<=100000,m<=10000,每堆的石子数<=1000。

题解

口胡警告
O3警告

题解的做法是把n分块,每个块建可持久化trie
每次修改就对整块打标记,对散块暴力
查找就尽量往小的找(因为这样剩下的才能尽量小)
时间复杂度:O(m*√n*logS)


下面是自己在考场上想到的sb做法
建1024棵权值线段树,每棵线段树对应一种异或后缀的出现位置
查找就暴力枚举判断对应区间内是否存在某个后缀
修改就相当于第R位改变的位置(设其对应的二进制为s)在1~R的异或后缀取反,等于把第i棵树和第i^s棵树的1~R区间交换
时间复杂度:O(m*1024*logn)

因为题解的复杂度写错了所以其实这样做更慢

code

因为是自己乱写的所以不删注释了

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define low(x) (x&(-(x)))
using namespace std;int a[100001];
int tr[10000001][3];
int Tr[100001];
char s1[1400001];
int Q,n,i,j,k,l,Find,ans,R,A,B,s,len,I;
bool bz;
char *Ch=s1;int getint()
{register int x=0;while (*Ch<'0' || *Ch>'9') *++Ch;while (*Ch>='0' && *Ch<='9') x=x*10+(*Ch-'0'),*++Ch;return x;
}void swap(int &x,int &y)
{int z=x;x=y;y=z;
}void New(int t,int x)
{if (!tr[t][x])tr[t][x]=++len;
}void CHANGE(register int t,int s)
{while (t<=n){Tr[t]^=s;t+=low(t);}
}
int FIND(register int t)
{register int S=0;while (t){S^=Tr[t];t-=low(t);}return S;
}void change(register int t,register int l,register int r,int x)
{register int mid=(l+r)/2;++tr[t][2];if (l==r) return;if (x<=mid){New(t,0);change(tr[t][0],l,mid,x);}else{New(t,1);change(tr[t][1],mid+1,r,x);}
}void exchange(register int fa1,register int fa2,register int t1,register int t2,register int l,register int r,int x,int y)
{register int mid=(l+r)/2;if (x<=l && r<=y){swap(tr[fa1][tr[fa1][1]==t1],tr[fa2][tr[fa2][1]==t2]);return;}if (x<=mid && (tr[tr[t1][0]][2] || tr[tr[t2][0]][2])){New(t1,0);New(t2,0);exchange(t1,t2,tr[t1][0],tr[t2][0],l,mid,x,y);}if (mid<y  && (tr[tr[t1][1]][2] || tr[tr[t2][1]][2])){New(t1,1);New(t2,1);exchange(t1,t2,tr[t1][1],tr[t2][1],mid+1,r,x,y);}//  cout<<tr[t1][2]<<" "<<tr[tr[t1][0]][2]+tr[tr[t1][1]][2]<<endl;tr[t1][2]=tr[tr[t1][0]][2]+tr[tr[t1][1]][2];tr[t2][2]=tr[tr[t2][0]][2]+tr[tr[t2][1]][2];
}void find(register int t,register int l,register int r,int x,int y)
{register int mid=(l+r)/2;if (x<=l && r<=y){Find+=tr[t][2];return;}if (x<=mid && tr[tr[t][0]][2])find(tr[t][0],l,mid,x,y);if (Find) return;if (mid<y  && tr[tr[t][1]][2])find(tr[t][1],mid+1,r,x,y);
}int main()
{//  freopen("A7_9_3.in","r",stdin);
//  freopen("A7_9_3.out","w",stdout);fread(s1,1,1400001,stdin);n=getint();len=1024;fo(i,1,n){a[i]=getint();CHANGE(n-i+1,a[i]);}k=0;fd(i,n,1){k^=a[i];change(k+1,1,n,i);}Q=getint();for (;Q;--Q){R=getint(),A=getint(),B=getint();s=FIND(n-R+1);//      cout<<"  "<<s<<endl;//      if (Q==6- 3)
//      {//          fo(i,0,1023)
//          {//              Find=0;
//              find(i+1,1,n,2,2);
//
                cout<<Find<<endl;
//              if (Find)
//              cout<<i<<" "<<a[R]<<endl;
//          }
//      }fo(I,0,a[R]-1){Find=0;find((I^s)+1,1,n,A,B);if (Find)break;}//       Find=0;
//      find(s+1,1,n,A,B);
//      cout<<s<<" "<<Find<<" "<<A<<" "<<B<<endl;
//      return 0;if (I<a[R]){printf("%d\n",a[R]-I);s=a[R]^I;l=low(s);//          cout<<s<<" "<<l<<endl;fo(i,0,1023)if (i&l){//              if (Q==6-2 && (i^s)==4)
//              {//                  cout<<tr[i+1][2]<<" "<<tr[(i^s)+1][2]<<endl;
//              }if (R<n)exchange(0,0,i+1,(i^s)+1,1,n,1,R);else{swap(tr[i+1][0],tr[(i^s)+1][0]);swap(tr[i+1][1],tr[(i^s)+1][1]);swap(tr[i+1][2],tr[(i^s)+1][2]);}//              if (Q==6-2 && (i^s)==4)
//              cout<<tr[i+1][2]<<" "<<tr[(i^s)+1][2]<<endl;//              if (Q==6-2 && (i^s)==4)
//              {//                  if (Q==6- 2)
//                  {//                      fo(i,0,1023)
//                      {//                          Find=0;
//                          find(i+1,1,n,2,2);
//
//          //              cout<<Find<<endl;
//                          if (Find)
//                          cout<<i<<" "<<a[R]<<endl;
//                      }
//                  }
//                  return 0;
//              }}a[R]=I;CHANGE(n-R+1,s);}elseprintf("-1\n");}
}

jzoj3339. wyl8899和法法塔的游戏相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 如何高效设计游戏——塔防游戏设计方案

    前言 目前国内市场的游戏普遍为一些带有"快餐特色的RPG"游戏居多,并且这一类型的游戏的设计思路已经发展成为游戏开发者们"月经"一样的存在,有很多人" ...

  7. unity塔防游戏怪物转向_玩一玩这款塔防游戏?

    关注上方蓝字获得更多内容 今日分享塔防游戏 塔防游戏,曾经也是风靡一时,非常受人喜欢的. 今天小皮分享的这款和保卫萝卜可以说是异曲同工,还是不错的. 该游戏拥有精美的画面,并且在形象设计上也制作的相当 ...

  8. unity塔防游戏怪物转向_英雄塔防物语游戏下载-英雄塔防物语官方版 v2.3.8最新版...

    英雄塔防物语手游欢迎大家来下载,英雄塔防物语是一款二次元塔防放置手游,这款游戏为大家带来全新的角色,玩家可以收集卡牌进行组合对战,玩法十分丰富,还有丰富的剧情等你来解锁哦. [游戏简介] 英雄塔防物语 ...

  9. unity塔防游戏怪物转向_野生防御塔游戏下载-野生防御塔游戏安卓版 v1.0

    野生防御塔是一款塔防策略类型的游戏,经典好玩的塔防策略玩法等你来,在这开启一场刺激的塔防吧.你需要依靠塔防建筑抵挡怪物的攻击,同时也需要面对对手的偷袭.依靠击杀怪物获得的金币可以购买一些道具升级你的塔 ...

  10. 汉诺塔小游戏 c语言

    相信大家在学习C语言嵌套的时候已经学习过经典问题汉诺塔了,我学习时就想能不能搞个汉诺塔的游戏出来,结果睡了一觉就给忘了.今天突然想起,搞出来与大家分享,水平一般,但符合汉诺塔规则.最终代码我放在文章最 ...

最新文章

  1. AWS无服务开发Lambda系列之本地上传包至Lambda
  2. MaxCompute,基于Serverless的高可用大数据服务
  3. Mysql中查找并删除重复数据的方法
  4. 什么时候觉得自己该离职了?
  5. mysql下载的解压包怎么用_教你安装Mysql(解压版/非安装包)图文教程
  6. 股票分析之主力资金排序分析
  7. 关于Python的那些话
  8. matlab如何设全局变量,请问MATLAB中如何修改全局变量
  9. c语言 char *str 与char str[]区别
  10. [vijos 1770]大内密探
  11. 后台写入前台的日期错误,变成一串数字解决方案
  12. 深入理解Activity的生命周期
  13. 海康威视摄像机的实时读取篇一(OpenCV开发环境配置)
  14. 爬虫抓取BestCoder的比赛排名
  15. Mesh基础模型(Foundation models)(一)
  16. 阿里云ECS问题大全【转自阿里云社区】
  17. shutdown配合at命令 实现定时关机,重启---
  18. 基本共射放大电路的动态分析(低频、Ri、Ro大小对电路影响的分析)
  19. (贪心)CF1428E. Carrots for Rabbits
  20. 2013春季巡讲讲稿—基于传统数据库的大型系统构建—赵振平—中国人民公安大学CSDN高校俱乐部

热门文章

  1. Access仿Excel的RoundUp函数向上取整的方法。
  2. SCI缩略词如何定义
  3. 微信小程序实战–集阅读与电影于一体的小程序项目(二)
  4. 数据分析入门之2012美国大选政治献金项目
  5. STM32F103_study60_The punctual atoms(Input capture experimentInput)
  6. java8时间转换函数学习,教你脱离jdf转换的痛苦
  7. 原生JS记忆翻牌小游戏
  8. 我在南方的艳阳里大雪纷飞
  9. 马王堆汉墓帛书本《道德经》解读
  10. 《道德经》马王堆出土帛书版