首页 > 其他分享 >P2757 [国家集训队] 等差子序列

P2757 [国家集训队] 等差子序列

时间:2024-02-17 21:36:08浏览次数:30  
标签:P2757 val rs int ll ls 差子 国家集训队

题目的等差子序列最少只要求长度为3,那么其实就转化为对于一个数是否存在左右各一个与它差值相等的一对数,比如1 4 3 2 5中1,5对3来说就如此。
这样的关系放到数轴上就是是否存在一对数到某数的距离相等。
由于题目明确是一个排列,也就是1到n所有数一定会出现一次,那么对于某数,它左边的数没有出现的数一定会出现在右边。
也就是说,若现在在第i项为x,第1到i-1个项中有一个y,1到n中存在2x-y,而此时若2x-y未出现在1到i-1中,那么2x-y一定会出现第i+1到n项中,这时满足条件,也就是存在等差子序列。
那么,如果需要不出现等差子序列,对第i项的x来说,就必须左右在能延长的范围内构成回文串,此时问题就变成了实时判断回文串。
对于这样的问题,可以使用字符串hash的思想,用hash来判回文串,接着套上线段树,用线段树维护hash值。

代码

#include<bits/stdc++.h>
#define maxn 500005
#define ll unsigned long long
using namespace std;
int T;
int n;
int a[maxn];
ll p[maxn];
struct segment_tree {
	int l,r;
	ll s1,s2;
} t[maxn<<2];
int ls(int x) {return x<<1;}
int rs(int x) {return x<<1|1;}
void tree_pre(int x,int l,int r) {
	t[x].l=l,t[x].r=r,t[x].s1=0,t[x].s2=0;
	if(l==r) return;
	int mid=(l+r)>>1;
	tree_pre(ls(x),l,mid);
	tree_pre(rs(x),mid+1,r);
}
void push_up(int x) {
	t[x].s1=t[ls(x)].s1*p[(t[rs(x)].r-t[rs(x)].l+1)]+t[rs(x)].s1;
	t[x].s2=t[rs(x)].s2*p[(t[ls(x)].r-t[ls(x)].l+1)]+t[ls(x)].s2;
}
void modify(int x,int des,ll val) {
	if(t[x].l==t[x].r) {t[x].s1=val,t[x].s2=val; return;}
	if(t[ls(x)].r>=des) modify(ls(x),des,val);
	else modify(rs(x),des,val);
	push_up(x);
}
ll query(int x,int l,int r,int k) {
	if(t[x].l>=l && t[x].r<=r) {if(k==1) return t[x].s1; return t[x].s2;}
	ll ans=0;
	if(t[ls(x)].r>=l && t[rs(x)].l<=r) {
		if(k==1) {
			ans=query(ls(x),l,r,1);
			ans=ans*p[(min(t[rs(x)].r,r)-t[ls(x)].r)]+query(rs(x),l,r,1);
		}
		else {
			ans=query(rs(x),l,r,2);
			ans=ans*p[(t[rs(x)].l-max(l,t[ls(x)].l))]+query(ls(x),l,r,2);
		}
	}
	else if(t[ls(x)].r>=l) ans=query(ls(x),l,r,k);
	else if(t[rs(x)].l<=r) ans=query(rs(x),l,r,k);
	return ans;
}
int main() {
//	freopen("P2757.in","r",stdin);
//	freopen("P2757.out","w",stdout);
	scanf("%d",&T);
	p[0]=1; for(int i=1;i<maxn;i++) p[i]=p[i-1]*131;
	while(T--) {
		scanf("%d",&n);
		tree_pre(1,1,n);
		bool TF=false;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		for(int i=1;i<=n;i++) {
			modify(1,a[i],1);
			int len=min(a[i]-1,n-a[i]); int l=a[i]-len,r=a[i]+len;
			if(query(1,l,r,1)!=query(1,l,r,2)) {TF=true; break;}
		}
		if(TF) printf("Y\n");
		else printf("N\n");
	}
	return 0;
}

标签:P2757,val,rs,int,ll,ls,差子,国家集训队
From: https://www.cnblogs.com/1n87/p/18018437

