首页 > 其他分享 >AtCoder Beginner Contest(abc) 299

AtCoder Beginner Contest(abc) 299

时间:2023-06-24 15:44:15浏览次数:39  
标签:AtCoder abc idx int long st maxn 299 true




A - Treasure Chest

题目大意

给定一个由' | ' ' * '和' . '组成的字符串, 并且保证一定有1个' * '和2个' | ', 检查' * '是否在两个' | '之间;

解题思路

签到题不多嗦了;
但是这里可以注意一下string的find函数; find(char c, int pos)意为从第pos个字符开始找字符c, 返回值是int, pos可以不写, 默认从开头开始找; 而这里我们用到了两个拓展的find函数: find_first_of(char c)和find_last_of(char c), 意为字符c第一次出现的位置和最后一次出现的位置;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5+10;
int n, m,idx;
signed main() {
    string s;
    cin >> n >> s;
    auto a = s.find_first_of('|');
    auto b = s.find_last_of('|');
    auto c = s.find('*');
    if (c >= a && c <= b) {
        cout << "in";
    }
    else cout << "out";
    return 0;
}




B - Trick Taking

题目大意

有n个人玩游戏, 每个人都有各自的颜色和序号; 现在给定一个颜色m, 如果有人的颜色也是m, 那么赢家就是这些人里面序号最大的; 如果没有人的颜色是m, 那么赢家就是与1号玩家颜色相同的玩家中序号最大的, 注意1号玩家也有可能是赢家

解题思路

签到题不多嗦了;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5+10;
int n, m,idx;
vector<int> v;
int r[N], c[N];
signed main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> c[i];
        if (c[i] == m) v.push_back(i);
    }
    for (int i = 1; i <= n; i++) cin >> r[i];
    int maxn = 0;
    if (v.size()) {
        for (int x : v) {
            if (r[x] > r[maxn]) maxn = x;
        }
        cout << maxn;
    }
    else {
        for (int i = 1; i <= n; i++) {
            if (c[i] == c[1]) {
                if (r[i] > r[maxn]) maxn = i;
            }
        }
        cout << maxn;
    }
}




C - Dango

题目大意

给定一个只由' o '和' - '组成的字符串, 先定义一种字符串s, s的开头或结尾其中一个必须是' - ', 并且s的长度取决于' o '的个数, 例如" oooo- "的长度为4; 现在从给定的字符串里面找到符合字符串s的要求的子串中最长的长度;

解题思路

以' - '为节点作为结算即可; 算是个签到题;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5+10;
int n, m,idx;
signed main() {
    cin >> n;
    string s;
    cin >> s;
    int maxn = 0;
    bool f = false;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'o') idx++;
        else {
            f = true;
            maxn = max(maxn, idx);
            idx = 0;
        }
    }
    maxn = max(maxn, idx);
    if (maxn == 0) f = false;
    if (f) cout << maxn;
    else cout <<-1;
}




D - Find by Query

题目大意

本题是一个交互题, 现有一个由01组成长度为n的字符串, 并且s1=0, sn=1; 现在可以最多给出20次询问, 输出" ? x ", x是1~n中的一个, 然后会给出sx的值; 现在需要我们找出一个位置p, 满足sp不等于s(p+1);

解题思路

这还是第一次遇到交互题, 看了看题解发现交互题就是你按规定样式输出后, 网站会根据你的输出, 把对应结果输入到缓冲区, 此时我们用直接用cin输入后就可以得到想要的答案;
这个题是一个二分题, 因为开头是0, 结尾是1, 所以我们先询问一个位置x, 如果为1; 则在1~x-1中一定有一个位置p使得sp=0, s(p+1)=1; 因为n是1e5级别的, 所以20次一定能找到最后答案;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5+10;
int n, m,idx;
signed main() {
    cin >> n;
    int l = 1, r = n;
    while (l < r) {
        int mid = l + r+1 >> 1;
        cout << "? " << mid << endl;
        int res;
        cin >> res;
        if (res == 1) r = mid-1;
        else l = mid;
    }
    cout << "! " << l << endl;
}




E - Nearest Black Vertex

题目大意

