1 solutions
-
0
C++ :
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define MAXN 200000 #define MAXM 200000 #define INF 0x3f3f3f3f typedef long long int LL; struct things { int w,val; things(){} things(int a,int b):w(a),val(b){} bool operator < (const things &a)const { return w>a.w; } }A[MAXN+10]; int N,M; LL S; int L[MAXM+10],R[MAXM+10]; int MinW=INF,MaxW=-INF; LL sum[MAXN+10]; int num[MAXN+10]; LL Gety(int W) { LL rn=0; sum[0]=num[0]=0; for(int i=1;i<=N;++i) { num[i]=num[i-1]+(A[i].w>=W); sum[i]=sum[i-1]+(A[i].w>=W?A[i].val:0); } for(int i=1;i<=M;++i) rn+=(num[R[i]]-num[L[i]-1])*(sum[R[i]]-sum[L[i]-1]); return rn; } int main() { //freopen("qc.in","r",stdin); //freopen("qc.out","w",stdout); scanf("%d%d%lld",&N,&M,&S); int i,j; for(i=1;i<=N;++i) { scanf("%d%d",&A[i].w,&A[i].val); MinW=min(MinW,A[i].w); MaxW=max(MaxW,A[i].w); } for(i=1;i<=M;++i) scanf("%d%d",&L[i],&R[i]); LL maxval=Gety(MinW),minval=Gety(MaxW); if(maxval<=S) { printf("%lld\n",S-maxval); return 0; } if(minval>=S) { printf("%lld\n",minval-S); return 0; } int l=MinW,r=MaxW;//W越大,Y越小 LL ans=0x3f3f3f3f3f3f3f3fll; while(l<r) { int mid=(l+r)>>1; LL val=Gety(mid); ans=min(ans,abs(S-val)); if(val<S)r=mid-1; else l=mid+1; } ans=min(ans,min(abs(Gety(l)-S),abs(Gety(r)-S))); printf("%lld\n",ans); //fclose(stdin); //fclose(stdout); } /* 5 3 15 1 5 2 5 3 5 4 5 5 5 1 5 2 4 3 3 */
- 1
Information
- ID
- 17302
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By