codeforces div3 935
题解:一道二分糖题
首先我们先在原序列跑一遍题目给的二分,然后跑出最后的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; }