首页 > 其他分享 >P3794 签到题IV 题解

P3794 签到题IV 题解

时间:2024-10-16 11:12:32浏览次数:7  
标签:gcd val 签到 题解 ll long P3794 500010 define

题目传送门

前置知识

最大公约数

解法

\(\gcd\) 和 \(\operatorname{or}\) 在固定左端点的情况下至多会变化 \(O(\log V)\) 次。

以 \(\gcd\) 为例,考虑求出所有的四元组 \((l,r,x,val)\) 表示 \(\forall i \in [l,r],\gcd\limits_{j=i}^{x} \{ a_{j} \}=val\)。

  • 本题中因为 \(x\) 一维可以“滚”掉,所以省去不写。

具体地,枚举右端点 \(x\),类似单调栈的写法(本身是单调的),继承 \(x-1\) 的四元组并及时去重/重构栈。

处理完后判断一下每个值区间是否有交求贡献即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
struct  node
{
	ll val,l,r;
}g[500010],o[500010];
ll a[500010],l[500010],r[500010],cnt_g,cnt_o;
ll gcd(ll a,ll b)
{
	return b?gcd(b,a%b):a;
}
int main()
{
	ll n,k,ans=0,len,i,j;
	cin>>n>>k;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=cnt_g;j++)
		{
			g[j].val=gcd(g[j].val,a[i]);
		}
		cnt_g++;
		g[cnt_g]=(node){a[i],i,i};
		len=0;
		for(j=1;j<=cnt_g;j++)
		{
			if(g[j].val==g[j-1].val)
			{
				g[len].r=g[j].r;
			}
			else
			{
				len++;
				g[len]=g[j];
			}
		}
		cnt_g=len;
		for(j=1;j<=cnt_g;j++)
		{
			l[g[j].val]=g[j].l;
			r[g[j].val]=g[j].r;
		}
		for(j=1;j<=cnt_o;j++)
		{
			o[j].val|=a[i];
		}
		cnt_o++;
		o[cnt_o]=(node){a[i],i,i};
		len=0;
		for(j=1;j<=cnt_o;j++)
		{
			if(o[j].val==o[j-1].val)
			{
				o[len].r=o[j].r;
			}
			else
			{
				len++;
				o[len]=o[j];
			}
		}
		cnt_o=len;
		for(j=1;j<=cnt_o;j++)
		{
			if(l[o[j].val^k]!=0&&min(o[j].r,r[o[j].val^k])>=max(o[j].l,l[o[j].val^k]))
			{
				ans+=min(o[j].r,r[o[j].val^k])-max(o[j].l,l[o[j].val^k])+1;
			}
		}
		for(j=1;j<=cnt_g;j++)
		{
			l[g[j].val]=r[g[j].val]=0;
		}
	}
	cout<<ans<<endl;
	return 0;
}

标签:gcd,val,签到,题解,ll,long,P3794,500010,define
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18469438

相关文章

  • CF1458D Flip and Reverse 题解
    思路由于它要求\(\text{01}\)数量相等,我们可以考虑站在前缀和的角度看待这个问题。我们将\(0\)看作负一,\(1\)看作一。可以把它化成一个折线图(方便观察)。观察一下它的操作实际上在干什么。容易发现,在折线图上,我们把操作的\([l,r]\)的整段折线reverse了一遍。同样的,......
  • [题解]CF1136E Nastya Hasn't Written a Legend
    思路首先考虑操作1一个点\(i\)能被操作到的条件。注意到此时\(x\simi-1\)这些位置都是被更新过的,再仔细观察此时\(\forallj\in[x,i),a_j=a_x+\sum_{p=x}^{j-1}k_p\)。那么对于\(a_i\)如果会被修改将会变为\(a_x+\sum_{p=x}^{i-1}k_p\),那么\(a_i......
  • [ABC213G] Connectivity 2 题解
    T3[ABC213G]Connectivity2题意:给定一张无向图\(G\),将其删去\(0\) 条及以上的边构成一张新图,求对于所有点\(k\in(1,n]\),使\(k\) 与\(1\) 连通的新图的个数。比较套路的一道状压DP。尽管刚开始思考毫无头绪。Step1.令\(f_S\)表示点集为\(S\)的连通子图的个数,\(......
  • [TJOI2018] 游园会 题解
    T7[TJOI2018]游园会只能说是道有意思的好题。一般来说遇到这种题我们想到的都会是设\(f_{i,\dots}\)表示长度为\(i\),然后后面跟一堆状态的情况。此题需要我们满足两个条件:LCS的长度;不能出现\(\texttt{NOI}\)的子串。第二个限制我们可以通过状态设计来解决,但第一个......
  • [JSOI2018] 潜入行动 题解
    T6[JSOI2018]潜入行动很套路、很裸的一道树形DP。看了状态就会推方程的那种。设\(f_{u,i,0/1,0/1}\)表示以\(u\)为根的子树中有\(i\)个监听器、\(u\)有没有监听器、\(u\)有没有被监听的方案数。显然要枚举子节点\(v\)、\(u\)的监听器数量\(i\)、\(v\)的监听器数......
  • [ABC213G] Connectivity 2 题解
    [ABC213G]Connectivity2题解套路的经典图上计数题。考虑枚举和\(1\)相连的子集\(S\)。答案显然由两部分构成,\(S\)集合和\(1\)相连的方案数\(f(S)\)和\(S\)对于\(G\)的补集所有的方案数\(g(S)\)。答案就是二者相乘。显然\(g\)更好处理。直接枚举集合的边即可......
  • P8386 [PA2021] Od deski do desk 题解
    P8386[PA2021]Oddeskidodesk题解考虑一个大的序列一定被分成几个区间来删除。朴素的dp定义是\(dp_{i,j}\)表示前\(i\)个数,最后一个数元素是\(j\)的方案数。然而这样不仅不好转移,而且设不下状态。不难发现所有值是等价的。考虑这样一个事情:若我们要分出一个新的区......
  • Project Euler 638 题解
    q-analog,老玩家集体起立!这也就是说:\[\binom{n+m}{n}_q=\sum_{\pi\inL_{n,m}}q^{area(\pi)}\]结束!#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmod=1e9+7,maxn=2e7+5;intqp(inta,intb,intp=mod){ intres=1; while(b){ i......
  • 2024某校新生校队选拔赛题解
    游记某校某院与某院联合培养机制给排了两场讲座,讲完吃饭,讲座时间\(8:00-12:00,\)拖堂\(10\)min,到食堂\(10\)min,吃饭\(30\)min,走回去\(10\)min,打开网址发现时间只够看榜的一看榜我草\(5\)小时连\(4\)个题都做不出来翻题面发现A,L纯签到,B半签到,遂确信成分题解题目链接A验证是......
  • Project Euler 457 题解
    初等数论小题目求\[n^2-3n-1\equiv0\pmod{p^2}\]配方,得到:\[(2n-3)^2\equiv13\pmod{p^2}\]根据亨泽尔引理,只需得到\((2n-3)^2\equiv13\pmod{p}\)的解即可提升到\(p^2\)。这是二次剩余,直接解。单次求解\(O(\logn)\),时间复杂度\(O(n)\)。#include<bits/stdc++.h......