给定一个无向图, 有n个点和m条边; 现在我们需要对其中的点进行黑白两个颜色的染色; 规则如下: 一是至少有一个黑点; 二是题目会给出k组限制, 每组限制包括一个点a和一个距离b, 意为距离a最近的黑点与a之间的距离必须为b; 输出形式以01序列表示, 0表示白点, 1表示黑点;

解题思路

因为n只有2000, 所以可以考虑用bfs; 对于每次限制, 我们都可以用一次bfs, 将与点a距离小于b的点标记一下; 之后我们再对每次限制用bfs来找有没有距离等于b且未被标记的点, 如果有则该点满足条件可以被染为黑色, 否则就不存在合法的染色方式

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 2100;
int h[N], e[N], ne[N], d[N];
bool st[N];
int n, m, k, idx;
vector<PII> v;
map<int, int>mp;
void add(int a, int b) {
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void bfs_1(int a, int b) {
    memset(d, 0x3f, sizeof d);
    memset(st, false, sizeof st);
    queue<int> q;
    q.push(a);
    d[a] = 0;
    st[a] = true;
    if (d[a] < b) mp[a] = 1;
    while (q.size()) {
        int x = q.front();
        q.pop();
        for (int i = h[x]; i != -1; i = ne[i]) {
            int j = e[i];
            if (!st[j]) {
                d[j] = d[x] + 1;
                if (d[j] < b) mp[j] = 1;
                q.push(j);
                st[j] = true;
            }
        }
    }
}
bool bfs_2(int a, int b) {
    bool f = false;
    memset(d, 0x3f, sizeof d);
    memset(st, false, sizeof st);
    queue<int> q;
    q.push(a);
    st[a] = true;
    d[a] = 0;
    if (d[a] == b && (mp[a] == 0 || mp[a] == 2)) {
        f = true;
        mp[a] = 2;
    }
    while (q.size()) {
        int x = q.front();
        q.pop();
        for (int i = h[x]; i != -1; i = ne[i]) {
            int j = e[i];
            if (!st[j]) {
                d[j] = d[x] + 1;
                q.push(j);
                st[j] = true;
                if (d[j] == b && (mp[j] == 0 || mp[j] == 2)) {
                    f = true;
                    mp[j] = 2;
                }
            }
        }
    }
    if (f) return true;
    else return false;
}
signed main() {
    cin >> n >> m;
    memset(h, -1, sizeof h);
    for (int i = 1; i <= m; i++) {
        int a, b;
        cin >> a >> b;
        add(a, b), add(b, a);
    }
    cin >> k;
    bool f = true;
    for (int i = 1; i <= k; i++) {
        int a, b;
        cin >> a >> b;
        v.push_back({ a,b });
    }
    for (auto t : v) {
        bfs_1(t.first, t.second);
    }
    for (auto t : v) {
        if (!bfs_2(t.first, t.second)) {
            f = false;
            break;
        }
    }
    if (f) {
        cout << "Yes" << endl;
        if (mp.size() == 0) {
            for (int i = 1; i <= n; i++) {
                if (i == 1) cout << 1;
                else cout << 0;
            }
        }
        else {
            for (int i = 1; i <= n; i++) {
                if (mp[i] == 2) cout << 1;
                else cout << 0;
            }
        }
    }
    else cout << "No" << endl;
}




F - Square Subsequence

题目大意

待定.....

解题思路

待定....

神秘代码

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1e6+10;
int w[N],d[N];
int n,m,idx;
bool st[N];
vector<int> v[N];
int dijkstra(){
    memset(d,0x3f,sizeof d);
    priority_queue<PII,vector<PII>,greater<PII>> heap;
    heap.push({0,1});
    d[1]=0;
    while(heap.size()){
        auto t=heap.top();
        heap.pop();
        int x=t.second;
        if(st[x]) continue;
        st[x]=true;
        for(int p:v[x]){
            if(d[p]>d[x]+w[p]){
                d[p]=d[x]+w[p];
                heap.push({d[p],p});
            }
        }
    }
    if(d[m]==0x3f3f3f3f) return -1;
    else return d[m]-1;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int k;
        cin>>k;
        w[i+m] =1;
        for(int j=1;j<=k;j++){
            int x;
            cin>>x;
            v[x].push_back(i+m);
            v[i+m].push_back(x);
        }
    }
    cout<<dijkstra();
    return 0;
}

