链接:https://www.nowcoder.com/acm/contest/59/D
来源:牛客网
求距离
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
给你一个1 -> n的排列,现在有一次机会可以交换两个数的位置,求交换后最小值和最大值之间的最大距离是多少?
输入描述:
第一行一个数n
之后一行n个数表示这个排列
输出描述:
输出一行一个数表示答案
示例1
输入
5 4 5 1 3 2
输出
3
说明
把1和2交换后
序列为4 5 2 3 1
最大值5在数组的2位置,最小值1在数组的5位置
距离为3
备注:
对于100%的数据,1 <= n <= 100
这个题目很简单,找到最大的和最小的,看他们到1和n的最大距离就好
#include <bits/stdc++.h> using 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就是去维护下这个值
#include <bits/stdc++.h> using 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<mi)mi=x,mif=i; } printf("%d",max(max(n-maf,maf-1),max(n-mif,mif-1))); return 0; }
假如有相同的,就可以直接找到这些值,然后从两头遍历啊,只要一半就好了
链接:https://www.nowcoder.com/acm/contest/59/A
来源:牛客网
假的线段树
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制: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 3 2 3 3 2 1 3 1 1 1 3 3 1 2 1 3 2
输出
2 1
备注:
对于100%的数据,1 <= n, m ,ai <= 1000
n太小了,直接上啊
#include <bits/stdc++.h> using 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 ",i); break; } x-=s[i]; } } } } return 0; }
慢点的做法
#include <bits/stdc++.h> using 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 ",s[x]); } } } return 0; }