Loj#576-「LibreOJ NOI Round #2」签到游戏【线段树】

正题

题目链接:https://loj.ac/p/576


题目大意

给出一个长度为nnn的序列aaa,还有一个未知序列bbb,你每次可以花费gcd⁡i=lrai\gcd_{i=l}^r a_igcdi=lrai的代价得到∑i=lrbi\sum_{i=l}^rb_ii=lrbi的值。

每次修改aaa中的一个数,求得到bbb中所有数字需要花费的最小权值。

1≤n,q≤105,1≤ai≤1091\leq n,q\leq 10^5,1\leq a_i\leq 10^91n,q105,1ai109


解题思路

因为有一个信息上的问题,有限的信息对应的结果肯定不能超过信息的数量。所以我们需要知道nnn个数字那么我们就至少需要询问nnn次。

然后考虑si=∑j=1ibjs_i=\sum_{j=1}^i b_jsi=j=1ibj,那么我们每次得到的将是一个sr−sl−1s_r-s_{l-1}srsl1,我们可以通过一个[l,r][l,r][l,r][l′,r][l',r][l,r]的询问得到[l,l′−1][l,l'-1][l,l1](反过来同理)。也就是一些端点相互连接相互覆盖的区间我们可以把它们转换为端点相同但是没有相互覆盖的区间。

然后我们目标是所有端点都得在里面,加上相互连接这个限制,看上去就很像最小生成树。相当于有点[0,n][0,n][0,n],我们连接l,rl,rl,r的代价是gcd⁡i=l+1rai\gcd_{i=l+1}^ra_igcdi=l+1rai,求最小生成树。

然后显然的我们肯定是找一个kkk,然后0∼k0\sim k0knnn连边,k+1∼nk+1\sim nk+1n000连边,主要是找到这个kkk,这个kkk就是第一个满足gcd⁡i=1kai≤gcd⁡i=knai\gcd_{i=1}^k a_i\leq \gcd_{i=k}^n a_igcdi=1kaigcdi=knai的位置。

然后因为前后缀gcdgcdgcd都最多变化log⁡\loglog次,我们可以考虑求出这些位置。

考虑在线段树上二分出这些位置,看上去是log⁡3\log^3log3的,实际上假设L∼midL\sim midLmid中没有答案,那么此时这个前缀的gcdgcdgcd依旧等于valvalval,所以不需要管前面的东西,到一个位置的时候判这个区间的值是不是valvalval的倍数就好了。

时间复杂度:O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mp(x,y) make_pair(x,y)
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,q,a[N],w[N<<2];
vector<pair<ll,ll> > pre,suf;
void Change(ll x,ll L,ll R,ll pos,ll val){if(L==R){w[x]=val;return;}ll mid=(L+R)>>1;if(pos<=mid)Change(x*2,L,mid,pos,val);else Change(x*2+1,mid+1,R,pos,val);w[x]=__gcd(w[x*2],w[x*2+1]);return;
}
ll AskP(ll x,ll L,ll R,ll pos,ll &val){if(w[x]%val==0)return n;if(L==R){val=__gcd(val,w[x]);return L;}ll mid=(L+R)>>1;if(pos>mid)return AskP(x*2+1,mid+1,R,pos,val);ll k=AskP(x*2,L,mid,pos,val);if(k==n)return AskP(x*2+1,mid+1,R,pos,val);return k;
}
ll AskS(ll x,ll L,ll R,ll pos,ll &val){if(w[x]%val==0)return 0;if(L==R){val=__gcd(val,w[x]);return L;}ll mid=(L+R)>>1;if(pos<=mid)return AskS(x*2,L,mid,pos,val);ll k=AskS(x*2+1,mid+1,R,pos,val);if(!k)return AskS(x*2,L,mid,pos,val);return k;
}
ll Ask(ll x,ll L,ll R,ll l,ll r){if(L==l&&R==r)return w[x];int mid=(L+R)>>1;if(r<=mid)return Ask(x*2,L,mid,l,r);if(l>mid)return Ask(x*2+1,mid+1,R,l,r);return __gcd(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r));
} 
signed main()
{
//	freopen("game3_12.in","r",stdin);scanf("%lld%lld",&n,&q);ll d=0;n++;for(ll i=1;i<n;i++)scanf("%lld",&a[i]),Change(1,0,n,i,a[i]);Change(1,0,n,0,1);Change(1,0,n,n,1);while(q--){ll p,x;pre.clear();suf.clear();scanf("%lld%lld",&p,&x);Change(1,0,n,p,x);a[p]=x;ll val=a[1];x=1;while(x<n){pre.push_back(mp(x,val));x=AskP(1,0,n,x+1,val);}x=n-1;val=a[n-1];while(x){suf.push_back(mp(x-1,val));x=AskS(1,0,n,x-1,val);}ll p1=pre.size()-1,p2=suf.size()-1;ll L=-1,R=n,ans=0;while(1){if(p2<0||pre[p1].second<suf[p2].second){if(pre[p1].first<=L){ans+=pre[p1].second*(R-L-1);break;}ans+=pre[p1].second*(R-pre[p1].first);R=pre[p1].first;p1--;}else{if(suf[p2].first>=R){ans+=suf[p2].second*(R-L-1);break;}ans+=suf[p2].second*(suf[p2].first-L);L=suf[p2].first;p2--;}}printf("%lld\n",ans-Ask(1,0,n,1,n-1));}return 0;
}
//2 6 3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NC14732 锁