标签:AtCoder,abc,idx,int,long,st,maxn,299,true
From: https://www.cnblogs.com/mostimali/p/17499168.html

相关文章

  • AtCoder Regular Contest 154 C Roller
    洛谷传送门AtCoder传送门被这题干爆了考虑把环压缩成块。这样一次操作就是,选择两个相邻的块,把左边块长度减\(1\),右边块长度加\(1\)。特判\(a,b\)所有块长都是\(1\)的情况,这种情况不能操作。排除掉上面的情况,我们断言:有解的充要条件是,存在某一种\(a\)的顺序,使得\(b......
  • 【题解】AtCoder-ABC306G Return to 1
    这也太强了!容易想到的是用若干环拼出这个\(10^{10^{100}}\),也就是这些环的\(\gcd\mid10\)。之后就不会了。先正图反图两次DFS,只留下\(1\)所在强连通分量里的边,对正图跑DFS生成树,定义其深度从\(0\)开始,然后有一个结论是:对于任何正整数\(a\),图中存在一个包含\(1\)......
  • abc059d <博弈, 打表找规律>
    D-Alice&Brown如何打表要善于通过打表展示视觉信息,从而找到规律;#include<iostream>#include<algorithm>usingnamespacestd;typedeflonglongLL;intf[100][100];//0未定,1win,2lose//注意这里找先手必胜与必负的方式//当我的可以转移到任何一个必输态......
  • AtCoder Beginner Contest 229(F,G)
    AtCoderBeginnerContest229(F,G)F(二部图,dp)F这个题大致是给你\(n+1\)个点,为\(0\)到\(n\),然后\(n\)条边是点\(0\)到\(1...n\)这些点的\(n\)条边,后面还有\(n\)条边,连接点\(i\)和\(i+1\)(其中\(i\)为\(1\)到\(n\),其中\(n\)是和\(1\)连接的)前\(n\)条边的价值是\(a_i\),后......
  • abc058d <公式化简>
    D-###原计算公式为:\[\sum\limits_{1\lei<j\len}\sum\limits_{1\lek<l\lem}(x_j-x_i)(y_l-y_k)\]可将xy拆分:\[\left(\sum\limits_{1\leqi<j\leqn}(x_j-x_i)\right)\left(\sum\limits_{1\leqk<l\leqm}(y_l-y_k)\right)\]仅计算x侧可进一步化简......
  • AT_abc118_d题解
    ATLuogu题目描述有\(n\)根火柴\(m\)种数字,数字\(1,2,3,4,5,6,7,8,9\)分别需要\(2,5,5,4,5,6,3,7,6\)根火柴,要求\(n\)根火柴全部都用完且拼成的数字最大,输出这个数字。输入格式第一行两个整数\(n\),\(m\);第二行\(m\)个整数,分别为\(a_1,a_2,...,a_m\)(即\(m\)种......
  • P4414 [COCI2006-2007#2] ABC
    [COCI2006-2007#2]ABC题面翻译【题目描述】三个整数分别为$A,B,C$。这三个数字不会按照这样的顺序给你,但它们始终满足条件:$A<B<C$。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。【输入格式】第一行包含三个正整数$A,B,C$,不一定是按这个顺序。这......
  • AtCoder Beginner Contest(abc) 306
    A-Echo题目大意把一个字符串的每个字符输出两遍解题思路签到题不多嗦了;神秘代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;typedefpair<int,int>PII;constintN=1e6+10;intn,m;signedmain(){cin>>n;string......
  • AtCoder Regular Contest 162 F Montage
    洛谷传送门AtCoder传送门题目限制可以被改写成,如果\(A_{a,b}=A_{c,d}=1\),那么\(A_{a,d}=A_{c,b}=1\)。考虑删去空白的行和列,那么对于每个\(A_{a,b}=A_{c,d}=1\),矩形\((a,b),(c,d)\)中一定都是\(1\)。发现每一行只可能存在一个极长\(1\)区间。并......
  • abc055d <枚举>
    https://atcoder.jp/contests/abc055/tasks/arc069_b使用二进制枚举会更加简洁,要有从进制角度思考问题的习惯//https://atcoder.jp/contests/abc055/tasks/arc069_b//枚举,尝试前两个动物的4种组合,通过前两个动物的假设推出剩下的动物,而后检查是否存在冲突#include<......