codeforces div3 935

Problem - E - Codeforces

题解:一道二分糖题

首先我们先在原序列跑一遍题目给的二分,然后跑出最后的l点

我们稍微思考一下,这个l这个点一定小于或者等于x

为什么呢一个在这个二分里,如果最后的点是大于x的那么必定被r拿走,因为判断上l只能接收比x小的地点

所以我们知道l以后,要么就是l==x输出0

要么一次把x原先位置换到l位置即可,然后x原先是判断点那么它的结果必定小于等于x。  现在我把l这个小于等于x换过去一样的

#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
#define endl '\n'
using namespace std;
const int N=2e5+10,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}

int a[N];
void solve()
{
    int n,x;
    cin>>n>>x;
    int id=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]==x) id=i;
    }
    int ans;
    int l=1,r=n+1;
    while (r-l!=1)
    {
        int mid=(l+r)/2;
        if(a[mid]<=x) l=mid;
        else r=mid;
    }
    ans=l;
    if(a[ans]==x)
    {
        cout<<0<<endl;
    }
    else {
        cout << 1 << endl;
        cout << ans << " " << id << endl;
    }
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 

posted @ 2024-03-24 18:14  whatdo+  阅读(4)  评论(0编辑  收藏  举报