首页 > 其他分享 >CF1203(Div. 3) 题解(C to F1)

CF1203(Div. 3) 题解(C to F1)

时间:2023-10-04 16:11:44浏览次数:41  
标签:cout int 题解 ++ cin vis CF1203 tie Div

由于太懒了,所以不想(会)写 \(\texttt{A B}\) 和 \(\texttt{F2}\)。

C Common Divisors 题解

题目大意

给定一个长度为 \(n\) 的数列 \(\{a_i\}\),求 \(\sigma(\gcd\limits_{i\in[1,n]}\{a_i\})\)。

解题思路

先算出所有元素的最大公因数,如果最大公因数 \(g\) 为 \(1\),即所有元素两两互质,则直接输出 \(1\);否则输出 \(g\) 的因数个数。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e5 + 5;
int n;
ll a[N], g, ans;
inline ll gcd(ll a, ll b) {
  if(a % b == 0) {
    return b;
  }
  return gcd(b, a % b);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n;
  for(int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  g = a[1];
  for(int i = 2; i <= n; i++) {
    g = gcd(g, a[i]);
  }
  if(g == 1) {
    cout << 1;
    return 0;
  }
  for(ll i = 1; i * i <= g; i++) {
    if(g % i == 0) {
      if(i * i == g) {
        ans++;
      } else {
        ans += 2;
      }
    }
  }
  cout << ans;
  return 0;
}

D1 & D2 Remove the Substring

题目大意

给定一个字符串 \(s\) 和一个它的子序列 \(t\),要求删除 \(s\) 的一个子串(连续的一段字符串),使得 \(t\) 仍然是它的子序列,求最多删除多长的子串。

解题思路

先找到 \(s\) 中最靠后的子序列 \(t\),得到这个子序列每个字符在 \(s\) 中的位置 \(p_i\),我们可以删除 \(p_0\) 前面的所有字符,将 \(p_0\) 这个字符换成最靠前的字符,删除 \(p_1\) 和 \(p_0\) 中间的字符,再将 \(p_1\) 这个字符换成最靠前的字符,删除 \(p_2\) 和 \(p_1\) 中间的字符,可以用 upper_bound 来解决。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
string s, t;
int pos, ans;
int p[N];
vector<int> a[30];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> s >> t;
  int n = s.size(), m = t.size();
  for(int i = 0; i < n; i++) {
    int k = s[i] - 'a';
    a[k].push_back(i);
  }
  for(int i = 0; i <= 25; i++) {
    sort(a[i].begin(), a[i].end());
  }
  pos = m - 1;
  for(int i = n - 1; i >= 0; i--) {
    if(s[i] == t[pos]) {
      p[pos] = i;
      pos--;
      if(pos <= -1) {
        break;
      }
    }
  }
  ans = p[0];
  p[m] = n;
  for(int i = 0; i < m; i++) {
    int k = t[i] - 'a', pos;
    if(i == 0) {
      pos = upper_bound(a[k].begin(), a[k].end(), -1) - a[k].begin();
    } else {
      pos = upper_bound(a[k].begin(), a[k].end(), p[i - 1]) - a[k].begin();
    }
    p[i] = a[k][pos];
    ans = max(ans, p[i + 1] - p[i] - 1);
  }
  cout << ans;
  return 0;
}

E Boxers 题解

题目大意

给定一个长度为 \(n\) 的数列 \(\{a_i\}\),对于每个 \(a_i\) 可以使得 \(a_i\gets a_i\pm1\)。
选出个数最多的方案,使得 \(a_i\neq a_j\ (i\neq j)\)。

解题思路

先将 \(\{a_i\}\) 从小到大排序,每个 \(a_i\) 在操作后要尽量的小,可以理解为越小它后面的元素能改变的方案越多,操作完之后如果其值没标记过,则标记它并且个数加 \(1\)。
注意当 \(a_i=1\) 时不能 \(a_i\gets a_i-1\)。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, ans, a[N];
bool vis[N];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n;
  for(int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  sort(a + 1, a + n + 1);
  for(int i = 1; i <= n; i++) {
    if(a[i] - 1 >= 1 && !vis[a[i] - 1]) {
      vis[a[i] - 1] = 1;
      ans++;
    } else if(!vis[a[i]]) {
      vis[a[i]] = 1;
      ans++;
    } else if(!vis[a[i] + 1]) {
      vis[a[i] + 1] = 1;
      ans++;
    }
  }
  cout << ans;
  return 0;
}

F1 Complete the Projects 题解

题目大意

有 \(n\) 个项目,做第 \(i\) 个项目需要能力值至少为 \(a_i\),做完后能力值会增加 \(b_i\)(可能为负),给定初始能力值,求是否能够做完所有的项目。

解题思路

