二分答案的边界问题还是要注意 double挨着,int+1-1, 此题用到long long,所以初始化ans要足够大,前缀和优化 依然根据check答案大小左右mid,虽然有s,但是有了+1-1加持所以能够自动推出 #include<bits/stdc++.h> #define int long long #define rep(i,x,y) for(register int i=x;i<=y;i++) using namespace std; ; int n,m,s,mi,mx,an…
题目大意: 额--貌似蛮清晰的,就不赘述了. 思路: 首先不难发现M越大Y越小,因此可以二分答案(方向不要弄错),二分出最小的不小于S的Y即可.而计算Y时可用前缀和O(n+m)求得.两种边界情况也要考虑一下(同时long long不要少开). 代码: #include<cstdio> #include<iostream> using namespace std; #define ll long long ; int n,m,i,h,t,k,mn,mx,mid,w[M],v[M],l…
题目链接:传送门 题目大意:给你n个物品,每件物品有重量 W 和价值 V,给m个区间,和一个标准值.(n,m最大200000) 要求找到一个值x,使得m个所有区间的权值和与标准值的差的绝对值最小.单个区间权值计算公式(数目num=0,价值sum=0,若满足 Wi >= x ,则++num,sum+=Vi) 单个区间权值为num*sum 题目思路: 二分+前缀和 首先权值和与X是递减关系,X越大所得值越小,我们容易想到二分,但是m个区间的比较判断怎么处理,如果直接模拟,复杂度最大可达 n^2l…
题目大意 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 vi.检验矿产的流程是: 1.给定 m 个区间[Li,Ri]: 2.选出一个参数 W: 3.对于一个区间[Li,Ri],计算矿石在这个区间上的检验值 Yi : 这批矿产的检验结果 Y 为各个区间的检验值之和.即: $$\sum_j 1\times \sum_j v_j,j\in[L_i,R_i]且w_j\geq W,j时矿石编号$$若这批矿产…