CF1479A Searching Local Minimum
CF1479A Searching Local Minimum
題意:
題解:
先說結論:
若l,r滿足:
則一定又一個滿足題目條件的k會出現在區間[l,r]中,這就是我們要找的區間
現在我們開始證明:
利用反證法:假設對于任意k∈[l,r]多不滿足要求(即ak<min{ai?1,ai+1}a_{k}<min\{a_{i-1},a_{i+1}\}ak?<min{ai?1?,ai+1?})
因為al?1>ala_{l-1}>a_{l}al?1?>al?,且l不滿足要求,al!=al+1a_{l}!=a_{l+1}al?!=al+1?,則一定有al>al+1a_{l}>a_{l+1}al?>al+1?
同理可得:al+1>al+2a_{l+1}>a_{l+2}al+1?>al+2?,al+2>al+3a_{l+2}>a_{l+3}al+2?>al+3?,.........,ar?1>ara_{r-1}>a_{r}ar?1?>ar?
又因為ar+1>ara_{r+1}>a_{r}ar+1?>ar?,則r滿足情況,與假設不符
現在開始用這個結論做題,a0=an+1=+∞a_{0}=a_{n+1}=+∞a0?=an+1?=+∞,說明區間[l,r]就是符合結論的區間,那么答案也肯定在這里面,現在我們要縮小區間范圍,可以二分,二分出一個mid,詢問mid和mid+1的值
若amid<amid+1a_{mid}<a_{mid+1}amid?<amid+1?,說明[l,mid]也是符合結論的,這樣縮小范圍
若amid>amid+1a_{mid}>a_{mid+1}amid?>amid+1?,說明[mid+1,r]是符合要求的
這樣二分就解決了
代碼:
#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } 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'); } void rd_test() { #ifdef ONLINE_JUDGE #elsestartTime = clock ();freopen("data.in", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } const int maxn=1e5+9; int a[maxn]; int main() {//rd_test();int n;read(n);int l=1,r=n;while(l<r){int mid=l+r>>1;if(a[mid]==0){printf("? %d\n",mid);fflush(stdout);cin>>a[mid];}if(a[mid+1]==0){printf("? %d\n",mid+1);fflush(stdout);cin>>a[mid+1];}if(a[mid]<a[mid+1]){r=mid;}else if(a[mid]>a[mid+1]){l=mid+1;} // printf("");}printf("! %d\n",l);return 0;//Time_test(); }總結
以上是生活随笔為你收集整理的CF1479A Searching Local Minimum的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 探究贴片广告背后的技术大片
- 下一篇: 初识数据中心Mesos