Function Query(树状数组)

problem

给定一个长度为 nnn 的排列 aaa。有 qqq 个询问,每次询问一个区间 [l,r][l,r][l,r]。求这个区间的 kkk 值。

其中 k=∑i=lr∑j=i+1rf(ai,aj),f(x,y)k=\sum_{i=l}^r\sum_{j=i+1}^rf(a_i,a_j),f(x,y)k=i=lrj=i+1rf(ai,aj),f(x,y) 为一个递归函数,定义如下:

  • x=yx=yx=y,其值为 111
  • n≠yn\ne yn=y,其值为 f(x+y+∣x−y∣,∣x−y∣)f(x+y+|x-y|,|x-y|)f(x+y+xy,xy)
  • 若无限循环,其值为 000

n,q≤1e5n,q\le 1e5n,q1e5

solution

observation1:\text{observation1}:observation1: 首先观察这个函数,不难发现这个函数 x,yx,yx,y 的和是不变的。

所以当这个和为奇数的时候,一定会死循环,不可能走到 x=yx=yx=y 的局面。

否则 x,yx,yx,y 一定同奇偶。

observation2:\text{observation2}:observation2: 又不难知道加减运算过程中结果仍是 gcd\text{gcd}gcd 的倍数。所以去掉不影响答案。

因此我们可以将 x,yx,yx,y 都除以他们的 gcd\text{gcd}gcd。那么此时得到的 x,yx,yx,y 均为奇数且互质。


接下来假设 x>yx>yx>y,我们可以同时除以他们的 gcd\text{gcd}gcd

由于 x,yx,yx,y 同为奇,故 y∗2,x−yy*2,x-yy2,xy 都是偶数。

再假设 y∗2,x−yy*2,x-yy2,xy 有与 222 互质的公因数 k(k≠1)k(k\ne 1)k(k=1)

k∣y∧k∣x−yk\mid y\wedge k\mid x-ykykxy,所以 k∣xk\mid xkx,这与 (x,y)=1(x,y)=1(x,y)=1 矛盾。

所以这个 gcd\text{gcd}gcd 一定为 222

所以 f(x,y)f(x,y)f(x,y) 等价于 f(x−y2,y)f(\frac{x-y}{2},y)f(2xy,y)

故其和每次都会除以 222,直到 x=y=1x=y=1x=y=1 或死循环。

这样我们就可以求出 f(i,j)f(i,j)f(i,j) 的值为 g(i+jgcd⁡(i,j))g(\frac{i+j}{\gcd(i,j)})g(gcd(i,j)i+j),其中当 x=2kx=2^kx=2k 时,g(x)=kg(x)=kg(x)=k;否则 g(k)=0g(k)=0g(k)=0


假设 x,yx,yx,y 最简比为 a,ba,ba,b,即 xa=yb\frac xa=\frac ybax=by

我们不妨枚举 2i2^i2i,使得 a+b=2ia+b=2^ia+b=2i,然后枚举 aaa,自然就知道了 bbb。还需要检查一下 a,ba,ba,b 互质。

再枚举这个比例,进而也能知道 x,yx,yx,y

显然这样的 (a,b)(a,b)(a,b)2i2^i2i 种,且 xa=yb=d≤n2i−1\frac xa=\frac yb=d\le \frac{n}{2^{i-1}}ax=by=d2i1n

这样合法的不同的 (x,y)(x,y)(x,y) 只有 2n2n2n 对左右。

一共也就 O(nlog⁡n)O(n\log n)O(nlogn) 的级别,我们完全可以将这些二元组记下来,问题就转换成了二维偏序问题。

就可以用树状数组做了。

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

其实由二离和分块的做法,但我不会哈哈哈

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
#define int long long
int n, m;
int a[maxn], p[maxn], ret[maxn], t[maxn];
vector < int > G[maxn];
vector < pair < int, int > > Q[maxn];int gcd( int x, int y ) {if( ! y ) return x;else return gcd( y, x % y );
}void add( int i, int x ) {for( ;i <= n;i += i & -i ) t[i] += x;
}int ask( int i ) {int ans = 0;\for( ;i;i -= i & -i ) ans += t[i];return ans;
}int F( int x, int y ) {if( x == y ) return 1;if( x < y ) swap( x, y );return F( y << 1, x - y ) + 1;
}void solve() {for( int i = 1;i <= n;i ++ ) {for( int j : G[i] ) {int k = F( a[j], a[i] );add( 1, k ), add( j + 1, -k );}for( auto j : Q[i] ) ret[j.second] = ask( j.first );}
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] ), p[a[i]] = i;for( int i = 0;(1 << i) <= (n << 1);i ++ ) {for( int j = 1;j <= n;j ++ ) {int k = (1 << i) - a[j];if( k <= 0 or k > n or p[k] > j or a[j] == k ) continue;if( gcd( k, a[j] ) ^ 1 ) continue;for( int o = 1;p[o * k] and p[o * a[j]];o ++ ) {int x = p[o * k], y = p[o * a[j]];if( x > y ) swap( x, y );G[y].push_back( x );}}}scanf( "%lld", &m );for( int i = 1, l, r;i <= m;i ++ ) {scanf( "%lld %lld", &l, &r );Q[r].push_back( make_pair( l, i ) );}solve();for( int i = 1;i <= m;i ++ ) printf( "%lld\n", ret[i] );return 0;
}

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

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

