K-th Nearest
好神奇,这道题竟然要用二分答案做QAQ;
二分距离,然后check符合要求的点的个数QAQ;
还有一个令人十分难过的点:就是在二分的时候,r取值要足够大才行;
#include <bits/stdc++.h>
using namespace std;
const long long N=1e5+12;
long long a[N];
bool check(long long xmid,long long b,long long n,long long k)
{
int l=lower_bound(a+1,a+n+1,b-xmid)-a;
int r=upper_bound(a+1,a+n+1,b+xmid)-a;
return r-l>=k;
}
long long search_min(long long b,long long k,long long n)
{
long long l=0,r=1e18,mid;
while(l<r){
mid=l+r>>1;
if(check(mid,b,n,k)) r=mid;
else l=mid+1;
}
return r;
}
int main()
{
long long n,q;
cin>>n>>q;
for(long long i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
while(q--)
{
long long b,k;
cin>>b>>k;
long long ans=search_min(b,k,n);
cout<<ans<<endl;
}
return 0;
}
跳石头
依然是二分答案QAQ
二分距离,通过check判断需要取走的石头的个数QAQ
其中check部分,mid是此时间距的最大值,如果两个石头之间的距离不到最大值就可以把这块石头取走QwQ,然后就可以统计取走的石头数来作比较啦QWQ;
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+12;
int a[N]={};
bool check(int mid,int m,int n)
{
int y=0,k=0;
for(int i=1;i<=n+1;i++){
if(a[i]-a[k]<mid)
y++;
else k=i;
}
return y<=m;
}
int search_max(int L,int m,int n)
{
int l=1,r=L,mid;
while(l<r){
mid=l+r+1>>1;
if(check(mid,m,n)) l=mid;
else r=mid-1;
}
return l;
}
int main()
{
int L,n,m;
cin>>L>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
a[n+1]=L;
int ans=search_max(L,m,n);
cout<<ans;
return 0;
}
Trophy
要用前缀和QWQ;
但是有个小小的问题,在取minn的时候要把范围开到好大好大才可以,因为它真的有可能2e5组数据全是1e9QWQ;
#include <bits/stdc++.h>
using namespace std;
#define int long long
const long long N=2e5+12;
int a[N]={},b[N]={},s[N]={},a1[N]={};
signed main()
{
int n,x;
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
a1[i]=a[i]+b[i];
}
for(int i=1;i<=n;i++){
s[i]=s[i-1]+a1[i];
}
int minn=2e18;//就是这里,要开好大才行QAQ;
for(int i=1;i<=min(x,n);i++){
if(i!=1) b[i]=min(b[i],b[i-1]);
int m=s[i]+(x-i)*b[i];
if(m<minn){
minn=m;
}
}
cout<<minn;
return 0;
}
Rotation
似乎是通过改变对于首位置的标记来达到移动字符串的效果(
(怎么感觉有点类似于物理里边的相对运动QAQ
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,q;
cin>>n>>q;
string s;
cin>>s;
int head=0;
while(q--)
{
int t,x;
cin>>t>>x;
if(t==1){
head=(head+n-x)%n;
}
if(t==2){
cout<<s[(head+x-1)%n]<<endl;
}
}
return 0;
}