洛谷 P1314 聪明的质监员 —— 二分
2024-08-30 19:16:46
题目:https://www.luogu.org/problemnew/show/P1314
显然就是二分那个标准;
当然不能每个区间从头到尾算答案,所以要先算出每个位置被算了几次;
不知为何自己第一想法是把符合要求的位置插入树状数组再遍历区间得到该区间内的个数然后在其左右端点差分最后遍历位置时一边计算每个位置的次数;
但其实用前缀和就可以了...而且前缀和比上面那个快好多...
调了好半天,才发现 ans 的初值不能习惯性地赋成 0x3f3f3f3f,那个才是个 int 范围内的...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((L+R)>>1)
using namespace std;
typedef long long ll;
int const maxn=2e5+;
int n,m,mx,w[maxn],v[maxn],f[maxn],l[maxn],r[maxn],d[maxn],num[maxn];
ll ans,s,sum[maxn];
ll rd()
{
ll ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<3ll)+(ret<<1ll)+ch-'',ch=getchar();
return f?ret:-ret;
}
void add(int x){for(;x<=n;x+=(x&-x))f[x]++;}
int query(int x){int ret=; for(;x;x-=(x&-x))ret+=f[x]; return ret;}
ll work(int x)
{
ll ret=;
// memset(f,0,sizeof f);
// memset(d,0,sizeof d);
// for(int i=1;i<=n;i++)if(w[i]>=x)add(i);
// for(int i=1;i<=m;i++)
// {
// int k=query(r[i])-query(l[i]-1);
// printf("l=%d r=%d k=%d\n",l[i],r[i],k);
// d[l[i]]+=k; d[r[i]+1]-=k;
// }
// for(int i=1,nw=0;i<=n;i++)
// {
// nw+=d[i];
// if(w[i]>=x)ret+=(ll)v[i]*nw;
// printf("i=%d ret=%lld\n",i,ret);
// }
memset(sum,,sizeof sum);
memset(num,,sizeof num);
for(int i=;i<=n;i++)
{
num[i]=num[i-]+(w[i]>=x);
sum[i]=sum[i-]+(w[i]>=x?v[i]:);
// printf("num[%d]=%d sum[%d]=%d\n",i,num[i],i,sum[i]);
}
for(int i=;i<=m;i++)
ret+=(sum[r[i]]-sum[l[i]-])*(num[r[i]]-num[l[i]-]);
return ret;
}
int main()
{
n=rd(); m=rd(); s=rd();
for(int i=;i<=n;i++)w[i]=rd(),v[i]=rd(),mx=max(mx,w[i]);
for(int i=;i<=m;i++)l[i]=rd(),r[i]=rd();
int L=,R=mx+; ans=1e13;
//ans=inf;
while(L<=R)
{
ll ret=work(mid);
// printf("ret=%lld mid=%d L=%d R=%d\n",ret,mid,L,R);
if(ret>=s)
{
// if(ans<=ret-s)break;
ans=min(ans,ret-s); L=mid+;
}
else
{
// if(ans<=s-ret)break;
ans=min(ans,s-ret); R=mid-;
} }
printf("%lld\n",ans);
return ;
}
最新文章
- JQuery中操作Css样式的方法
- 为Angularjs ngOptions加上index解决方案
- 记sql语句空格带来的问题
- java作业7
- C#之玩转反射【转:http://www.cnblogs.com/yaozhenfa/p/CSharp_Reflection_1.html】
- mysql从一个表中拷贝数据到另一个表中sql语句
- 10段实用的HTML5代码
- 我的Android进阶之旅------>;Android安全退出应用程序的几种方式
- AS3中释放优化的几条常识
- python文件和文件夹訪问File and Directory Access
- python下用OpenCV的圆形检测
- 四级地址插件升级改造(京东商城地址选择插件)city-picker
- JavaScript(第十六天)【BOM基础】
- 微信公众号开发C#系列-5、用户和用户组管理-支持同步
- Deployment Characteristics of ";The Edge"; in Mobile Edge Computing
- 【C#】 break continue return 的区别
- python(62):保留两位小数
- FileZilla连接腾讯云Centos7
- matplotlib基础知识全面解析
- 将如下三组不同类型的数据利用DataInputStream和DataOutputStream写入文件,然后从文件中读出
热门文章
- PHP:GD库 图片水印处理
- (十一)python3 encode()和decode()
- Spider-Python爬虫之PyQuery基本用法
- 集训第五周动态规划 G题 回文串
- 【02】AJAX XMLHttpRequest对象
- ROS 笔记 程序包/节点/topic
- centos相关
- ZOJ 2561 Order-Preserving Codes
- CF601D:Acyclic Organic Compounds
- PatentTips - Hierarchical RAID system including multiple RAIDs