CF452F. Permutation
很有趣的一道题。双倍经验:P2757 [国家集训队] 等差子序列
要找三个数构成等差序列,一个直接的想法就是枚举中间的数
注意到题目中说
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18,SIZ=5e5;
const int B=1145141,I=738796363,P=1e9+7;
inline int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int n,a[500005],pw[500005],ip[500005];
struct segtree{
#define ls p<<1
#define rs p<<1|1
#define lson l,mid,ls
#define rson mid+1,r,rs
struct Node{
int s;
}c[2000005];
void pushup(int p){
c[p].s=(c[ls].s+c[rs].s)%P;
}
void build(int l,int r,int p){
if(l==r){c[p].s=0;return;}
int mid=(l+r)>>1;
build(lson),build(rson);
pushup(p);
}
void update(int l,int r,int p,int x,int k){
if(l==r){c[p].s=k;return;}
int mid=(l+r)>>1;
if(x<=mid)update(lson,x,k);
else update(rson,x,k);
pushup(p);
}
int query(int l,int r,int p,int L,int R){
if(L>R)return 0;
if(L<=l&&r<=R)return c[p].s;
int mid=(l+r)>>1,res=0;
if(L<=mid)res=(query(lson,L,R))%P;
if(R>mid)res=(res+query(rson,L,R))%P;
return res;
}
#undef ls
#undef rs
#undef lson
#undef rson
}Tr1,Tr2;
signed main(){
pw[0]=1;
for(int i=1;i<=SIZ;i++)pw[i]=pw[i-1]*B%P;
ip[0]=1;
for(int i=1;i<=SIZ;i++)ip[i]=ip[i-1]*I%P;
int T=1;
while(T--){
n=read();for(int i=1;i<=n;i++)a[i]=read();
Tr1.build(1,n,1);Tr2.build(1,n,1);int flag=0;
for(int i=1;i<=n;i++){
Tr1.update(1,n,1,a[i],pw[n-a[i]]);Tr2.update(1,n,1,a[i],pw[a[i]-1]);
int len=min(a[i]-1,n-a[i]),l=a[i]-len,r=a[i]+len;
int h1=Tr1.query(1,n,1,l,a[i])*ip[n-a[i]]%P;
int h2=Tr2.query(1,n,1,a[i],r)*ip[a[i]-1]%P;
if(h1!=h2){flag=1;break;}
}
puts((flag?"YES":"NO"));
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现