牛客 匹配星星
题面:
思路:
code:
//https://ac.nowcoder.com/acm/contest/3005/I
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e5+5;
struct Node{
int a,b,c;
}e[maxm];
bool cmp(Node a,Node b){
return a.a<b.a;
}
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>e[i].a>>e[i].b>>e[i].c;
}
sort(e+1,e+1+n,cmp);
int ans=0;
multiset<int>s;
multiset<int>::iterator it;
for(int i=1;i<=n;i++){
if(e[i].c){
it=s.lower_bound(e[i].b);//找到第一个大于等于的
if(it!=s.begin()){
it--;//上一个就是y小于它的所有点中y最大的那个
s.erase(it);
ans++;
}
}else{
s.insert(e[i].b);
}
}
cout<<ans<<endl;
return 0;
}
CodeForces484 A. Bits
题意:
给l,r,问区间内[l,r]中的数二进制的1的个数最多的数是什么,如果1的个数相同,优先选择小值
思路:
从高位向低位遍历,如果前t个高位中l和r的二进制位相同,那么显然答案中的这t位也要相同
第t+1位不同,因为l<r,所以第t+1位一定是l的这一位为0,r的这一位为1,
如果t+1之后的r的二进制位全为1,那么就令t+1到最后全为1,否则令t+1位为0,t+1之后的为1
这样一定能使得1最多
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=70;
int ma[maxm];
int mi[maxm];
signed main(){
int T;
cin>>T;
while(T--){
int l,r;
cin>>l>>r;
for(int i=0;i<60;i++){
ma[i]=(r>>i&1);
mi[i]=(l>>i&1);
}
int ans=0;
int flag=1;//用来判断r的t+1位之后是否全部为1
int t=-1;
for(int i=60;i>=0;i--){
if(t!=-1){
if(!ma[i]){
flag=0;
break;
}
}else{
if(mi[i]==ma[i]){
if(mi[i])ans+=(1LL<<i);
}else{
t=i;
}
}
}
if(t!=-1){
if(flag)ans=r;
else ans+=(1LL<<t)-1;
}
cout<<ans<<endl;
}
return 0;
}