欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

CodeForces - 1480C Searching Local Minimum(交互+二分)

发布时间:2024/4/11 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 CodeForces - 1480C Searching Local Minimum(交互+二分) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目链接:点击查看

题目大意:给出一个长度为 nnn 的排列,需要找出一个“局部最小值”,所谓“局部最小值”就是对于某个 iii 来说,满足 ai<ai−1a_i<a_{i-1}ai<ai1ai<ai+1a_i<a_{i+1}ai<ai+1,更具体的, a0=an+1=infa_0=a_{n+1}=infa0=an+1=inf

可以询问不超过 100100100 次,每次可以询问一个位置的值

题目分析:挺有意思的一道二分的变形,我们可以从 a0=an+1=infa_0=a_{n+1}=infa0=an+1=inf 这个位置入手,不难看出初始时的答案区间 [l,r][l,r][l,r] 对应的就是 [1,n][1,n][1,n],且边界分别满足:

  • a0>a1=ala_0>a_1=a_la0>a1=al
  • an<an+1=ara_n<a_{n+1}=a_ran<an+1=ar
  • 此时我们假如询问出 midmidmidmid+1mid+1mid+1 位置的值,无非只有两种情况:

  • amid>amid+1a_{mid}>a_{mid+1}amid>amid+1:此时可以令原本的区间 [l,r][l,r][l,r] 的左端点右移,即新的区间变为 [mid+1,r][mid+1,r][mid+1,r]
  • amid<amid+1a_{mid}<a_{mid+1}amid<amid+1:此时可以令原本的区间 [l,r][l,r][l,r] 的右端点左移,即新的区间变为 [l,mid][l,mid][l,mid]
  • 这样一来新的区间的长度缩小了一半,且仍然满足初始时的性质

    这样迭代到 l==rl==rl==r 时,肯定是满足情况的一种解了

    如此一来询问复杂度就转换为二分的时间复杂度了,是 logloglog 级别的,大约不到 404040

    代码:

    // Problem: C. Searching Local Minimum // Contest: Codeforces - Codeforces Round #700 (Div. 2) // URL: https://codeforces.com/contest/1480/problem/C // Memory Limit: 512 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #define lowbit(x) x&-x using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=1e6+100; int ask(int x) {printf("? %d\n",x);fflush(stdout);int ans;scanf("%d",&ans);return ans; } int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n;scanf("%d",&n);int l=1,r=n;while(l<r) {int mid=(l+r)>>1;int a=ask(mid),b=ask(mid+1);if(a>b) {l=mid+1;} else if(a<b) {r=mid;}}printf("! %d\n",l);fflush(stdout);return 0; }

    总结

    以上是生活随笔为你收集整理的CodeForces - 1480C Searching Local Minimum(交互+二分)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。