标签:while min 而且 复杂度 pre def putc using ++
题意:一个圆,上面有n头牛(卧槽)
给出相邻两头牛顺时针的距离
问两只最远的牛的距离(min(顺时针距离,逆时针距离))
最远距离一定$\le$距离和/2
先求个前缀和
那么问题转化为:找到
$s_j-s_i<(dis/2)$的最大的$s_j-s_i$
我们可以发现,只要枚举了i,j,时间复杂度不可能$\le n^2$
变个形$s_j<s_i+(dis/2)$
而且s是递增的!!upperbound!
#include<cstdio> #include<iostream> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define int long long #define olinr return #define _ 0 #define love_nmr 0 #define DB double inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch==‘-‘) f=-f; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline void put(int x) { if(x<0) { x=-x; putchar(‘-‘); } if(x>9) put(x/10); putchar(x%10+‘0‘); } int n; int tot; int s[105050]; int d[105050]; int ans; signed main() { n=read(); for(int i=1;i<=n;i++) s[i]=s[i-1]+(d[i]=read()); tot=s[n]>>1; for(int i=1;i<=n;i++) { int pos=upper_bound(s+1,s+n+1,tot+s[i])-s-1; ans=max(ans,s[pos]-s[i]); } put(ans); olinr ~~(0^_^0)+love_nmr; }
标签:while min 而且 复杂度 pre def putc using ++
原文地址:https://www.cnblogs.com/olinr/p/9583608.html