链接:
来源:牛客网 求距离
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld
题目描述
给你一个1 -> n的排列,现在有一次机会可以交换两个数的位置,求交换后最小值和最大值之间的最大距离是多少?
输入描述:
第一行一个数n 之后一行n个数表示这个排列
输出描述:
输出一行一个数表示答案
示例1
输入
54 5 1 3 2
输出
3
说明
把1和2交换后 序列为4 5 2 3 1 最大值5在数组的2位置,最小值1在数组的5位置 距离为3
备注:
对于100%的数据,1 <= n <= 100
这个题目很简单,找到最大的和最小的,看他们到1和n的最大距离就好
#includeusing namespace std;int main(){ int n,ma,mi; scanf("%d",&n); for(int i=1,x;i<=n;i++) { scanf("%d",&x); if(x==1)ma=i; if(x==n)mi=i; } if(mi>ma)swap(mi,ma); printf("%d",max(n-mi,ma-1)); return 0;}
假如不是1到n就是去维护下这个值
#includeusing namespace std;int main(){ int n,mi,ma,maf,mif; scanf("%d",&n); scanf("%d",&mi); ma=mi,maf=mif=1; for(int i=2,x;i<=n;i++) { scanf("%d",&x); if(x>ma)ma=x,maf=i; else if(x
假如有相同的,就可以直接找到这些值,然后从两头遍历啊,只要一半就好了
链接:
来源:牛客网 假的线段树
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld
题目描述
给你一个长为n的序列a,有m次操作
1.把区间[l,r]内所有x变成y
2.查询区间[l,r]内第k小值
输入描述:
第一行两个数n,m 第二行n个数表示序列a 后面m行 1 l r x y :把区间[l,r]中所有x变成y 2 l r k :查询区间[l,r]中的第k小值
输出描述:
对于每个询问,输出一个数表示答案
示例1
输入
3 32 3 32 1 3 11 1 3 3 12 1 3 2
输出
21
备注:
对于100%的数据,1 <= n, m ,ai <= 1000
n太小了,直接上啊
#includeusing namespace std;const int N=1e3+5;int a[N],s[N];int main(){ int x,y,n,m,c,l,r; while(~scanf("%d%d",&n,&m)) { for(int i=1; i<=n; i++)scanf("%d",&a[i]); while(m--) { scanf("%d",&c); if(c==1) { scanf("%d%d%d%d",&l,&r,&x,&y); for(; l<=r; l++) { if(a[l]==x)a[l]=y; } } else { memset(s,0,sizeof s); scanf("%d%d%d",&l,&r,&x); for(; l<=r; l++)s[a[l]]++; for(int i=1; i<1001; i++) { if(s[i]>=x) { printf("%d\n",i); break; } x-=s[i]; } } } } return 0;}
慢点的做法
#includeusing namespace std;const int N=1e3+5;int a[N],s[N];int main(){ int x,y,n,m,c,l,r; while(~scanf("%d%d",&n,&m)) { for(int i=1; i<=n; i++)scanf("%d",&a[i]); while(m--) { scanf("%d",&c); if(c==1) { scanf("%d%d%d%d",&l,&r,&x,&y); for(; l<=r; l++) if(a[l]==x)a[l]=y; } else { scanf("%d%d%d",&l,&r,&x); for(int j=1; j<=(r-l+1); j++) s[j]=a[j+l-1]; sort(s+1,s+2+r-l); printf("%d\n",s[x]); } } } return 0;}