2022省赛A组
2022省赛A组
C题
D题
没有简易版,简易版没有意义。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+9;
int a[N];
int vis[N];//大小为i的数最后一次出现在位置
struct node
{
int l,r;
}b[N];//收集所有符合要求的区间
int tot=0;
bool cmp(node x,node y)
{
if(x.r==y.r)
return x.l>y.l;//保险,从大到小
return x.r<y.r;//从小到大
}
int main()
{
int n,m,x,num_l,num_r;
cin>>n>>m>>x;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
int find_num = x^a[i];//找到与它异或为x的数
if(vis[find_num])//如果存在这个数
{
b[++tot].l = vis[find_num];
b[tot].r = i;
}
vis[a[i]]=i;//保证l越大越好
}
sort(b+1,b+1+tot,cmp);//区间按r排个序
int Maxx[N];
memset(Maxx,-1,sizeof(Maxx));
int maxx=-1;
for(int i=1;i<=tot;i++)
{
maxx=max(maxx,b[i].l);
Maxx[i]=maxx;//1~当前索引的l最大值,因为如果r满足要求,且想在目标区间内,l越大越好
}
while(m--)
{
cin>>num_l>>num_r;
int l=1,r=tot;
while(l<=r)//二分,找出小于等于num_r的索引
{
int mid=(l+r)/2;
if(b[mid].r<=num_r)l=mid+1;
else r=mid-1;
}
if(r>=1&&Maxx[r]>=num_l)//如果这个数存在且r比它小的所有区间的最大值小于num_l
cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
最长不下降30分
#include<bits/stdc++.h>
using namespace std;
const int inf =0x3f3f3f3f;
const int N = 1e5+9;
int a[N],b[N],dp[N];
int n,k;
int lis(int x)
{
int maxx=1;
memset(b,0,sizeof(b));
int tot =-1;
for(int i=1;i<=n;i++)
{
dp[i]=1;
if(i<x||i>x+k-1)b[++tot]=a[i];
}
for(int i=0; i<tot; i++)
{
dp[i]=inf;
}
for(int i=0; i<tot; i++)
{
*lower_bound(dp,dp+n,b[i])=b[i];
}
return lower_bound(dp,dp+n,inf)-dp;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
int maxx=1;
for(int i=1;i<=n-k+1;i++)
{//i~i+k-1
maxx=max(maxx,lis(i));
}
cout<<maxx+k<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】