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.块 ...
随机推荐
- Streamr助你掌控自己的数据(1)——教你5分钟上传数据至Streamr
博客说明 所有刊发内容均可转载但是需要注明出处. 教你5分钟上传数据至Streamr 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...
- Codeforces1151E,F | 553Div2 | 瞎讲报告
传送链接 E. Number of Components 当时思博了..一直在想对于\([1,r]\)的联通块和\([1,l-1]\)的联通块推到\([l,r]\)的联通块...我真的是傻了..这题明 ...
- 【一】,python简单爬虫实现
一: 1.获取当前页的课程名称,地址:https://www.ichunqiu.com/courses/webaq 2.选取其中一门课程名称查看源代码: 代码如下: <p class=" ...
- Django缓存配置和使用
- 缓存 - 配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCAT ...
- NIO基本概念
1. IO和NIO的区别 IO 面向流(stream oriented) 阻塞(blocking io) 无 NIO 面向缓冲区(buffer orie ...
- spring study
Dependency Injection The Inversion of Control(IoC) is a general concept, and it can be expressed in ...
- iOS - Bundle 资源文件包生成和常见资源文件使用
1.Bundle 文件 Bundle 文件,就是资源文件包.我们将许多图片.XIB.文本文件组织在一起,打包成一个 Bundle 文件.方便在其他项目中引用包内的资源. Bundle 文件是静态的,也 ...
- 学习记录 div悬停在顶部 。div阻止冒泡
如何让一个div可点击,并且div里面的a元素也能点击? 楼主应该是想要这样的,阻止事件冒泡 点击里面的a的时候不触发外面的div的点击事件 <script type="text/ja ...
- No.1010_第七次团队会议
渺茫的前景 今天大家都很失望,一来昨天的问题还是继续存在着,仍然没有完成.二来,我们看了一下其余几个组的界面,对自己有些难过. 我们组确实存在人手少的问题,这几天我还因为挑战杯的事情缺席了两天,感觉内 ...
- 第二阶段每日站立会议Forth Day
昨天对于程序中的字体显示进行细化修改,使界面更美观 今天准备继续调试手机界面 遇到的问题:上几次Tomcat运行正常,今天突然出现问题,Tomcat服务可以打开,但是无法连接到数据库