比赛 |
聪明的工作员 |
评测结果 |
AAAAWWWWWWWWWWWWWWWW |
题目名称 |
聪明的质监员 |
最终得分 |
20 |
用户昵称 |
Hyoi_0Koto |
运行时间 |
1.214 s |
代码语言 |
C++ |
内存使用 |
4.89 MiB |
提交时间 |
2017-03-21 20:10:02 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#define maxn 200001
using namespace std;
int n,m,w,l,r,maxw,now;
long long S,j,k;
struct Request{
int l;
int r;
}request[maxn];
int W[maxn],v[maxn],sum[maxn],ans[maxn];
void getsum(int w)
{
sum[1]=(W[1]>w)?1:0;
for(int i=2;i<=n;i++)
{
if(W[i]>=w)
sum[i]=sum[i-1]+1;
else
sum[i]=sum[i-1];
}
}
void getans(int w)
{
ans[1]=(W[1]>w)?v[1]:0;
for(int i=2;i<=n;i++)
{
if(W[i]>=w)
ans[i]=ans[i-1]+v[i];
else
ans[i]=ans[i-1];
}
}
long long gety(int w)
{
getsum(w);
getans(w);
long long s=0;
for(int i=1;i<=m;i++)
{
int x=request[i].l;
int y=request[i].r;
s+=(sum[y]-sum[x-1])*(ans[y]-ans[x-1]);
}
return s;
}
void input(){
cin>>n>>m>>S;
maxw=-1;
for(int i=1;i<=n;i++)
{
cin>>W[i]>>v[i];
if(maxw<W[i])
maxw=W[i];
}
for(int i=1;i<=m;i++)
cin>>request[i].l>>request[i].r;
w=maxw;
l=1,r=w;
}
int divide(int l,int r){
w=(l+r)/2;
now=gety(w);
if(now>S)
{
if(r==w||r==w+1)
{
if(w+1<=maxw)
{
j=gety(w+1);
j=abs(S-j);
k=abs(S-now);
return ((j<k)?j:k);
}
else
return abs(S-now);
}
divide(w,r);
}
else if(now<S)
{
if(l==w||w==l+1)
{
if(w-1>=1)
{
j=gety(w-1);
j=abs(S-j);
k=abs(S-now);
return ((j<k)?j:k);
}
else
return abs(S-now);
}
divide(l,w);
}
else
{
return 0;
}
}
int main()
{
freopen("qc.in","r",stdin);
freopen("qc.out","w",stdout);
input();
cout<<divide(l,r);
return 0;
}