iwtgm-1
Codeforces Beta Round 72 (Div. 2 Only)
A.
A射杀B的一半,B剩下的一半射杀A的一半,A剩下的一半再射杀B剩下的一半
2*n分成4份,3次射杀机会分别射杀一份
void solve()
{
int n;cin>>n;
cout<<n*2-n/2;
}
或者
void solve()
{
int n;cin>>n;
cout<<2*n/4*3;
}
B.
存下相同连续序列的长度,一个序列贡献是n*(n+1)/2,求总和
要开long long,wa一发
int a[N];
vector<int>v;
void solve()
{
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int tmp=1;
a[n+1]=1e9+5;
for(int i=2;i<=n+1;i++){
if(a[i]==a[i-1])tmp++;
else{
if(tmp>1)v.push_back(tmp);
tmp=1;
}
}
ll ans=n;
for(int i=0;i<v.size();i++){
ans+=(v[i]-1)*v[i]/2;
}
cout<<ans;
}
C.
对于一个target,圆心横坐标-r到圆心横坐标+r,每一个值都用map映射到一个vector里的结构体,结构体里存储这个target的信息
把输入坐标从后往前遍历
对于每一个坐标,去遍历所映射的vector里的所有结构体,看这个点在不在这个圆上,若在,更新ans数组
struct node{
int o,r,idx;
};
map<int,vector<node>>mp;
pair<int,int>p[N];
int ans[M];
void solve()
{
memset(ans,-1,sizeof(ans));
int n;cin>>n;
for(int i=1;i<=n;i++){
struct node tmp;
cin>>tmp.o>>tmp.r;
tmp.idx=i;
for(int j=tmp.o-tmp.r;j<=tmp.o+tmp.r;j++){
mp[j].push_back(tmp);
}
}
int m;cin>>m;
for(int i=1;i<=m;i++)cin>>p[i].first>>p[i].second;
for(int i=m;i>=1;i--){
for(int j=0;j<mp[p[i].first].size();j++){
int a=mp[p[i].first][j].o,b=0,r=mp[p[i].first][j].r,idx=mp[p[i].first][j].idx;
int x=p[i].first,y=p[i].second;
if(sqrt((x-a)*(x-a)+(y-b)*(y-b))<=r)ans[idx]=i;
}
}
int res=0;
for(int i=1;i<=n;i++){
if(ans[i]!=-1)res++;
}
cout<<res<<endl;
for(int i=1;i<=n;i++){
cout<<ans[i]<<' ';
}
}
D.
记录下总的看诊次数和动物最多看病的次数
如果总诊数<k,输出-1
k时,重点是在次数参差不齐的情况下如何知道k次看诊后的情况
这里用到看病次数的二分,设为mid
所有动物前mid次看病总和>=k了,就可以记录答案了
可以多记录几个,然后后面重复的就不再输出,避免遗漏
把题目要求的输出读错了,一直认为会超时,
后面有读错了,debug之后终于找到了正确输出,
好在AC
ll a[N];
vector<ll>v;
map<ll,int>mp;
void solve()
{
ll n,k;cin>>n>>k;
ll sum=0;
ll ma=-1;
for(int i=1;i<=n;i++){
cin>>a[i];sum+=a[i];ma=max(ma,a[i]);
}
if(sum<k){
cout<<-1;return ;
}
ll l=1,r=ma,mid;
ll p;
while(l<=r){
mid=(l+r)/2;
ll tmp=0;
for(int i=1;i<=n;i++){
if(a[i]>=mid)tmp+=mid;
else tmp+=a[i];
}
if(tmp<k)l=mid+1;
else if(tmp==k){
p=mid+1;break;
}else {
p=mid;r=mid-1;
}
}
//cout<<"p="<<p<<endl;
ll tmp=0;
for(int i=1;i<=n;i++){
if(a[i]>=p-1)tmp+=p-1;
else tmp+=a[i];
}
//cout<<"tmp="<<tmp<<endl;
for(int i=1;i<=n;i++){
if(a[i]>=p){
tmp++;
if(tmp>k)v.push_back(i);
}
}
for(int i=1;i<=n;i++){
if(a[i]>=p+1)v.push_back(i);
}
for(int i=0;i<v.size();i++){
//cout<<"i="<<i<<' '<<"mp[i]="<<mp[i]<<endl;
if(mp[v[i]]==0){
cout<<v[i]<<' ';mp[v[i]]=1;
}else break;
}
}