首页 > 其他分享 >Atcoder Beginner Contest 330 题解

Atcoder Beginner Contest 330 题解

时间:2024-01-16 12:12:57浏览次数:20  
标签:Showball Atcoder set int 题解 void 330 cin LL

AtCoder Beginner Contest 330 题解

A - Counting Passes 签到

void Showball(){
   int n,l;
   cin>>n>>l;
   int cnt=0;
   for(int i=0;i<n;i++){
    int x;
    cin>>x;
    cnt+=(x>=l);
   }
   cout<<cnt<<endl; 
}

B - Minimize Abs 1 思维

void Showball(){
   int n,l,r;
   cin>>n>>l>>r;
   vector<int> a(n);
   for(int i=0;i<n;i++) cin>>a[i];
   for(int i=0;i<n;i++){
    if(a[i]>r) cout<<r<<" ";
    else if(a[i]<l) cout<<l<<" ";
    else cout<<a[i]<<" "; 
   }
}

C - Minimize Abs 2 二分

枚举\(x\),二分\(y\)。更新答案即可。

LL sq[N];
void Showball(){
   for(int i=1;i<N;i++) sq[i]=1LL*i*i;
   LL d;
   cin>>d;
   LL ans=1e18;
   for(LL i=1;i*i<=d;i++){
     LL cur=d-i*i;
    int j=lower_bound(sq,sq+N,cur)-sq;
    if(sq[j]==cur) return cout<<0<<endl,void();
    ans=min(ans,abs(cur-sq[j]));
    ans=min(ans,abs(cur-sq[j-1]));
   }
   cout<<ans<<endl;
}

D - Counting Ls 计数

定义:

\(col[i]\)表示第\(i\)行 '\(o\)' 数量。

\(row[j]\)表示第\(j\)列 '\(o\)' 数量。

那么对于任意一个\((i,j)\)满足\(a[i][j]==\)'\(o\)',对答案的贡献即为\((col[i]-1)\times(row[j]-1)\)。

因为不存在和\((i,j)\)同行且同列的情况。所以计算结果不重不漏。

char a[N][N];
int col[N],row[N];
void Showball(){
   int n;
   cin>>n;
   for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
        cin>>a[i][j];
        if(a[i][j]=='o'){
            col[i]++;
            row[j]++;
        }
    }
   }

   LL ans=0;
   for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
        if(a[i][j]=='o'){
            ans+=(col[i]-1)*(row[j]-1);
        }
    }
   }
   cout<<ans<<endl;
}

E - Mex and Update 思维 诈骗

单调修改,求整体\(mex\)。
根据mex的性质,那么范围只可能\([0,n]\)。
用数组去统计每个数出现的次数,先将次数为0的全部放进\(set\),那么\(set\)中最小值就是\(mex\)。
对于单点修改,我们直接更新次数,并且维护一下\(set\)即可。

void Showball(){
    int n,q;
    cin>>n>>q;
    vector<int> a(n),cnt(n+1);
    set<int> s;
    for(int i=0;i<n;i++){
        cin>>a[i];
        if(a[i]<=n) cnt[a[i]]++;
    } 
    for(int i=0;i<=n;i++) if(!cnt[i]) s.insert(i); 
    while(q--){
        int x,v;
        cin>>x>>v;
        x--;
        if(a[x]<=n){
         if(!--cnt[a[x]]) s.insert(a[x]);
        }
        if(v<=n){
         if(++cnt[v]==1) s.erase(v);
        }
        a[x]=v;
        cout<<*s.begin()<<endl;
    }
}

F - Minimize Bounding Square 二分答案

要求边长的最小值,容易想到二分答案。
考虑\(check\)函数如何去写,那么就需要去求出所有点到变成为\(h\)正方形的最短距离之和。

我们发现横纵坐标相互之间没有影响,所以可以分开进行计算。

我们只知道正方形的边长,却不知道正方形的位置。所以正方形可以进行平移至理想情况。

所以我们发现如果两个端点在正方形的外面,那么移动次数就为\(y_1-y_2-h\)。而两个在里面的情况,移动次数就为\(0\)。所以我们可以对横纵坐标排序。那么每次的移动次数就是\((x[n-i-1]-x[i]-h)\),显然如果小于\(0\),说明都在里面,记为\(0\)即可。

