首页 > 其他分享 >练习记录-AtCoder Beginner Contest 311-(A-E)

练习记录-AtCoder Beginner Contest 311-(A-E)

时间:2023-07-23 15:12:24浏览次数:42  
标签:AtCoder const Beginner Contest int ll long yy tie

写的还挺顺的 F之后补

A - First ABC

找abc三个字母什么时候出现了一次 输出即可

B - Vacation Together

题意:最长的几个人一排里面均有时间

#include<bits/stdc++.h>
#define close std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const ll MAXN =  3e5+7;
const ll mod = 1e9+7;
const ll inf = 0x3f3f3f3f;
string s[MAXN];
void solve(){
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        s[i]=" "+s[i]; 
    }
    int cnt=0,maxs=0;
    for(int i=1;i<=m;i++){
        int flag=1;
        for(int j=1;j<=n;j++){
            if(s[j][i]=='x') flag=0; 
        }
        if(flag==1){
            cnt++;
        }
        else cnt=0;
        maxs=max(cnt,maxs);
    }
    cout<<maxs;
}
signed main(){
    solve();
}
View Code

 

C - Find it!

题意:输出任意一个环

解法:暴力找每个点,找到环就输出,最坏情况复杂度O(n)

#include<bits/stdc++.h>
#define close std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const ll MAXN =  3e5+7;
const ll mod = 1e9+7;
const ll inf = 0x3f3f3f3f;
int a[MAXN];
int vis[MAXN];
vector<int> ans;
void solve(){
    int n;cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
        //pre[a[i]]=i;
    }
    for(int i=1;i<=n;i++){
         if(vis[i]) continue;
         vis[i]=1;
         int k=i;
         while(1){
             k=a[k];
             if(!vis[a[k]])
             vis[a[k]]=1;
             else{
                 int now=k;
                 ans.push_back(now);
                 while(a[k]!=now){
                     ans.push_back(a[k]);
                     k=a[k];
                 }
                 return;
             }
         }
    }
}
signed main(){
    solve();
    cout<<ans.size()<<"\n";
    for(auto &it:ans) cout<<it<<" ";
}
View Code

D - Grid Ice Floor

题意:从(2,2)开始模拟溜冰,求可以划过的冰的块数

解法:对每个各自,存4个方向的状态的vis,一个点由上面一个点递推来的时候,方向是不变的,如果(x,y)递推的下一个点是墙,那么把这个(x,y)换3个方向重新push进队列类似bfs处理方式

