之前看了好几次都没什么思路,今天下定决心把这题切了。

观察到$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]公约数数列的更多相关文章

  1. BZOJ 4028: [HEOI2015]公约数数列 分块

    4028: [HEOI2015]公约数数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4028 Description 设计一个数据结 ...

  2. BZOJ 4028: [HEOI2015]公约数数列 【分块 + 前缀GCD】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=4028 4028: [HEOI2015]公约数数列 Time Limit: 10 Sec   ...

  3. 【BZOJ4028】[HEOI2015]公约数数列(分块)

    [BZOJ4028][HEOI2015]公约数数列(分块) 题面 BZOJ 洛谷 题解 看一道题目就不会做系列 首先\(gcd\)最多只会有\(log\)种取值,所以我们可以暴力枚举出所有可能的\(g ...

  4. 【BZOJ4028】[HEOI2015]公约数数列 分块

    [BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...

  5. bzoj4028: [HEOI2015]公约数数列

    Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x ...

  6. 洛谷 P4108 / loj 2119 [HEOI2015] 公约数数列 题解【分块】

    看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(a_0, a_1, \ldots , a_{n-1}\),你需要支持以下两种操作: MODIFY id x: 将 \ ...

  7. luogu P4108 [HEOI2015]公约数数列——solution

    -by luogu 不会啊.... 然后%了一发题解, 关键是 考虑序列{$a_n$}的前缀gcd序列, 它是单调不升的,且最多只会改变$log_2N$次,因为每变一次至少除2 于是,当我们询问x时: ...

  8. [HEOI2015]公约数数列

    不错的分块题 gcd和xor其实并没有联系 这里,xor的按位性质没有半点卵用 gcd的性质却很关键: 一个数组,前缀gcd最多logn个不同的 gcd不太多,(暴力的基础) 所有考虑分块. 分块,每 ...

  9. [BZOJ4028][HEOI2015]公约数数列(分块)

    先发掘性质: 1.xor和gcd均满足交换律与结合率. 2.前缀gcd最多只有O(log)个. 但并没有什么数据结构能同时利用这两个性质,结合Q=10000,考虑分块. 对每块记录这几个信息: 1.块 ...

随机推荐

  1. 高可用OpenStack(Queen版)集群-9.Cinder控制节点集群

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  2. shutil模块详解

    python常用模块目录 注意:shutil经常遇到路径需要转义一下才能执行,在字符串前面加 r转义  r" " 1.shutil常用方法 import shutil# 删除目录 ...

  3. Dingo Api 1.0在laravel5.2中的简单应用

    Dingo Api是为基于laravel的开发提供了一系列工具集,这些工具集可以帮助开发者快速构建API.Dingo Api最新的版本是2.0.0-alpha1,这个版本需要php7.0以上的php版 ...

  4. 深入 JSX

    从本质上讲,JSX 只是为 React.createElement(component, props, ...children) 函数提供的语法糖.JSX代码: 1 2 3 <MyButton ...

  5. Hadoop错误码速查

    经常遇到的exception是:PipeMapRed.waitOutputThreads(): subprocess failed with code N "OS error code 1: ...

  6. Scrum立会报告+燃尽图(Final阶段第一次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2480 项目地址:https://coding.net/u/wuyy694 ...

  7. 2-Tenth Scrum Meeting20151210

    任务分配 闫昊: 今日完成:请假.(编译) 明日任务:参加会议讨论,安排任务分工. 唐彬: 今日完成:请假.(编译) 明日任务:参加会议讨论,安排任务分工. 史烨轩: 今日完成:请假.(编译) 明日任 ...

  8. 使用Git进行代码管理心得------------个人练习

    一.在github.com上的操作   今天我们实践课程学习了用Git进行代码版本,使用github进行代码托管,我和队友在官网上创建了自己的Organization,将Auto CS fork到了小 ...

  9. 超实用 2 ArrayList链表之 员工工资管理系统

    package ArrayList的小程序; import java.io.*; import java.util.*; public class kkk { /** * 作者:Mr.fan * 功能 ...

  10. Linux下管道重定向使用以及Shell编程(操作系统)

    实验名称:Linux的基本操作 实验目的: 1.了解管道和重定向 2.熟悉基本的Linux脚本的编写 实验环境:Ubuntu 12.4(32位,简体中文) 实验内容: 1.将当前用户目录下的文件清单输 ...