相关文章

一份.NET 容器化的调查小结

小编在上个月在微信公众号“dotnet跨平台” 做了一个针对.NET 容器化的调查&#xff1a;.NET Core 容器化调查&#xff0c;参与人数702人&#xff0c;由于软件定义基础设施方兴未艾&#xff0c;编排和自动化领域kubernetes占据了主体地位&#xff0c;在平时的工作中和身边的同学…

P2148 [SDOI2009]ED

P2148 [SDOI2009]E&D 题意&#xff1a; 有2n堆石子&#xff0c;第2k-1堆和第2k堆是一组&#xff0c;现在两个人轮流操作&#xff0c;每次操作任选一组石子&#xff0c;然后将改组中的一堆石子移走&#xff0c;将另一堆式子分割成两堆&#xff0c;形成新的两堆石子&#x…

扒一扒.NET Core的环境配置提供程序

前言很久之前&#xff0c;在玩Docker的时候顺便扒了扒&#xff0c;最近&#xff0c;终于下定决心花了些时间整理并成文&#xff0c;希望能够给大家一些帮助。目录 .NET Core中的配置ASP.NET Core中的配置扒一扒环境变量提供程序为什么是“__”&#xff1f;“__”如何变成了“&…

[HNOI2016] 序列(线段树 + 莫队 + 倍增)

problem luogu-P3246 心路历程卡常历程问题存疑 一直在想莫队的做法。发现左右指针的移动对应一段左/右端点固定的子序列&#xff0c;然后可以一个数代表一段相同的贡献。 就开始求 lsti,nxtilst_i,nxt_ilsti​,nxti​ 了。 仔细想想需要找到 lstlsti<l≤lstilst_{lst_…

cf1523C. Compression and Expansion

cf1523C. Compression and Expansion 题意&#xff1a; 让你模拟出一个书的目录&#xff0c;对于每一行给你一个数字&#xff0c;表示这个目录的最后一个数&#xff0c; 题解&#xff1a; 我们用vector存当前的目录情况&#xff0c;读到下一行&#xff0c;在尽量少删上一行…

《从零开始学ASP.NET CORE MVC》:ASP.NET Core 中的 Main方法(5)

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core Web 项目文件ASP.NET Core 中的 Main方法一个开始专心写字的人在ASP.NET Core项目中&#xff0c;我们有一个名为Program.cs的文件。在这个文件中&#xff0c;我们有一个public static void Main&#…

[HNOI2016] 大数(莫队)

problem luogu-P3245 solution 将这个 nnn 位数从右往左的记录取模 ppp 的结果&#xff0c;即 f(i)(f(i−1)∗10si)%pf(i)(f(i-1)*10s_i)\% pf(i)(f(i−1)∗10si​)%p。 显然一个子串是 ppp 的倍数必然满足&#xff1a;f(r)−f(l−1)10r−l1≡0(modp)\frac{f(r)-f(l-1)}{10…

2021牛客暑期多校训练营9

2021牛客暑期多校训练营9 题号题目知识点AA Math ChallengeBBest SubgraphCCellsDDivide-and-conquer on TreeEEyjafjallaFFinancial Order ExecutionGGlass BallsHHappy NumberIIncentive ModelJJam

.NET中的状态机库Stateless

标题&#xff1a;.NET中的状态机库Stateless 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10674018.html[1]介绍什么是状态机和状态模式状态机是一种用来进行对象建模的工具&#xff0c;它是一个有向图形&#xff0c;由一组节点和一组相应的转…

[APIO2016] 划艇(dp + 组合数 + 前缀和优化)

problem luogu-P3643 solution 有个显然的暴力 dpdpdp。设 dp(i,j):dp(i,j):dp(i,j): 到了第 iii 个学校&#xff0c;其参加且派出 jjj 个划艇的方案数。 枚举上一个参加的学校以及派出的划艇&#xff0c;则有转移&#xff1a;dp(i,j)∑k<i,j<jdp(k,j′)dp(i,j)\sum_…

