牛客挑战赛58
A:[NCT058A] 签到题
链接:https://ac.nowcoder.com/acm/contest/11198/A
签到题没啥好说的
code:
#include<bits/stdc++.h>
using namespace std;
int n,q;
int a[1000011];
int main()
{cin>>n>>q;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int x,y;
double t;
while(q--)
{
scanf("%d%d",&x,&y);
t=sqrt(x*1.0*x+y*1.0*y);
printf("%d\n",upper_bound(a,a+n,t)-a);
}
}
B:[NCT058B] 签到题
链接:https://ac.nowcoder.com/acm/contest/11198/B
这个题很好!
关键在于拆分为 (1)每一位计数 (2)想到要找到那个分界点 (3)异或的性质和或的性质充分利用
这个题真的超级棒
code:
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int mod=1e9+7;
ll ans=0;
int n,m;
ll ksm(ll aa,ll bb){
ll res=1;
while(bb){
if(bb&1)res=res*aa%mod;
aa=aa*aa%mod;
bb>>=1;
}
return res;
}
int main(){
cin>>n>>m;
ll k=(ksm(2,n-1)*(ksm(2,n)+mod-1)%mod)%mod;
ll a1=ksm(2,2*n-1);
ll a2=ksm(2,2*n);
ans=ksm(a1,m);
for(int i=1;i<=m;i++)
ans=(ans+ksm(a1,i-1)*k%mod*ksm(a2,m-i)%mod)%mod;
cout<<ans<<endl;
return 0;
}
C:[NCT058C1] 简单题
链接:https://ac.nowcoder.com/acm/contest/11198/C
分析:首先很容易想到二分时间T
观察到堡垒的战斗力都是一次函数,于是仅在 0 或 T 进行操作一定不劣(可以分四种情况)
此时,问题的判定变得简单起来。我们考虑在 0 时刻将手中的每一个堡垒替换成它此刻能打败的堡垒中,在 T 时刻战斗力最大的堡垒。
因为下一次操作就是在 T 时刻了,所以城堡的价值要用 T 时刻的战斗力来衡量。
找到能替换的最优堡垒可以考虑将 2n 个堡垒排序,然后二分即可。
这个题看似简单 实则还是有难度
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;
struct Node {
ll k,b,op;
}p[N];
bool cmp(Node a,Node b){
if(a.b!=b.b)
return a.b<b.b;
}
int n;
bool check(ll mid){
vector<ll>v1;
vector<ll>v2;
ll mx=-1e18;
for(int i=1;i<=n*2;i++){
ll now=p[i].b+mid*p[i].k;
mx=max(mx,now);
if(p[i].op) v2.push_back(now);
else v1.push_back(mx);
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
int len=v1.size();
for(int i=0;i<len;i++){
if(v1[i]<v2[i]) return 0;
}
return 1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>p[i].k>>p[i].b;
for(int i=n+1;i<=n*2;i++) cin>>p[i].k>>p[i].b;
for(int i=n+1;i<=n*2;i++) p[i].op=1;
sort(p+1,p+1+n*2,cmp);
ll l=0,r=1e9;
while(l<=r) {
ll mid=l+r>>1;
if(check(mid)) r=mid-1;
else l=mid+1;
}
if(l==1e9+1) cout<<"Can't win!";
else cout<<l<<"\n";
}