atcoder abc 355

A who ate the cake

代码:

#include <iostream>

using namespace std;

bool st[4];

int main() {
  int a, b;
  cin >> a >> b;
  st[a] = st[b] = true;
  if(a == b) cout << "-1";
  else {
    for(int i = 1; i <= 3; i ++ ) {
      if(!st[i]) cout << i;
    }
  }
  return 0;
}

B piano 2

代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 2e5 + 10;

bool st[N];

int main() {
  int n, m;
  cin >> n >> m;
  vector<int> a(n + m);
  for(int i = 0; i < n + m; i ++ ) {
    cin >> a[i];
    if(i < n)
      st[a[i]] = true;
  }
  
  sort(a.begin(), a.end());
  a.erase(unique(a.begin(), a.end()), a.end());
  for(int i = 1; i < a.size(); i ++ ) {
    if(st[a[i - 1]] && st[a[i]]) {
      cout << "Yes";
      return 0;
    }
  }
  cout << "No";
  return 0;
} 

C bingo 2

问题:

思路:模拟
代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
  int x, m;
  cin >> x >> m;
  vector<int> row(x + 1);
  vector<int> col(x + 1);
  vector<int> dia1, dia2;
  
  for(int i = 1; i <= m; i ++ ) {
    int n;
    cin >> n;
    n --;
    row[n / x] ++;
    if(row[n / x] == x) {
      cout << i;
      return 0;
    }
    
    col[n % x] ++;
    if(col[n % x] == x) {
      cout << i;
      return 0;
    }
    
    if(n % x == n / x)
      dia1.push_back(x);
    if(dia1.size() == x) {
      cout << i;
      return 0;
    }
    
    if(n % x + n / x == x - 1)
      dia2.push_back(x);
    if(dia2.size() == x) {
      cout << i;
      return 0;
    }
  }
  cout << "-1" << endl;
  return 0;
}

D intersecting intervals

问题:

思路:排序+二分

代码:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 5e5 + 10;

pair<int, int> interval[N];
int n;

int main() {
  cin >> n;
  for(int i = 1; i <= n; i ++ ) {
    int x, y;
    cin >> x >> y;
    interval[i] = {x, y};
  }
  
  sort(interval + 1, interval + n + 1);
  long long ans = 0;
  for(int i = 1; i <= n - 1; i ++ ) {
    int x = interval[i].second;
    int l = i + 1, r = n;
    while(l < r) {
      int mid = l + r + 1 >> 1;
      if(interval[mid].first <= x) l = mid;
      else r = mid - 1;
    }
    //if(i == 1) cout << l;
    if(x >= interval[l].first) {
        ans += l - i;
    }
  }
  cout << ans;
  return 0;
}

E guess the sum

问题:

思路:bfs最短路

代码:

#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;

const int N = (1 << 18) + 10;

int way[N];
int n, l, r;

int qmi(int a) {
  int res = 1;
  int b = 2;
  while(a) {
    if(a & 1) {
      res *= b;
    }
    a >>= 1;
    b *= b;
  }
  return res;
}

void bfs(int u) {
  way[u] = u;
  queue<int> q;
  q.push(u);
  while(q.size()) {
    auto t = q.front();
    q.pop();
    for(int i = 0; i <= 18; i ++ ) {
      int x = qmi(i);
      for(auto y: {t - x, t + x}) {
        if(y < 0 || y > (1 << n)) continue;
        if(way[y] == -1) {
          way[y] = t;
          q.push(y);
        }
      }
      if(t != 0 && t & x) break;
    }
  }
}

void solve() {
  memset(way, -1, sizeof way);
  cin >> n >> l >> r;
  r ++;
  bfs(l);
  
  int ans = 0;
  for(int i = r; i != l; i = way[i]) {
    int ll = way[i], rr = i;
    int t = 1;
    if(ll > rr) {
      t *= -1;
      swap(ll, rr);
    }
    cout << "? " << __lg(rr - ll) << " " << ll / (rr - ll) << endl;
    int res;
    cin >> res;
    ans = (ans + t * res + 100) % 100;
  }
  cout << "! " << ans << endl;
}

int main() {
  int t;
  t = 1;
  while(t -- ) {
    solve();
  }
  return 0;
};

F mst

问题:

思路:由于边权很小,因此可以枚举边权,用并查集维护边集,并查集[i]表示的是所有权重小于i的集合。再加边操作时,从小到大枚举权重,如果某时刻出现自环,则说明该自环出现时刻对应的边要被插入的这条边替代,以后的集合也是如此

代码:

#include <iostream>

using namespace std;

const int N = 2e5 + 10;

int p[N][12], _size[N][12], sum[N];

int find(int x, int w) {
    if(p[x][w] != x)
        p[x][w] = find(p[x][w], w);
    return p[x][w];
}