NC14732 锁 题意&#xff1a; n个居民&#xff0c;门上有k把锁&#xff0c;每个居民有若干钥匙&#xff0c;为1到k的一个子集&#xff0c;如果几名居民的钥匙的并集是1到k&#xff0c;即他们拥有全部锁的对应钥匙。 求最小的k&#xff0c;使得可以适当地给居民们每人若干钥匙…

CodeForces:1103(div1)1104(div2)

文章目录前言CF1104A Splitting into digitsDescription\text{Description}DescriptionSolution\text{Solution}SolutionDescription\text{Description}DescriptionCF1104B Game with stringDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text…

专题突破一之分块——Untitled Problem II,Balanced Lineup,[ioi2009]Regions

文章目录SP2940 UNTITLE1 - Untitled Problem IIsourcesolutioncodeBalanced LineupsourcecodeCount on a tree II[ioi2009]RegionsSP2940 UNTITLE1 - Untitled Problem II source solution 分块 si{sik(i−l1)sikik(1−l)l≤i≤rsik(r−l1)r<is_i\begin{cases} s_ik\tim…

.NET Core实战项目之CMS 第十七章 CMS网站系统的部署

目前我们的.NET Core实战项目之CMS系列教程基本走到尾声了&#xff0c;通过这一系列的学习你应该能够轻松应对.NET Core的日常开发了&#xff01;当然这个CMS系统的一些逻辑处理还需要优化&#xff0c;如没有引入日志组件以及缓存功能&#xff0c;权限目前只支持控制到菜单&…

ICPC2019南昌区域赛

ICPC2019南昌区域赛 题号题目知识点难度A9102BA Funny Bipartite Graph状压dp思维稳银快金CAnd and Pair二项式定理快铜DBitwise TreeEBob’s Problem思维&#xff0c;生成树签到FDynamic Suffix ArrayGEating Plan思维题稳铜快银HPowers of TwoIResistanceJSummonKTreeLWho i…

Loj#510-「LibreOJ NOI Round #1」北校门外的回忆【线段树】

正题 题目链接:https://loj.ac/p/510 题目大意 给出一个代码 function add(x,v)while x < n dos[x] s[x] xor vx x lowbit(x) //注意&#xff0c;这里是 lowbit&#xff0c;这也是两份代码唯一的区别end while end functionfunction query(x)ans 0while x > 0 doa…

如何用EFCore Lazy Loading实现Entity Split

α角 与 β角支持 现实生活 的 计算机系统&#xff0c;总有着两大偏差&#xff0c;第一个是 现实生活 与 计算机系统 的α角&#xff0c;另外一个是计算机系统的 逻辑设计 与 物理设计 的β角。举个栗子&#xff1a;α角&#xff1a;假设某个公司的商业流程&#xff0c;我们在做…

CodeForces:372(div1)div373(div2)

文章目录前言CF373A Collecting Beats is FunDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF373B Making Sequences is FunDescription\text{Description}DescriptionSolution\text{Solution}SolutionCF372A Counting Kangaro…

一二三系列之CodeChef分块——Chef and Churu,Chef and Problems,Children Trips

文章目录Chef and ChurusourcesolutioncodeChef and ProblemssourcesolutioncodeChildren TripssourcesolutioncodeChef and Churu source solution 对于单独的iii&#xff0c;查询可以用线段树/树状数组O(nlog⁡n)O(n\log n)O(nlogn)&#xff0c;这暗示可以平衡查询修改次数…

Bob‘s Problem

Bob’s Problem 题意&#xff1a; 一个有n个点的图&#xff0c;其中边分为白色和黑色&#xff0c;每个边都有边权&#xff0c;所选白边的数量的数量不能超过k&#xff0c;问现在选择一些边&#xff0c;使得所有点连通&#xff0c;问最大权值是多少&#xff1f; 题解&#xf…

.NET Core 开源项目 Anet 在路上

今天给大家介绍我刚开源的一个 .NET Core 项目&#xff1a;Anet。Anet 的目标是实现一个 .NET Core 通用库、通用框架和通用模板。我给它的定义是&#xff1a;A .NET Core Common Lib, Framework and Boilerplate.它的取名正是来自于这句话的前面四个字母&#xff1a;ANET。Ane…

Loj#2324-「清华集训 2017」小 Y 和二叉树

正题 题目链接:https://loj.ac/p/2324 题目大意 给出nnn个点的一棵树&#xff0c;每个点的度数不超过333。 你要求它的一个二叉树结构&#xff08;根任意选择&#xff09;使得其中序遍历的字典序最小。 1≤n≤1061\leq n\leq 10^61≤n≤106 解题思路 直接找根感觉比较麻烦&…

模板:后缀自动机(SAM)

所谓后缀自动机&#xff0c;就是通过后缀建立的自动机 &#xff08;逃&#xff09; 请允许我先介绍一下后缀家族&#xff1a; &#xff08;又逃&#xff09; 前言 OI生涯目前为止学习的最为难以理解的算法&#xff0c;没有之一。 到现在也没有完全的理解。 qwq 概念 定义&…

.NET 开源项目 Anet 介绍

使用 Anet 有一段时间了&#xff0c;已经在我的个人网站&#xff08;如 bookist.cc&#xff09;投入使用&#xff0c;目前没有发现什么大问题&#xff0c;所以才敢写篇文章向大家介绍。GitHub 地址&#xff1a;https://github.com/anet-team/anetAnet 是一个 .NET Core 通用框架…

线性代数问卷调查反馈——Find The Determinant III,Takahashi‘s Basics in Education and Learning

文章目录Find The Determinant IIIsourcecodeTakahashis Basics in Education and LearningsourcecodeFind The Determinant III source 高斯消元求行列式的模板题 code #include <cstdio> #include <iostream> using namespace std; #define maxn 205 #define…

L - Who is the Champion

L - Who is the Champion 计蒜客 - 42587 题意&#xff1a; 给出一个N阶矩阵&#xff0c;&#xff08; i , j &#xff09; &#xff08;i, j&#xff09;&#xff08;i,j&#xff09;处的数字表示这场比赛球队i ii踢进球队j jj多少球。两支球队平局则各加一分&#xff0c;一…

CF1037H Security(SAM)

解析 算是一个比较高级的SAM的应用了 对fail树的dfs序建立维护右端点最大值的线段树 考虑把所有的询问离线&#xff0c;按照右端点排序 每次动态把当前询问右端点左侧的前缀插入线段树 处理询问时&#xff0c;先贪心的尝试和询问串填法一样&#xff0c;如果不行就往下一个字母…

AT5147-[AGC036D]Negative Cycle【dp,模型转换】

正题 题目链接:https://www.luogu.com.cn/problem/AT5147 题目大意 有nnn个点的一张图&#xff0c;其中i→i1(i<n)i\rightarrow i1(i< n)i→i1(i<n)有一条边权值为000。 对于其他i,j(i≠j)i,j(i\neq j)i,j(ij)存在一条边i→ji\rightarrow ji→j&#xff0c;若i&l…

栈/队列/分块问卷调查反馈——Weak in the Middle,Cutting Plants,最小公倍数

文章目录Weak in the MiddlesourcesolutioncodeCutting Plantssourcesolutioncode[HNOI2016]最小公倍数sourcesolutioncodeWeak in the Middle source solution 栈模拟。 天数的计算&#xff0c;可以发现与其参与三元比较的次数有关 对于栈顶&#xff0c;如果被弹出&#…

我的十年创业路

记十年创业的心路历程和我的创业思辨导读1 为什么写这篇文章2 详细的总结和思辨 2.01 感恩 2.02 为什么创业 2.03 十年流水账 2.04 经历了哪些失败 2.05 重要的职场基础 2.06 持续的学习和进步 2.07 创业与兴趣 2.08 价值观的碰撞和选择 2.09 合作与…