2023.5.7拷逝
T1
假设交换了
如果
另外,此题需要特别注意:当
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,c,ans,x,a[1000005];
int main(){
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&c);
for(int i=1;i<=n;++i)
scanf("%lld",&a[i]);
for(int i=1;i<=m;++i){
scanf("%lld",&x);
if(a[x]<a[x+1])
++c;
else if(a[x]>a[x+1])
--c;
ans^=c;
swap(a[x],a[x+1]);
}
printf("%lld\n",ans);
fclose(stdin);fclose(stdout);
return 0;
}
T2
不难发现,如果存在逆序对,那么最近的逆序对距离一定是1。所以只需要检查这个数列是否存在逆序对,即是否不单调递增即可。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t,n,a[5];
int read(){
char g;int w=0,f=1;bool ok=0;
while(1){
g=getchar();
if(g=='-')
ok=1,f=-1;
else if(g>='0'&&g<='9')
ok=1,w=w*10+f*(int)(g-'0');
else if(ok) break;
}
return w;
}
int main(){
freopen("distance.in","r",stdin);
freopen("distance.out","w",stdout);
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int ok=0;
for(int i=1;i<=n;++i){
a[i&1]=read();
if(i!=1&&a[i&1]<a[(i-1)&1])
ok=1;
}
printf("%d\n",ok);
}
fclose(stdin);fclose(stdout);
return 0;
}
T3
对于一个数
首先预处理一个数组
接下来扫描这个序列。设当前的数下标为
当
之后从
#include<iostream>
#include<ctime>
#include<cstdio>
using namespace std;
int n,a[5000005],ans,t,minn[5000005],st=clock();
int read() {
int s=0,f=1;char ch=getchar();
while(ch<'0' || ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
return s*f;
}
int main(){
//freopen("block.in","r",stdin);
//freopen("block.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i)
a[i]=read();
minn[n]=a[n];
if(minn[n]<=a[1])
printf("1\n");
else{
for(int i=n-1;i>=1;--i){
minn[i]=min(minn[i+1],a[i]);
if(!t&&minn[i]<=a[1]&&minn[i+1]>a[1])
t=i;
}
ans=1;
for(int i=2;i<=n;++i){
if(i>t){
++ans;t=i;
}
for(int j=t;j<=n;++j){
if(j==t&&minn[j]>a[i])
break;
if((minn[j]<=a[i]&&minn[j+1]>a[i])||(j==n&&minn[j]<=a[i])){
t=j;break;
}
}
}
printf("%d\n",ans);
}
fclose(stdin);fclose(stdout);
return 0;
}
T4(50pts)
首先不难想到朴素的DP:设
接下来考虑优化。设当
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,f[2][1000005],s;
const long long mod=1e9+7;
int main(){
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%lld%lld",&n,&m);
f[0][0]=1;
for(int i=1;i<=n;++i){
s=0;
for(int j=0;j<=m;++j){
if(j-i>=0)
s=(s-f[(i-1)&1][j-i]+mod)%mod;
s=(s+f[(i-1)&1][j])%mod;
f[i&1][j]=s%mod;
}
}
printf("%lld\n",f[n&1][m]%mod);
fclose(stdin);fclose(stdout);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】