先将所有项目按 a[i].x 从小到大排序,然后将所有 a[i].y \(\ge 0\) 的项目做完。得到新的 \(r\) 值。然后将所有 a[i].y 为负值的项目提取出来放到一个新的数组中,专门处理,假设有 \(m\) 个这样的项目用 \(b_m\) 保存,我们每次检查是否有项目可以最后完成即可。如果有第 \(i\) 个项目可以最后完成,就相当于我们的 \(r\) 值减去其它 \(m-1\) 个项目的 \(y\) 值后,依然有 \(r\ge\)a[i].x 且 \(r\ge\)abs(a[i].y)。这样确定了最后完成的项目后,我们再找是否有项目可以倒数第 \(2\) 完成即可,以此类推。最后如果完成的项目数 \(\text{sum}=n\) 说明我们完成了所有项目。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, r, sum, sub;
int vis[N];
struct node {
  int x, y;
}a[N], b[N];
inline bool cmp(node x, node y) {
  return x.x < y.x;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n >> r;
  for(int i = 1; i <= n; i++) {
    cin >> a[i].x >> a[i].y;
  }
  sort(a + 1, a + n + 1, cmp);
  for(int i = 1; i <= n; i++) {
    if(a[i].x <= r && a[i].y >= 0) {
      r += a[i].y;
      sum++;
    }
    if(a[i].y < 0) {
      b[++m] = a[i];
    }
  }
  bool flag = 0;
  while(1) {
    flag = 0;
    for(int i = 1; i <= m; i++) {
      if(vis[i]) {
        continue;
      }
      sub = 0;
      for(int j = 1; j <= m; j++) {
        if(i == j) {
          continue;
        }
        if(!vis[j]) {
          sub += abs(b[j].y);
        }
      }
      if(r - sub >= b[i].x && r - sub >= abs(b[i].y)) {
        vis[i] = 1;
        sum++;
        flag = 1;
      }
    }
    if(!flag) {
      break;
    }
  }
  if(sum == n) {
    cout << "YES";
  } else {
    cout << "NO";
  }
  return 0;
}

标签:cout,int,题解,++,cin,vis,CF1203,tie,Div
From: https://www.cnblogs.com/cyf1208/p/17742387.html

相关文章

  • CF1873(Div. 4) 题解 (A to E)
    AShortSort题解题目大意给定一个长度为\(3\)、由\(a,b,c\)组成的字符串,问可以不变或交换两个字符是的变为\(\texttt{abc}\)。解题思路由于大小固定,所以预处理可行的字符串(仅包含\(\texttt{abcacbbaccba}\))即可。代码#include<bits/stdc++.h>usingnamespacest......
  • 题解 CF1034C【Region Separation】/ SS221116D【Xiong AK 10 IOI】
    很妙的性质题!全是意识流证明见过吗?problem每次选一个非空边集删掉,谓之曰砍树。砍树后需要满足每个连通块的点权和相同。在一个方案中可以砍很多次树,都要满足砍树后的要求。一共有多少种合法方案呢?\(n\leq10^6,1\leqa_i\leq10^9\)。solution假如我们将树砍成\(k\)个连通......
  • 传奇团子师傅题解
    传奇团子师傅题解(模拟退火)申明:本篇题解借鉴了:https://www.luogu.com.cn/blog/SDNetFriend/solution-p7218这篇博客(主要在bitset部分)。题意:给你个矩阵,包含三种颜色,一个美丽串要求你横着或者竖着或者斜着串成一串的三个颜色有特定的顺序,求拿取最多美丽串的方案是什么。题目分......
  • 【UVA 442】Matrix Chain Multiplication 题解(栈)
    假设您必须计算一个表达式,如ABCDE,其中A、B、C、D和E是矩阵。由于矩阵乘法是关联的,所以执行乘法的顺序是任意的。然而,所需的初等乘法的数量很大程度上取决于求值顺序您可以选择。例如,设A为5010矩阵,B为1020矩阵,C为205矩阵。有两个计算ABC的不同策略,即(AB)C和A(B*C)。第一个需要1500......
  • Hadoop问题解决记(2)
     1.发现问题在对HBase集群进行压力测试过程中发现,当实际写入HBase和从HBase查询的量是平时的若干倍时(集群规模10~20台,每秒读写数据量在几十万条记录的量级),导致集群的读写出现一定程度的波动。具体如下:1)写端抛出以下异常信息:org.apache.hadoop.hbase.client.RetriesExha......
  • Codeforces Round 888 (Div. 3)DEF
    CodeforcesRound888(Div.3)DEFD.PrefixPermutationSums题意:给你一个长度为\(n-1\)的数组,是否能找出一个长度为\(n\)的排列,求出这个排列的前缀和,去掉前缀和数组的任意一个元素之后和原来的数组相等。例如\([6,8,12,15]\),可以是排列\([1,5,2,4,3]\)的前缀......
  • Hadoop问题解决记(1)
    最近在测试HBase时遇到一个非常奇怪的问题:集群有7台机器,其中1台Master,6台RegionServer。但是Master只能控制其中1台RegionServer,而无法控制其他5台RegionServer。打开master的日志文件,发现以下错误信息:2011-04-2216:37:21,242WARNorg.apache.hadoop.hbase.master.Assignment......
  • Educational Codeforces Round 155 (Rated for Div. 2)
    \(A.Rigged!\)直接取第一个人能举起的最大重量看他是否是冠军即可。voidsolve(){intn=read();intfx=read(),ft=read();intans=fx;for(inti=1;i<n;i++){intx=read(),t=read();if(x>=fx&&t>=ft)ans=-1;}cout<<ans<......
  • 『题解』P9688
    题目传送门思路:设有两个颜色\(x_1x_2\),两端分别为\(l_1\)\(r_1\),\(l_2\)\(r_2\)。通过观察可以发现,若满足\(x_1<x_2\)且\(r_1>l_2\)则\(x_1x_2\)一定是单调不下降的。那么我们可以先预处理出一个颜色可以与前面的哪些颜色构成单调不下降,然后用dp求出最终答案......
  • Codeforces Round 898 (Div. 4) A~H
    CodeforcesRound898(Div.4)A~HA.ShortSort题意:输出不一样的字符的个数思路:模拟即可//AConemoretimes//nndbk#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintmod=1e9+7;constintN=2e5+10;intmain(){ios::s......