您的位置:首页 > Web前端

Hackerrank 2020 February 2014 解题报告

2014-02-28 23:50 756 查看

Hackerrank 2020 February 2014 解题报告

比赛链接

Sherlock and Watson (20分)

题意:给定一个数组,向右平移K次,然后有Q个询问,问第x位置上是几

做法:直接模拟即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <functional>
#include <cmath>
typedef long long ll;
using namespace std;
int n,q,cmd,x,y,k;
int a[10100];
int lsize = 128;
vector<int> v[2000];
int maxid;
int solve(int x,int y,int target){
int idx = x/lsize,idy=y/lsize;
//cerr<<"idx="<<idx<<" idy="<<idy<<endl;
int ans = 0;
for(int i=x;i<lsize*(idx+1);i++){
if(a[i]<=target)
ans++;
}
for(int i=idy*lsize;i<=y;i++){
if(a[i]<=target)
ans++;
}
for(int i=idx+1;i<=idy-1;i++){
if(target < v[i][0])
continue;
else if(target >= v[i].back())
ans+=v[i].size();
else
{
int tmp = upper_bound(v[i].begin(),v[i].end(),target)-v[i].begin();
ans+=tmp;
}

}
return ans;
}
int main(){
//freopen("int.txt","r",stdin);
//freopen("out1.txt","w",stdout);
ios::sync_with_stdio(0);
int cs;
cin>>cs;
while(cs--){
cin>>n;
//lsize = (int)sqrt(n);
for(int i=0;i<=n/lsize;i++)
v[i].clear();
for(int i=0;i<n;i++)
cin>>a[i];
maxid = 0;
for(int i=0;i<n;i++){
int id = i/lsize;
maxid = id+1;
v[id].push_back(a[i]);
}
for(int i=0;i<maxid;i++){
sort(v[i].begin(),v[i].end());
}
cin>>q;
//cout<<"q="<<q<<endl;
while(q--){
cin>>cmd;
if(cmd == 1){
cin>>x>>k;
x--;
a[x] = k;
int id = x/lsize;
v[id].clear();
for(int i=id*lsize;i<n&&i<(id+1)*lsize;i++){
v[id].push_back(a[i]);
}
sort(v[id].begin(),v[id].end());
}else{
cin>>x>>y>>k;
x--;
y--;
int idx = x/lsize,idy = y/lsize;
if(idx == idy){
vector<int> tmp(a+x,a+y+1);
sort(tmp.begin(),tmp.end());
cout<<tmp[k-1]<<endl;
}else{
int lb = -1,ub=1001;
while(ub-lb>1){
int mid = (ub+lb)/2;
int rank = solve(x,y,mid);
//cerr<<"mid="<<mid<<" rank="<<rank<<endl;
if(rank >= k){
ub = mid;
}else{
lb = mid;
}
}
cout<<ub<<endl;
}
}
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: