Codeforces Round #464 (Div. 2) C. Convenient For Everybody ----- 思維+字首和
阿新 • • 發佈:2018-12-11
題意:
- 注意題目中沒有0:00時 以及 s,f 的區間指左閉右開區間[s,f] 即可
做法:
- 就是找一段長度為 f-s-1的連續區間,使得這段區間的和最大,由於具有時間特性,所以要注意時間成環狀的問題,所以我們在處理的時候,加倍處理即可。 比如: 1 2 3 4 1 -----> 1 2 3 4 1 1 2 3 4 1
- 自己腦子zz,居然寫成了二分,這樣容易錯失最小答案……
wa的有點多(゚Д゚#)
AC程式碼:
#include<bits/stdc++.h> #define IO ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define pb(x) push_back(x) #define sz(x) (int)(x).size() #define sc(x) scanf("%d",&x) #define pr(x) printf("%d\n",x) #define abs(x) ((x)<0 ? -(x) : x) #define all(x) x.begin(),x.end() #define mk(x,y) make_pair(x,y) #define debug printf("!!!!!!\n") #define fin freopen("in.txt","r",stdin) #define fout freopen("out.txt","w",stdout) using namespace std; typedef long long ll; const int mod = 1e9+7; const double PI = 4*atan(1.0); const int maxm = 3e5+5; const int maxn = 2e5+10; const int INF = 0x3f3f3f3f; inline int read() { char x; int u,flag = 0; while(x = getchar(),x<'0' || x>'9') if(x == '-') flag = 1; u = x-'0'; while(x = getchar(),x>='0' && x<='9') u = (u<<3)+(u<<1)+x-'0'; if(flag) u = -u; return u; } struct node { int l,r; int val; }ans[maxn]; //bool cmp(node a,node b) 用二分可能會錯失smallest answer!!! //{ // return a.val<b.val; //} //vector<node> vec; //struct cmp1 //{ // bool operator()(const node &a,const node &b)const{ // return a.val<b.val; // } //}; int pos[maxn]; int a[maxn]; int sum[maxn]; int main() { #ifdef LOCAL_FILE fin; #endif // LOCAL_FILE int n = read(); int s,f; for(int i=1;i<=n;i++) a[i] = read(); for(int i=n+1;i<=2*n;i++) a[i] = a[i-n]; //加倍處理 for(int i=1;i<=2*n;i++) sum[i] = sum[i-1]+a[i]; s = read(); f = read(); int len = f-s; //由於題意定義,肯定是要連續的區間 int mx = -1; int k = 0; for(int i=1;i<=2*n;i++) { ans[i].l = i-len+1; ans[i].r = i; ans[i].val = sum[i]-sum[i-len]; mx = max(mx,ans[i].val); } for(int i=1;i<=2*n;i++) { if(ans[i].val == mx) pos[k++] = i; } // sort(ans+1,ans+1+2*n,cmp); 用二分可能會錯失smallest answer!!! 腦子ZZ了 (T▽T) // for(int i=1;i<=2*n;i++) // vec.pb(ans[i]); // node tmp; // tmp.val = mx; // auto it = lower_bound(vec.begin(),vec.end(),tmp,cmp1()); // cout<<(*it).l<<" "<<(*it).r<<endl; // cal = (*it).l - 1; int cal,res; int fres = INF; for(int i=0;i<k;i++) { cal = ans[pos[i]].l-1; res = (s-cal+n)%n; while(res<0) res = (res+n)%n; //answer>0 fres = min(res,fres); } if(fres == 0) fres = n; printf("%d\n",fres); return 0; }