C题题意:
给定 ABCD是范围,然后求xyz构成的合法三角形的个数
题解:
枚举 的值,然后可以直接算出
的范围和
的范围
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
ll ans=0;
for(int i=max(a+b,c+1);i<=b+c;i++)//2 3 6 10,此时x=2,y=3,z最小要取6,不合法
{
int l=max(a,i-c);
int r=min(b,i-b);//x范围
if(l<=r)
ans+=1ll*(r-l+1)*(min(d,i-1)-c+1);
}
cout<<ans;
}
二分针对的是单调函数,那么三分针对的是双调函数
E题题意:
给定n个高度不同的,然后要使n个变成高度相同的,然后有三个操作:
增加消耗A,删除一个消耗R,从一个上面移动到另一个上面消耗M
然后问最小消耗
题解:
然后暴力三分,三分其相等高度的值
#include<bits/stdc++.h>
using namespace std;
long long h[100009];
long long ans=1e18;
int n,a,r,m;
long long f (long long t)
{
long long c_a=0,c_r=0;
for(int i=0; i<n; i++)
if(h[i]<t)
c_a+=t-h[i];
else
c_r+=h[i]-t;
long long c_m=min(c_a,c_r);
c_a-=c_m,c_r-=c_m;
long long ans1=a*c_a+r*c_r+m*c_m;
ans=min(ans,ans1);
return ans1;
}
int main()
{
cin>>n>>a>>r>>m;
m=min(a+r,m);
for(int i=0; i<n; i++)
cin>>h[i];
long long tl=0,tr=1e9+3;
while(tl<tr)
{
long long t1=tl+(tr-tl)/3;
long long t2=tl+(tr-tl)/3*2;
if(f(t1)>=f(t2))
tl=t1+1;
else
tr=t2-1;
}
cout<<ans;
}
京公网安备 11010502036488号