void Showball(){
   int n;
   LL k;
   cin>>n>>k;
   vector<int> x(n),y(n);
   for(int i=0;i<n;i++) cin>>x[i]>>y[i];
   sort(all(x));
   sort(all(y));

   auto check=[&](int h){
     LL cnt=0;
     for(int i=0;i<=n/2;i++){
        cnt+=max(0,x[n-i-1]-x[i]-h);
        cnt+=max(0,y[n-i-1]-y[i]-h);
     }
     return cnt<=k;
   };
   int l=0,r=1e9+1;
   while(l<r){
     int mid=l+r>>1;
     if(check(mid)) r=mid;
     else l=mid+1;
   }
   cout<<l<<endl;
}

标签:Showball,Atcoder,set,int,题解,void,330,cin,LL
From: https://www.cnblogs.com/showball/p/17967379

相关文章

  • CF1437F Emotional Fishermen 题解
    题意:有\((n\le5000)\)个渔民,每个渔民钓了一条重\(a_i\)的鱼,渔民按任意顺序展示他们的鱼。若当前渔民的鱼的重量为\(x\),之前展示过的鱼的最大重量\(y\)。一个排列满足条件当且仅当对于每个\(x\),满足\(2y\lex\)或\(2x\ley\)。问有多少个排列满足条件,对\(998244353......
  • ABC336 F Rotation Puzzle 题解
    QuestionABC336FRotationPuzzle给出一个\(H\timesW\)的矩阵,里面填有数字,有一种操作选定一个\((x,y)\)交换\((i+x,j+y)\)和\((H-i+x,W-j+y)\)对于每一个\(1\lei\leH-1,1\lej\leW-1\)问,是否能经过\(20\)次以内的操作使得,最后的矩形变成\((i,j)=((i-1)\t......
  • P1002题解
    思路设\(dp_{i,j}\)表示第\(i\)行\(j\)列卒走到这里有多少种方式。卒是可以向右和下走,所以到这个点只能从左或上来,不难得出转移公式:\(dp_{i,j}=dp_{i-1,j}+dp_{i,j-1}\)。如果马在这个点上或者说马能到这个点上,那么卒不能到这个点,也就是卒到这个点的方式为\(0\)。如......
  • P1003题解
    简单模拟题。思路枚举每一个地毯,因为后面的会覆盖前面的,所以从正序枚举。如果要求的点的坐标在当前地毯上,则将答案赋值为当前地毯编号。最后输出答案。那如果这个点没有地毯呢?答案初始设为\(-1\),这样没有地毯覆盖的话,答案不会改变,这样输出答案就会是\(-1\)。注意:记得赋初......
  • P10058题解
    怎么前三题都是思维题啊。思路总共有三个操作,先不看翻转操作。如果你右移\(x\)位之后,左移\(x\)位,那么就相当于没有操作。这个应该是很好理解的。我们根据上面的结论,能得出以下代码。if(op==">"){cin>>x;f+=x;}elseif(op=="<"){......
  • CF1409D题解
    思路因为数据较大,使用字符串读入。考虑使用贪心。先统计出当前数码之和。然后从低位往高位枚举,看一下把当前位改了之后是否小于等于\(s\)。如果小于的话,则统计出把当前位往后所有位都改为0,\(k\)为多少,求出的\(k\)就是最优解。说明一下为什么要从低位往高位枚举,这样如果成......
  • AT_arc060_c题解
    纪念模拟考考挂。思路首先二分查找出当前点往后走最远能去哪个点,当前点为\(i\),记最远能去的那个点为\(nt_i\)。考虑建一棵树,将\(nt_i\)设为\(i\)点的父节点。暴力的话直接从当前点往上找,找到目标节点看几次就好了。但显然是过不了的。考虑使用倍增优化。设\(g_{i,j}......
  • 1.15模拟赛 T2题解
    简要题意多重背包但是乘法思路暴力就直接跑背包考虑乘法能否变为加法,可以找到模数的原根,将每个数映射一下,这样乘法就变成了加法,可以直接\(\text{bitset}\)优化,但是暴力这样做还是过不了于是我们考虑二进制分组优化背包,这样复杂度貌似就对了?code#pragmaGCCoptimize("Ofast......
  • border设置渐变boder-radius不生效问题解决方案
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"c......
  • 【题解】gym103743 (2022 JSCPC)
    A.PENTAKILL!考虑直接模拟,规则就是一个人将其他人全部都击杀,并且中间没有重复击杀。code:#include<bits/stdc++.h>usingnamespacestd;map<string,vector<string>>st;intn;stringa,b;intmain(){cin>>n;for(inti=1;i<=n;++i){ci......