Day5 题目做完,感觉银牌距离我近而遥远…
这套题五题稳银,而且这五题都不算难题,但是看看自己能不能一遍写成,这是有难度的…
A.Alice’s Print Service
买东西,买的越多越便宜,每次询问一个x,求买x件物品最便宜的价格(可以多买)
维护一个区间最小值 M I N i 表 示 i − n 的 区 间 最 小 值 MIN_i表示i-n的区间最小值 MINi表示i−n的区间最小值,我们知道,我们可以多买,但是不能少买.设小于当前数量的标准为i,所以只需要比较 min i + 1 n M I N i \min\limits_{i+1}^{n} MIN_i i+1minnMINi与 ( x − s [ i ] ) ∗ p [ i ] (x-s[i])*p[i] (x−s[i])∗p[i],取较小的即可(查找i要用二分)
(其实这题开始想线段树RMQ的…)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5;
ll jt[maxn],pri[maxn];
ll minn[maxn];
int n,m;
ll mymin(ll a,ll b){
return a<b?a:b;
}
int main()
{
int t;scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld%lld",&jt[i],&pri[i]);
}
ll mint=1e18+18;
for(int i=n;i>=1;--i) {
mint=mymin(mint,jt[i]*pri[i]);
minn[i]=mint;
}
minn[n+1]=1e18+18;
for(int i=1;i<=m;++i){
ll t;
scanf("%lld",&t);
int pos=upper_bound(jt+1,jt+1+n,t)-jt;
//cout<<pos<<endl;
printf("%lld\n",mymin(minn[pos],t*pri[pos-1]));
}
}
}
C.Collision
####简单几何