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.块 ...
随机推荐
- Protocol buffer的使用案例
Protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了多种语言的实现:java.c#.c++.go 和 python,每一种实 ...
- python基础知识-11-函数装饰器
python其他知识目录 1.装饰器学习前热身准备 1.1装饰器简介 1.2装饰器热身分析 ) def func(): pass v1 = v2 = func #将函数名赋予一个变量,就和变量赋值是同 ...
- 深入理解JavaScript函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...
- 王者荣耀交流协会PSP Daily项目Postmortem结果
王者荣耀交流协会PSP Daily项目Postmortem结果 整理:王超 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? PSP D ...
- 软件团队项目第一次Sprint评价(评价人:张家军)
组号 组名 缺点及建议 1 理财猫 (1)没有附带的计算器 (2)支入支出没有详细菜单说明 (3)界面背景单调 ...
- 1到N中“1”出现的次数
题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数 思路:刚开始做的时候,是想从1到N进行遍历,其中每个数都出现1的个数加起来,最后得出结果,但是老师让我们找规 ...
- Leetcode题库——5.最长回文子串
@author: ZZQ @software: PyCharm @file: longestPalindrome.py @time: 2018/9/18 20:06 要求:给定一个字符串 s,找到 s ...
- SqlServer中的dbo是什么意思
出处:http://andylin02.iteye.com/blog/486296 SqlServer中的dbo是什么意思? DBO是每个数据库的默认用户,具有所有者权限,即DbOwner 通过用DB ...
- ns3 模拟无线网络通信
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* * This program is fre ...
- 福大软工 · 第七次作业 - 需求分析报告(404 Note Found队)
目录 组队后的团队项目的整体计划安排 项目logo及思维导图 项目logo 思维导图 产品思维导图 产品思维导图-引导 产品思维导图-后端数据处理.存储 产品思维导图-短信识别 产品思维导图-智能分析 ...