#include<bits/stdc++.h>
#define close std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const ll MAXN =  3e5+7;
const ll mod = 1e9+7;
const ll inf = 0x3f3f3f3f;
char mp[300][300];
int fx[4][2]={-1,0,1,0,0,-1,0,1};
int vis[300][300][4];
void solve(){
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++) cin>>mp[i][j];
    }
    queue<array<int,3> > que;
    que.push({2,2,0});
    que.push({2,2,1});
    que.push({2,2,2});
    que.push({2,2,3});
    for(int i=0;i<4;i++) vis[2][2][i]=1;
    while(que.size()){
        int x=que.front()[0],y=que.front()[1],z=que.front()[2];
        que.pop();
        int xx=x+fx[z][0],yy=y+fx[z][1];
        if(xx<1||yy<1||xx>n||yy>m||vis[xx][yy][z]) continue;
        vis[xx][yy][z]=1;
        if(mp[xx][yy]=='.'){
            que.push({xx,yy,z});
        }
        else{
            for(int i=0;i<4;i++){
                if(vis[x][y][i]==0&&i!=z) {
                    que.push({x,y,i});
                    vis[x][y][i]=1;
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(mp[i][j]=='.'&&(vis[i][j][0]||vis[i][j][1]||vis[i][j][2]||vis[i][j][3])) ans++; 
        }
    }
    cout<<ans;
}
signed main(){
    solve();
}
View Code

 

E - Defect-free Squares

题意:统计没有洞的正方形数量,题目给出洞的位置;

解法:考虑二分+二位前缀和预处理

枚举一个点(i,j)作为左上角顶点,那么以这个顶点为左上角构成的最大方块数量就是最大的没有洞的正方形边长。对于边长我们可以用二分答案降低时间复杂度。用二维前缀和可以维护任意一个矩形内洞的数量

时间复杂度O(n^2logn)

#include<bits/stdc++.h>
#define close std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const ll MAXN =  3e5+7;
const ll mod = 1e9+7;
const ll inf = 0x3f3f3f3f;
#define int ll
int mp[3010][3010];
int pre[3010][3010];
bool check(int x,int y,int mid){
    int xx=x+mid-1;
    int yy=y+mid-1;
    int ans=pre[xx][yy]-pre[x-1][yy]-pre[xx][y-1]+pre[x-1][y-1];
    if(ans==0) return true;
    else return false;
}
void solve(){
    int n,m,q;cin>>n>>m>>q;
    int ans=0;
    for(int i=1;i<=q;i++){
        int x,y;cin>>x>>y;
        mp[x][y]=1;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            pre[i][j]=pre[i][j-1]+pre[i-1][j]-pre[i-1][j-1]+mp[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(mp[i][j]==1) continue;
            int l=1,r=min(n-i+1,m-j+1);
            while(l<=r){
                int mid=l+r>>1;
                if(check(i,j,mid)){
                    l=mid+1;
                }
                else r=mid-1;
            }
            ans+=r;
        }
    }
    cout<<ans;
}
signed main(){
    solve();
}
View Code

注意存图用数组 map会超时

标签:AtCoder,const,Beginner,Contest,int,ll,long,yy,tie
From: https://www.cnblogs.com/xishuiw/p/17575024.html

相关文章

  • Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)——D
    https://atcoder.jp/contests/abc311/tasks/abc311_d思路题目说如果当前方向的下一个点能走,那么就一直走,否则才能转向。根据题意模拟即可,这道题的难点在于,碰到已经走过的点到底要不要走。如果当前方向走到底,其中的点之前全部都走过那么就不能再走了。我们用bfs模拟,对于能一直走......
  • AtCoder Beginner Contest 311 A-E题解
    A-FirstABC题意给一个长度为N的仅由ABC三个字符组成的字符串S,问S中ABC三个字符第一次出现的位置的最大值。题解使用map<char,bool>判重,记录当前不同的字符串的个数cnt,当cnt等于3时,输出此时的下标+1作为答案。Code#include<bits/stdc++.h>usingnamespacestd;usingll......
  • AtCoder Beginner Contest 311
    A-FirstABC(abc311A)题目大意给定一个字符串,问最短的一个前缀,包含ABC这三个字符。解题思路注意到这个前缀的末尾字母一定是这三个字母中的一个,因此答案就是这三个字母出现位置最早的最大值。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=lo......
  • 2023.07.21 SMU Summer 2023 Contest Round 5
    2023.07.21SMUSummer2023ContestRound5A.PointsinSegments给n个,1~m的子集,求1~n中所有没在这些子集中出现过的数字把子集区间合并为集合s,输出1~n中没有在s中出现过的数#include"bits/stdc++.h"usingnamespacestd;typedefpair<int,int>PII;intn,m;vector<P......
  • Atcoder Regular Contest 154 E - Reverse and Inversion
    只要你发现是诈骗题就好办了。不要像我那样傻傻地瞪一个小时然后才发现那俩sigma里的东西相减是有性质的。先考虑计算单个\(f(p)\),一眼的树状数组……吗?考虑最终答案式子里\(i\)的系数:\(\sum\limits_{j<i}[p_j>p_i]-\sum\limits_{j>i}[p_j<p_i]\),因为\(\sum\limits_{j<i}[p......
  • SMU Summer 2023 Contest Round 5
    SMUSummer2023ContestRound5A.PointsinSegments\(\mathcal{O}(n\timesm)\)做法数据范围小,直接把每次的\(l-r\)跑一遍标记一下,最后跑一遍循环统计哪些没有被标记的并且输出就好了#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signed......
  • Atcoder Regular Contest 124 E - Pass to Next
    首先第一步是一个浅显的观察:我们要求的是所有可能的最终序列的贡献之和,如果能改为计算所有操作序列的贡献之和那问题会简单很多,并且我们惊奇地发现,如果一组\(x_i\)全大于\(0\),那么把它们全减去\(1\)以后得到的答案序列不会改变,而对于任意一种可能的最终序列,必然存在一组\(\m......
  • Atcoder Grand Contest 057 D - Sum Avoidance
    先来找些性质:\(A\)中最小的元素\(M\)肯定是最小的不是\(S\)的因子的数,由于\(\text{lcm}(1,2,3,\cdots,43)>10^{18}\),所以\(M\le43\)。对于每个\(0\lei<M\),\(\bmodM=i\)的数被选择的部分必然是一段后缀,因为如果你选择了\(M\)选择了某个\(\bmodM=i\)的数\(v\),......
  • AtCoder Grand Contest 049 E Increment Decrement
    洛谷传送门AtCoder传送门好题。同时考查了slopetrick和选手的计数能力,不愧是AGCE。先考虑问题的第一部分。你现在有一个初始全为\(0\)的序列\(b\)。你每次可以给\(b\)单点\(\pm1\),代价为\(1\),或区间\(\pm1\),代价为\(m\)。求把\(b\)变成给定序列\(a\)的......
  • AtCoder Beginner Contest 310
    A-OrderSomethingElse#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn,p,q;cin>>n>>p>>q;......