bzoj 4028 : [HEOI2015]公约数数列
之前看了好几次都没什么思路,今天下定决心把这题切了。
观察到$0-x$的gcd最多变化log次,因为它每次变化一定至少要去掉一个质因子,所以我们可以枚举gcd。
因为数据范围比较小,所以想到了分块。
设T为块的大小。
维护块首到块里每个位置的gcd和xor,再把xor排序。
修改的时候暴力改就行,复杂度$TlogT$。
询问的时候如果gcd在这个块里变化了,就把这个块暴力扫一遍,否则说明gcd在这个块里不变,相当于在区间里查是否有某个特定的值,随便二分一下,复杂度$T log inf+\frac{n}{T}logT$。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define N 100005
#define d 200
#define ll long long
using namespace std;
const int inf = ;
int gcd(int a,int b)
{
if(!b)return a;
return gcd(b,a%b);
}
int n;
int a[N];
int gd[N],xr[N],be[N];
vector<int>g[N];
vector<int>::iterator it;
bool cmp(int x,int y)
{
if(xr[x]==xr[y])return x<y;
return xr[x]<xr[y];
}
void gai(int x,int y)
{
int k=be[x];a[x]=y;
int l=(k-)*d+,r=min(k*d,n);
int xx=,now=a[l];g[k].clear();
for(int i=l;i<=r;i++)
{
now=gcd(now,a[i]);
xx=xx^a[i];
gd[i]=now;
xr[i]=xx;
g[k].push_back(i);
}
sort(g[k].begin(),g[k].end(),cmp);
}
void solve(ll x)
{
int now=a[];int cnt=,ed,xx=;
for(int i=;i<=n;i+=d)
{
cnt++;ed=min(n,i+d-);
if(gd[ed]%now!=)
{
for(int j=i;j<=ed;j++)
{
if(gd[j]%now!=)now=gcd(now,gd[j]);
if(x%now==&&x/now==(ll)(xx^xr[j]))
{
printf("%d\n",j-);
return ;
}
}
}
else
{
if(x%now==&&x/now<=inf)
{
int tmp=x/now;
int l=,r=g[cnt].size()-;
tmp^=xx;
if(xr[g[cnt][r]]<tmp)
{
xx^=xr[ed];
continue;
}
while(l<r)
{
int mid=(l+r)>>;
if(xr[g[cnt][mid]]>=tmp)r=mid;
else l=mid+;
}
if(xr[g[cnt][r]]==tmp)
{
printf("%d\n",g[cnt][r]-);
return ;
}
}
}
xx^=xr[ed];
}
puts("no");
return ;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
int cnt=;
for(int i=;i<=n;i+=d)
{
cnt++;
int ed=min(n,i+d-);
int now=a[i];int xx=;
for(int j=i;j<=ed;j++)
{
be[j]=cnt;
now=gcd(now,a[j]);
xx=xx^a[j];
gd[j]=now;
xr[j]=xx;
g[cnt].push_back(j);
}
sort(g[cnt].begin(),g[cnt].end(),cmp);
}
int m;scanf("%d",&m);
char s[];
int t1,t2;ll t3;
for(int i=;i<=m;i++)
{
scanf("%s",s);
if(s[]=='M')
{
scanf("%d%d",&t1,&t2);
t1++;gai(t1,t2);
}
else
{
scanf("%lld",&t3);
solve(t3);
}
}
return ;
}
bzoj 4028 : [HEOI2015]公约数数列的更多相关文章
- BZOJ 4028: [HEOI2015]公约数数列 分块
4028: [HEOI2015]公约数数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4028 Description 设计一个数据结 ...
- BZOJ 4028: [HEOI2015]公约数数列 【分块 + 前缀GCD】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=4028 4028: [HEOI2015]公约数数列 Time Limit: 10 Sec ...
- 【BZOJ4028】[HEOI2015]公约数数列(分块)
[BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(g ...
- 【BZOJ4028】[HEOI2015]公约数数列 分块
[BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...
- bzoj4028: [HEOI2015]公约数数列
Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x ...
- 洛谷 P4108 / loj 2119 [HEOI2015] 公约数数列 题解【分块】
看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(a_0, a_1, \ldots , a_{n-1}\),你需要支持以下两种操作: MODIFY id x: 将 \ ...
- luogu P4108 [HEOI2015]公约数数列——solution
-by luogu 不会啊.... 然后%了一发题解, 关键是 考虑序列{$a_n$}的前缀gcd序列, 它是单调不升的,且最多只会改变$log_2N$次,因为每变一次至少除2 于是,当我们询问x时: ...
- [HEOI2015]公约数数列
不错的分块题 gcd和xor其实并没有联系 这里,xor的按位性质没有半点卵用 gcd的性质却很关键: 一个数组,前缀gcd最多logn个不同的 gcd不太多,(暴力的基础) 所有考虑分块. 分块,每 ...
- [BZOJ4028][HEOI2015]公约数数列(分块)
先发掘性质: 1.xor和gcd均满足交换律与结合率. 2.前缀gcd最多只有O(log)个. 但并没有什么数据结构能同时利用这两个性质,结合Q=10000,考虑分块. 对每块记录这几个信息: 1.块 ...
随机推荐
- Gitlab CI-3.遇到的问题
五.遇到的问题 1. cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs 报错信息:ERROR ...
- 小程序与WebRTC联姻能擦出怎样的火花?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯视频云终端团队发表于云+社区专栏 腾讯视频云终端技术总监,rexchang(常青), 2008 年毕业加入腾讯,一直从事客户端研发 ...
- 从Web抓取信息的几个常用方法
1.Response 对象有一个 status_code 属性,可以检查它是否等于requests.codes.ok. 2.raise_for_status()方法是一种很好的方式,确保程序在下载失败 ...
- 使用spring整合Quartz实现—定时器
使用spring整合Quartz实现—定时器(Maven项目做演示) 不基于特定的基类的方法 一,开发环境以及依赖的jar包 Spring 4.2.6.RELEASE Maven 3.3.9 Jdk ...
- 学员管理系统(SQLAlchemy 实现)
一.业务逻辑 二.设计表结构 三.代码结构 start.py import os, sys sys.path.insert(0, os.path.dirname(os.path.dirname(os. ...
- 工作小应用:EXCEL查找两列重复数据
工作案例:excel存在A列.B列,需要找出B列没有A列的数据,具体做法如下(以office2007做案例): 1.点击 公式-定义名称 ,选中A列,填写名称“AAA”,选中B列,填写名称“BBB”: ...
- nodejs 服务器实现区分多客户端请求服务
初始实现 var net = require('net');//1 引入net模块 var chatServer = net.createServer();//创建net服务器 var clientL ...
- jdbc连接获取表名称
1,Class.forName可以替换为mysql之类其他的数据库驱动 public Connection connect(String url,String username,String pw, ...
- web12 使用map型的request、session、application
电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...
- MAVEN教程--01安装|创建|解释
Maven是一个采用纯Java编写的开 源项目管理工具.Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xm ...