[HAOI2015]数组游戏
时间:2019-08-30
本文章向大家介绍[HAOI2015]数组游戏,主要包括[HAOI2015]数组游戏使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
emmm这道题讲真是一道动态规划的题目,然而这道题你打暴力也有70分,但是如果你dp学得还不错的话这道题目的代码实现其实并不难,甚至说,比暴力还容易些。
本题提供两种写法:
暴力做法:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define LL long long
#define inf 0x3f3f3f3f
#define maxn 100005
using namespace std;
int gi()
{
int res=0,s=1; char ch;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') s=-1,ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) res=res*10+ch-48;
return res*s;
}
int n,cnt,mk[100];
int lef[100005],rig[100005],sg[100005],SG[100005];
int ask(int x) {
if(n/x<=maxn) return sg[n/x];
else return SG[n/(n/x)];
}
void ins(int x,int v) {
if(n/x<=maxn) sg[n/x]=v;
else SG[n/(n/x)]=v;
}
int work(int x) {
memset(mk,0,sizeof(mk)); mk[0]=1;
int m=n/x,sum=0,val;
for(int i=2,pos=1;i<=m;i=pos+1) {
pos=m/(m/i),val=ask(x*pos);
mk[sum^val]=1;
if((pos-i+1)&1) sum^=val;
}
for(int i=0;;++i) if(!mk[i]) return i;
}
int main()
{
n=gi();
for(int i=1,pos=0;i<=n;i=pos+1)
pos=n/(n/i),lef[++cnt]=i,rig[cnt]=pos;
for(int i=cnt;i;--i)
ins(rig[i],work(rig[i]));
for(int k=gi();k;--k) {
int num=gi(),res=0;
for(int x;num;--num)
x=gi(),res^=ask(x);
printf("%s",res?"Yes\n":"No\n");
}
return 0;
}
然而暴力只能过样例,打表才能出奇迹,咳咳,下面是正经做法:
正常做法:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=500005;
int n,Q,ans,b[maxn],c[2][maxn],vis[maxn],clk,sqrt_n;
inline int getSG(int x){
x=n/(n/x);
if(x<=sqrt_n) return c[0][x]; else return c[1][n/x];
}
void Solve(){
for(int i=1;i<=n;i=n/(n/i)+1) b[++b[0]]=n/(n/i);
for(int i=b[0];i>=1;i--){
int x=b[i],now=0; clk++; vis[0]=clk;
for(int j=x+x;j<=n;){
int t=(n/(n/j))/x*x, cnt=(t-j)/x+1;
vis[now^getSG(j)]=clk;
if(cnt&1) now^=getSG(j);
j=t+x;
}
int res=0; while(vis[res]==clk) res++;
if(x<=sqrt_n) c[0][x]=res; else c[1][n/x]=res;
}
}
int main(){
scanf("%d",&n); sqrt_n=sqrt(n)+1;
Solve();
scanf("%d",&Q);
while(Q--){
int t,x; scanf("%d",&t); ans=0;
while(t--) scanf("%d",&x), ans^=getSG(x);
if(ans) puts("Yes"); else puts("No");
}
return 0;
}
怎么样,是不是正常写法比暴力还容易些?
原文地址:https://www.cnblogs.com/zi-nai-boboyang/p/11437190.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用XtraBackup备份MySQL 8.0 Part 8 xtrabackup 命令总结
- 代码审计day5
- 使用innobackupex对数据库进行部分备份(指定表或数据库)
- 使用Django获取Linux性能数据并存放在redis中
- MySQL组复制(MGR)全解析 Part 5 MGR单主模式部署指南
- php学习day4
- 使用Python爬取动态网页-腾讯动漫(Selenium)
- MySQL 5.7 常用命令
- MySQL复制全解析 Part 5 MySQL GTID的格式和存储
- Mycat分库分表全解析 Part 1 数据库切分概述
- RoarCTF2019-EasyJava
- ACTF2020新生赛-BackupFile
- DB2 Linux平台安装 Part 5 数据库常见参数配置
- GXYCTF2019-PingPingPing
- 利用cloudflareWorkers制作Google镜像站