void solve() {
    int n, m, ans = 0;
    cin >> n >> m;
    for(int i = 1; i <= n; i ++ ) {
        for(int j = 1; j <= 10; j ++ ) {
            p[i][j] = i;
            _size[i][j] = 1;
        }
    }
    
    for(int i = 1; i <= n - 1; i ++ ) {
        int a, b, c;
        cin >> a >> b >> c;
        ans += c;
        for(int j = c; j <= 10; j ++ ) {
            int pa = find(a, j);
            int pb = find(b, j);
            p[pa][j] = pb;
            _size[pb][j] += _size[pa][j];
            sum[j] += c;
        }
    }
    
    //for(int i = 1; i <= 10; i ++ ) cout << sum[i] << " ";
    for(int j = 1; j <= m; j ++ ) {
        int a, b, c;
        cin >> a >> b >> c;
        int pre = 1;
        bool flag = false;
        for(int i = c; i <= 10; i ++ ) {
            int pa = find(a, i);
            int pb = find(b, i);
            if(!flag) pre = i;
            if(pa == pb) {
                flag = true;
                sum[i] = sum[i] - pre + c;
            } else {
                p[pa][i] = pb;
                _size[pb][i] += _size[pa][i];
                sum[i] += c;
            }
            if(_size[pb][i] == n) ans = min(ans, sum[i]);
        }
        //for(int i = 1; i <= 10; i ++ ) cout << sum[i] << " ";
        cout << ans << endl;
    }
}

int main() {
    int t;
    t = 1;
    while(t -- ) {
        solve();
    }
    return 0;
}

G待补

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: atcoder beginner contest 235 是一场由 AtCoder 组织的初学者比赛,旨在为初学者提供一个锻炼自己编程能力的平台。比赛通常包括多个问题,参赛者需要在规定时间内解决这些问题。比赛难度逐渐增加,从而帮助参赛者提高自己的编程技能。 ### 回答2: ATCoder Beginner Contest 235(简称ABC 235)是一项由ATCoder举办的编程竞赛。该比赛旨在为初学者提供一个机会展示他们的编程技巧和解决问题的能力。 ABC 235通常由4个问题组成,题目难度递增。参赛者需要在规定的时间内使用编程语言解决这些问题。这些问题通常涵盖了各种编程相关的主题,例如数学问题、字符串处理、排序和搜索算法等。 在比赛开始前,参赛者将获得一份题目说明文档和输入样例。他们需要根据题目要求编写程序,处理给定的输入数据,并生成相应的输出。比赛时间一般为2-3小时,参赛者需要尽可能快速且准确地解决问题。 评判将根据参赛者的程序输出与预期结果的一致性进行。参赛者可以在比赛过程中提交多次解答,但只有第一次正确答案会被记入最终的成绩。 ABC 235不仅提供了一个竞赛平台,还鼓励参赛者通过讨论和分享解题思路来学习和提高。在比赛结束后,ATCoder将提供详细的解题分析和解题报告,帮助参赛者了解每个题目的最佳解决方法,并提供参考答案和示例代码。 通过参加ATCoder Beginner Contest 235,参赛者可以提升他们的编程技能,锻炼逻辑思维能力,并与全球的编程爱好者交流。无论是初学者还是有经验的编程者,ABC 235都是一个很好的学习和挑战的机会。 ### 回答3: AtCoder Beginner Contest 235 是一个在 AtCoder 上的初级比赛。该比赛通常会吸引很多新手程序员参加。它由 AtCoder 组织主办,旨在帮助新手提高编程技能以及在竞赛中锻炼自己。 比赛的题目难度由易到难,共有四个问题。通常,第一个问题是一个简单的数学问题,要求解决一个简单的算术运算。第二个问题可能是一个字符串操作问题,需要对给定的字符串进行处理。第三个问题可能是一个动态规划或贪心算法问题,需要细心分析问题,找出最优解。最后一个问题通常是一个较难的图论或组合问题,需要一些高级算法来解决。 参赛选手在比赛开始后有一定的时间限制来解决这些问题。他们可以使用自己熟悉的编程语言来实现解决方案。然后他们将自己的程序提交到 AtCoder 的在线评测系统中进行评测。评测结果会即时显示,并将参赛选手的成绩排名和讨论解答过程的视频分享给其他选手。 参加 AtCoder Beginner Contest 235 对于新手来说是一个很好的机会。通过解决这些问题,他们可以练习编程技巧,提高解决问题的能力。比赛结束后,他们还可以看到其他选手的解答,学习他们的思路和方法。同时,比赛的排名和奖励也是一种鼓励和激励新手继续努力学习的方式。 总之,AtCoder Beginner Contest 235 是一个对于新手非常友好的比赛,它提供了一个锻炼和展示编程技能的平台。无论是对于新手还是更有经验的选手,参加这样的比赛都是一个宝贵的机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值