相关文章

  • [国家集训队] 拉拉队排练
    添加分隔符的目的是给偶数长度的回文串一个中心,本题只要求奇数长度的回文串,那么这一步就可以省略了;而且,字符串加法非常慢利用回文串的另一半所携带的信息,注意不能超出回文串的范围边修改边询问,才需要用到高级数据结构;如果所有修改都在询问之前,就不需要了点击查看代码#inclu......
  • P1829 [国家集训队] Crash的数字表格 / JZPTAB
    \[\sum\limits_{i=1}^N\sum\limits_{j=1}^M\frac{ij}{\gcd(i,j)}\]\[\sum\limits_{d=1}^N\frac1d\sum\limits_{i=1}^N\sum\limits_{j=1}^Mij[\gcd(i,j)=d]\]\[\sum\limits_{d=1}^Nd\sum\limits_{i=1}^{\lfloor\fracNd\rfloor}\sum\limits_......
  • [国家集训队] 矩阵乘法 整体二分
    [国家集训队]矩阵乘法题目描述给你一个\(n\timesn\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(k\)小数。输入格式第一行有两个整数,分别表示矩阵大小\(n\)和询问组数\(q\)。第\(2\)到第\((n+1)\)行,每行\(n\)个整数,表示这个矩阵。第\((i+1)\)行......
  • P1527 [国家集训队] 矩阵乘法
    题意给定一个矩阵,每次询问子矩阵的第\(k\)大。Sol考虑把莫队扔到二维上来做。发现复杂度变为:\(O(n^2q^{\frac{3}{4}})\)。卡卡常就过了。Code#include<iostream>#include<algorithm>#include<cstdio>#include<array>#include<cmath>#include<vector>#i......
  • [国家集训队] 阿狸和桃子的游戏
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e6+10;intn,m;intk[N],a,b,c;intval[N];//如果一条边的两端点被同一个人选了,那么产生边权的贡献//把边权均分到两端点上,每个端点加上c/2//如果这条边被同一个选了,那......
  • P2757 [国家集训队] 等差子序列
    P2757[国家集训队]等差子序列在线段树存哈希的时候,注意字符长度的改变,否则query会崩掉lolquery(intu,intl,intr,intlft,intrht){if(lft<=l&&r<=rht)returntr[u];else{intmid=(l+r)>>1;if(rht<=......
  • P2371 [国家集训队] 墨墨的等式
    题目大意对于等式\(\displaystyle\sum_{i=1}^{n}a_ix_i=b\)求有多少\(b\in[l,r]\)使得等式存在非负数解。思路典型的同余最短路,可先看看跳楼机(题解)。首先想到将区间\([l,r]\)分开,分为\([0,l-1]\)和\([0,r]\)再答案相减。所以我们只需要能求得\([0,x]\)的答案即......
  • Tarjan 例题:洛谷P1407 [国家集训队] 稳定婚姻
    在洛谷中查看题意:自己读一下,大致就是\(2n\)个点,每个点编号为\(1-2n\),\(\lfloor编号/2\rfloor\)相同的点连条边。然后再给\(m\)条边。问:将每个\(\lfloor编号/2\rfloor\)相同的点间连的边断开,还能不能使每个编号为奇数的点都有一个编号为偶数的点对应。这个......
  • 题解 [国家集训队] 稳定婚姻
    题目链接首先我们考虑用图论的边描述这个关系。若两者存在夫妻或情侣关系,就连一条边(是有向边还是无向边呢?)。先来考虑两对夫妻的情况,若夫妻边与情侣边交替出现。且一对夫妻在同一个环内,则可以说明分开后能够重新找到另一半。如下图:夫妻a-男b-女c-男d-女情侣a-男d-女c-......
  • [国家集训队] Tree II 题解报告
    [国家集训队]TreeII一道·真·板子·题就是练习LCT懒标记的题目除了翻转标记以外还要维护乘法标记和加法标记注意加法标记和乘法标记的维护!!!加法标记因为splay的区间大小不是固定的,所以我们要维护size,并且子树的sum要加上size乘上标记其他的就只用直接加上即可voidpusha......