题目:
咳咳...终于A了...
居然没注意到正着找pos是n方会TLE...所以要倒着找pos;
二分还写错了,改了半天...
小心前缀和取模后相减变成负数!!!!!!!!!
代码如下:
#include#include #include using namespace std;int const maxn=50005,mod=10007;int n,m,a[maxn],s[maxn][3],f[maxn][3],ans,mn,sum,l,r,pos[maxn];bool pd(int x){ int s=0,cnt=0; for(int i=1;i<=n;i++) { if(s+a[i]>x) { cnt++; s=0; } s+=a[i]; } return cnt<=m;//m!! return 1;}void solve1(){ r=s[n][0]; int mid=(l+r)>>1; while (l<=r) { if (pd(mid)) mn=mid,r=mid-1; else l=mid+1; mid=(l+r)>>1; }}void solve2(){ for(int i=1;i<=n;i++) { if(s[i][0]<=mn)f[i][0]=1; else break; } for (int i=1;i<=n;i++) { if (s[i][0]<=mn) continue; for (int j=i-1;j>=0;j--) if (s[i][0]-s[j][0]>mn) {pos[i]=j+1;break;}// for(int j=0;j