.net core webapi 前后端开发分离后的配置和部署

背景&#xff1a;现在越来越多的企业都采用了在开发上前后端分离&#xff0c;前后端开发上的分离有很多种&#xff0c;那么今天&#xff0c;我来分享一下项目中得的前后端分离。B/S Saas 项目&#xff1a;&#xff08;这个项目可以理解成个人中心&#xff0c;当然不止这么点功…

Happy Number

Happy Number 题意 &#xff1a; 开心数是由仅由2&#xff0c;3&#xff0c;6组成的&#xff0c;问第n个开心数是哪个&#xff1f; 1<n<1e9 题解&#xff1a; 正解应该是&#xff1a; 首先确定k大数有几位&#xff1a; 然后就知道k大数是x位下的第k’大的 把2看成0&a…

[HNOI2015] 接水果(倍增 + 整体二分)

problem luogu-P3242 solution 本题的难点在于如何判定路径之间是否覆盖。 这里我们尝试树常见的 dfs\text{dfs}dfs 序。 考虑 x−yx-yx−y 路径如果要覆盖 u−vu-vu−v 路径需要满足怎样的条件。 以下均假设 dfs(u)<dfs(v),dfs(x)<dfs(y)dfs(u)<dfs(v),dfs(x)&…

ASP.NET Core使用Jaeger实现分布式追踪

前言最近我们公司的部分.NET Core的项目接入了Jaeger&#xff0c;也算是稍微完善了一下.NET团队的技术栈。至于为什么选择Jaeger而不是Skywalking&#xff0c;这个问题我只能回答&#xff0c;大佬们说了算。前段时间也在CSharpCorner写过一篇类似的介绍Exploring Distributed T…

[SCOI2007] 修车(费用流 + 差分时间段建图)

problem luogu-P2053 solution 假设只有一个工作人员。修车顺序为 p1,p2,...,pnp_1,p_2,...,p_np1​,p2​,...,pn​ 是一个 nnn 的排列。 那么对于第 iii 个被修的车的等待时间应为 Tp1...TpiT_{p_1}...T_{p_i}Tp1​​...Tpi​​。 总的等待时间则是 Tp1(Tp1Tp2)...(Tp1..…

长沙开发者技术大会暨.NET技术社区成立大会倒数第13天

待你扬帆起航&#xff0c;一起精彩纷呈&#xff01;长沙开发者技术大会暨.NET技术社区成立大会倒数第13天&#xff01;2019年4月21日期待与你相聚在.NET技术社区&#xff01;我们今天会完成海报制作和报表表单&#xff0c;海报内容初步如下所示&#xff1a;活动信息 长沙开发者…

[TJOI2011] 卡片(网络流 + 质因子优化建图)

problem luogu-P2065 solution 这个拿走一组共两张卡片的操作其实就是一个匹配。 直接两个数的最大公约数大于 111 就建一条边&#xff0c;跑二分图匹配最大流即可。 然而如果直接枚举两个数然后算他们的 gcd\text{gcd}gcd &#xff0c;时间复杂度 O(Tn2log⁡V)O(Tn^2\log…

C#并行编程(1):理解并行

什么是并行并行是指两个或者多个事件在同一时刻发生。在程序运行中&#xff0c;并行指多个CPU核心同时执行不同的任务&#xff1b;对于单核心CPU,严格来说是没有程序并行的。并行是为了提高任务执行效率&#xff0c;更快的获取结果。与并发的区别&#xff1a;并发是指两个或者多…

P2163 [SHOI2007]园丁的烦恼(二维数点模板题)

P2163 [SHOI2007]园丁的烦恼 题意&#xff1a; 在一个二维平面内有一些点&#xff0c;给你一个左上角和右下角的点&#xff0c;问这个范围内有多少点 题解&#xff1a; 二维数点模板题 我们设F(a,b)表示以(0,0)为左下角&#xff0c;(a,b)为右上角的矩阵内有多少点 如图不难…

[CQOI2017] 小Q的表格(分块 + 整除分块 + 数学 + 前缀和)

problem luogu-P3700 solution f(a,b)f(b,a)f(a,b)f(b,a)f(a,b)f(b,a) 意味着我们只用考虑半个棋盘的信息。 b∗f(a,ab)(ab)∗f(a,b)b*f(a,ab)(ab)*f(a,b)b∗f(a,ab)(ab)∗f(a,b) 会发现修改 f(a,b)f(a,b)f(a,b) 就影响 f(a,ab)f(a,ab)f(a,ab) 进而影响 f(a,a2b)…f(a,a2b)\…