题目链接:Educational Codeforces Round 43 (Rated for Div. 2)
A:先特判一位数的情况,然后肯定最后留下一个1,又不能有前导0,所以记录0的个数即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int c1,c2,n;
string str;
signed main(){
cin>>n>>str;
if(n==1) return cout<<str,0;
for(int i=0;i<n;i++) if(str[i]=='1') c1++; else c2++;
cout<<'1';
for(int i=1;i<=c2;i++) cout<<'0';
return 0;
}
B:位置判断一下即可,比较麻烦。可以按照行数,分奇偶来判断。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k;
signed main(){
cin>>n>>m>>k;
if(k<n) return cout<<1+k<<' '<<1,0;
k-=n; int x=k/(m-1),y=k%(m-1);
if(x&1) cout<<n-x<<' '<<m-y;
else cout<<n-x<<' '<<y+2;
return 0;
}
C:先按照l小到大排序,然后把右端点插入到BIT当中,数字记录id就好了,类似于偏序问题。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=3e5+10;
int n,d[N<<1],pos[N<<1],m;
struct node{int l,r,id;}t[N];
vector<int> v;
int cmp(node a,node b){return a.l==b.l?a.r>b.r:a.l<b.l;}
inline void add(int x){for(;x<=m;x+=(x&(-x))) d[x]++;}
inline int ask(int x){int s=0; for(;x;x-=(x&(-x))) s+=d[x]; return s;}
inline int sum(int l,int r){return ask(r)-ask(l-1);}
signed main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d %d",&t[i].l,&t[i].r),v.push_back(t[i].l),v.push_back(t[i].r),t[i].id=i;
sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());
sort(t+1,t+1+n,cmp); m=v.size();
for(int i=1;i<=n;i++){
t[i].l=lower_bound(v.begin(),v.end(),t[i].l)-v.begin()+1;
t[i].r=lower_bound(v.begin(),v.end(),t[i].r)-v.begin()+1;
if(sum(t[i].r,m)>0){
for(int j=t[i].r;j<=m;j++)
if(pos[j]){cout<<t[i].id<<' '<<pos[j]; return 0;}
}
add(t[i].r); pos[t[i].r]=t[i].id;
}
cout<<-1<<' '<<-1;
return 0;
}
F:可以证明,加倍的只会加给一个人,然后暴力即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,a,b,hp[N],dmg[N],cnt,res,mx,base,num;
priority_queue<int,vector<int>,greater<int> > q;
signed main(){
cin>>n>>a>>b; base=1LL<<a;
for(int i=1;i<=n;i++){
cin>>hp[i]>>dmg[i]; res+=dmg[i];
if(hp[i]>dmg[i]) q.push(hp[i]-dmg[i]);
}
while(q.size()>b) q.pop();
if(!b) return cout<<res,0; mx=res;
for(int i=1;i<=n;i++){
int x=hp[i]*base;
if(q.size()&&hp[i]-dmg[i]>=q.top())
mx=max(mx,res-(hp[i]-dmg[i])+x-dmg[i]);
else{
if(q.size()<b) mx=max(mx,res+x-dmg[i]);
else mx=max(mx,res-q.top()+x-dmg[i]);
}
}
while(q.size()) mx+=q.top(),q.pop();
cout<<mx;
return 0;
}