70求助TLE

P1314 [NOIP2011 提高组] 聪明的质监员

tql
by ousuimei_68 @ 2019-02-16 17:42:35


不应该直接求区间可以用前缀和 ```cpp #include <cstdio> #include <cctype> #include <algorithm> #define rr register using namespace std; const int N=200011; struct rec{int w,v;}a[N]; int n,m,l[N],r[N],c[N],d[N]; long long b[N],stdd; inline signed iut(){ rr int ans=0; rr char c=getchar(); while (!isdigit(c)) c=getchar(); while (isdigit(c)) ans=ans*10+(c-48),c=getchar(); return ans; } inline long long check(int mid){ rr long long ans=-stdd; for (rr int i=1;i<=n;++i) b[i]=b[i-1]+a[i].v*(a[i].w>=mid); for (rr int i=1;i<=n;++i) c[i]=c[i-1]+(a[i].w>=mid); for (rr int i=1;i<=m;++i) ans+=(b[r[i]]-b[l[i]-1])*(c[r[i]]-c[l[i]-1]); return ans; } signed main(){ n=iut(); m=iut(); scanf("%lld",&stdd); for (rr int i=1;i<=n;++i) a[i]=(rec){iut(),iut()}; for (rr int i=1;i<=m;++i) l[i]=iut(),r[i]=iut(); for (rr int i=1;i<=n;++i) d[i]=a[i].w; sort(d+1,d+1+n); rr int tt=unique(d+1,d+1+n)-d-1; rr int L=1,R=tt+1; rr long long minx=1e18; while (L<R){ rr int mid=(L+R)>>1; rr long long t=check(d[mid]); if (t<=0) R=mid; else L=mid+1; t=t<0?-t:t; minx=minx<t?minx:t; } return !printf("%lld",minx); } ```
by lemondinosaur @ 2019-02-16 17:44:45


代码丑陋,敬请谅解 @[WA我最强](/space/show?uid=133816)
by lemondinosaur @ 2019-02-16 17:45:46


@[ousuimei_68](/space/show?uid=58319) orz
by beargeng是女孩子 @ 2019-02-16 17:50:30


@[SSL_XJQ_逐风之刃](/space/show?uid=37782) 非常感谢,我改一下二分检查函数
by beargeng是女孩子 @ 2019-02-16 17:50:59


好的
by lemondinosaur @ 2019-02-16 17:57:53


|