首页 > 其他分享 >Educational Codeforces Round 149 (Rated for Div. 2) / 1837

Educational Codeforces Round 149 (Rated for Div. 2) / 1837

时间:2025-01-16 22:38:08浏览次数:1  
标签:Educational Rated 1837 int sum mid i64 个人感觉 ans

A. Grasshopper on a Line

难度(个人感觉)☆☆☆☆☆

Code

if(L % k == 0){
  ans.push_back(1);
  ans.push_back(L - 1);
} else{
  ans.push_back(L);
}

B. Comparison String

难度(个人感觉)★☆☆☆☆

思考:

注意到最长链(指一些连续的位置,它们是单调的)是答案的下界,而实际上这是下确界。

做法:

设最长链长度为k,可以把所有 >< 中间的位置赋值为 \(1\),把 <> 中间的位置赋值为 \(k\) 。其它位置的赋值是容易的。

Code:

ans = 0;
for(int i = 0, l = 0; i < N; i++){
  if(i == N - 1 || i < N && s[i] != s[i + 1]){
    if(i + 1 - l + 1 > ans) ans = i + 1 - l + 1;
    l = i + 1;
  }
}

C. Best Binary String

难度(个人感觉)★☆☆☆☆

思考:

我们设定一个指标来衡量当前的局势,容易发现 01 交错的数量是可以作为这个指标的。

做法:

设 01 交错的数量是 \(h(Array)\) 。当 \(h(Array) == 1\),说明是单调的。但是可能只有一种数;可能是单调不增。解决这些问题的方法是再序列开头添加一个 \(0\) ,在序列末尾添加一个 \(1\) 。

那么答案的下界是 \(h(Array) - 1) / 2\) ,因为每次 \(h\) 最多减少 \(2\) 。这当然也是下确界,因为总可以减 \(2\)。

所以我们的目标是让 \(01\) 交错尽量少,问号取前一个元素的值即可。

Code:

void input(){
  s = '0' + s + '1';
}
 
for(int i = 1; i < N - 1; i++){
  if(s[i] == '?'){
    s[i] = s[i - 1];
  }
  ans.push_back(s[i]);
}

D. Bracket Coloring

难度(个人感觉)★☆☆☆☆

思考:

唯一一颗星是因为需要知道,合法括号序列等价于合法的栈操作。
接下来,画出一个函数图象,表示前缀的 \(i\) 个数里,左括号减右括号的数量。

做法:

那么合法当所有点在 \(y = 0\) 及上方;另一种 beautiful 当所有点在 \(y = 0\) 及下方
如果最终不为 \(0\) ,那么不合法;否则把上方的东西放在一起,下方的东西放在一起即可。

Code:

int k = 0;
for(int i = 0; i < N; i++){ k += s[i] == '(' ? 1 : -1; }
if(k != 0){
  ok = 0;
  return;
} else{
  ok = 1;
}

std::vector<int> c0, c1;
k = 0;
int l = 0;
for(int i = 0; i < N; i++){
  k += s[i] == '(' ? 1 : -1;
  if(k == 0){
    if(s[i] == ')'){
      for(int j = l; j <= i; j++){
        c0.push_back(j);
      } 
    } else{
      for(int j = l; j <= i; j++){
        c1.push_back(j);
      }
    }
    l = i + 1;
  }
}

C = 0;
if(!c0.empty()){
  for(int p : c0){
    ans[p] = C;
  }
  C++;
}
if(!c1.empty()){
  for(int p : c1){
    ans[p] = C;
  }
  C++;
}

E. Playoff Fixing

难度(个人感觉)★★☆☆☆
很不错的 dp 练习题

思考:

考虑分治。对于一个区间 \([l, r]\),算出 \([l, mid]\) 和 \([mid, r]\) 后合并即可。

做法:

对于一个高度为 k (即管 pow(2, k) 个位置)的区间,一定有一个数是最大的。我们不管最大的数具体是多少,只关心它是不是确定的。然后 \(dp\) 即可。

Code:

void input(){
  if(a[i] > 0){ a[i]--; }
}
pii work(int deep = 0, int l = 0, int r = N){//分别是数值,方案书。数值为 -1 表示不是确定的,数值为 -2 表示无解。
  if(deep == k) return {a[l], 1};
  int mid = (l + r) / 2;
  pii p0 = work(deep + 1, l, mid), p1 = work(deep + 1, mid, r);
  int x0 = p0.first, w0 = p0.second, x1 = p1.first, w1 = p1.second;
  if(!(x0 < x1)){ std::swap(x0, x1); std::swap(w0, w1); }
  if(x0 == -1 && x1 == -1){
    return {-1, 2ll * w0 * w1 % mod};
  } else if(x0 == -1){  
    if(x1 < (1 << deep)){
      return {x1, 1ll * w0 * w1 % mod};
    } else{
      return {-1, 1ll * w0 * w1 % mod};
    }
  } else{
    if(x0 < (1 << deep) && x1 < (1 << deep)){
      return {-2, 0};
    } else if(x0 < (1 << deep)){
      return {x0, 1ll * w0 * w1 % mod};
    } else{
      return {-2, 0};
    }
  }
}

F. Editorial for Two

2log 难度(个人感觉)★★☆☆☆
1log 难度(个人感觉)★★★☆☆

思考:

给出分界点,那么 选左边最小的 \(x\) 个,右边最小的 \(k-x\) 个。

做法:

2log:

由于 \(x\) 难以确定,我们二分答案,看左右的和是否达到 \(k\)。
具体判定是容易的,先用堆进行预处理,然后每个位置依次判断

code:
int pre[MAXN + 1], suf[MAXN + 1];
void get_pre(i64 k){
  std::priority_queue<int> Q;
  i64 sum = 0;
  for(int i = 0; i <= N; i++){
    pre[i] = Q.size();
    if(i != N){
      sum += a[i]; Q.push(a[i]);
      while(sum > k) { sum -= Q.top(); Q.pop(); };
    }
  }    
}
void get_suf(i64 k){
  std::priority_queue<int> Q;
  i64 sum = 0;
  for(int i = N; i >= 0; i--){
    if(i != N){
      sum += a[i]; Q.push(a[i]);
      while(sum > k) { sum -= Q.top(); Q.pop(); };
    }
    suf[i] = Q.size();
  }    
}
bool check(i64 k){
  get_pre(k);
  get_suf(k);
  for(int i = 0; i <= N; i++){
    if(pre[i] + suf[i] >= need) return 1;
  }
  return 0;
}
int get(){
  i64 L = -1, R = 3e14;
  while(L + 1 < R){
    i64 mid = (L + R) / 2;
    if(check(mid)){ R = mid; }
    else { L = mid; }
  }
  ans = R;
}
1log:

由于 \(x\) 是不减的,因此判段 \(x\) 是否要增加即可。

cf 上最快的解法

https://codeforces.com/contest/1837/submission/207295831

有空补下(

标签:Educational,Rated,1837,int,sum,mid,i64,个人感觉,ans
From: https://www.cnblogs.com/chen-nie/p/18675779

相关文章

  • Educational Codeforces Round 146 (Rated for Div. 2) / 1814
    A.Coins难度(个人感觉)☆☆☆☆☆思考:关键是2可以凑出任意偶数Code:if(n%2==0){ok=1;}else{if(k%2==0){ok=0;}else{ok=n>=k;}}B.LongLegs难度(个人感觉)★☆☆☆☆思考:当最终\(m=1e5\),答案不超过\(3e5\),因此最优的情况......
  • VP Educational Codeforces Round 159 (Rated for Div. 2)
    A.BinaryImbalance题意:给你一个01串,每次选一个01或者一个10在他们中间插一个0进去,问能不能让0的个数大于1。我们进行一次插入操作后,显然还可以继续操作,所以只要有0和1就一定可以。注意特判全0的情况。点击查看代码voidsolve(){ intn; std::cin>>n; std::s......
  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!) B. Friendly Arrays
    Codeforces题解-[B.FriendlyArrays]题目链接题目描述Youaregiventwoarraysofintegers—\(a_1,\ldots,a_n\)oflength\(n\),and\(b_1,\ldots,b_m\)oflength\(m\).Youcanchooseanyelement\(b_j\)fromarray\(b\)(\(1\leqj\leqm......
  • Educational Codeforces Round 166
    Dashboard-EducationalCodeforcesRound166Problem-A-Codeforces签到(写的有点烦...)#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;voidsolve(){ intn;cin>>n; strings;cin>>s; vector<int>a;vector<char>b;......
  • Educational Codeforces Round 165
    EducationalCodeforcesRound165Problem-A-Codeforces答案只会是2或3,分类一下就好了#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;intn;inta[N];voidsolve(){ cin>>n; for(inti=1;i<=n;i++) { scanf("%d",&a[i]......
  • Chain-of-Exemplar: Enhancing Distractor Generation for Multimodal Educational Qu
    题目样本链:增强干扰项生成以实现多模式教育问题生成论文地址:https://aclanthology.org/2024.acl-long.432/项目地址:https://github.com/Luohh5/Chain-of-Exemplar摘要    多项选择题(MCQ)对于加强概念学习和学生参与度以实现教育目的非常重要。尽管教育内容具......
  • Educational Codeforces Round 172 (Rated for Div. 2)(C-D)
    题目链接:Dashboard-EducationalCodeforcesRound172(RatedforDiv.2)-CodeforcesC.CompetitiveFishingtag:后缀和+思维Description:有一个序列含\(n\)个数(每个数是\(0\)或\(-1\)),将其分为\(m\)个区间,从前往后每个区间中第\(i\)个区间的权值为\((i-1)\),求序列权值和......
  • Educational Codeforces Round 173 B.Digits
    Codeforces题解-[EducationalCodeforcesRound173B.Digits]题目链接题目大意n!个d组成的形如dd'''d(n!个)求能被1-9中哪些奇数整除每个用例按升序输出输入3267185输出13137913579解题思路解法1  这个数可以看作C=d*1111'''1(n......
  • Educational Codeforces Round 173 (Rated for Div. 2) E
    CF2043E题意给定两个\(n\timesm\)的矩阵\(A\)和\(B\)(其中的整数介于\(0\)和\(10^9\)之间),可以对\(A\)矩阵进行如下操作,问是否能变换为矩阵\(B\)。\(\&=\):选择两个整数\(i\)和\(x\(1\leqi\leqn,x\geq0)\),并将第\(i\)行中的每个元素替换为\(x\)与该......
  • CompilerGenerated与GeneratedCode区别
    前言最近在捣鼓代码生成器,基于Roslyn,我们可以让生成器项目生成我们的目标C#代码,这个也是MVVMToolkit的实现方式,在查看生成代码的过程中,我们经常会遇到一些特殊的特性,如GeneratedCodeAttribute,刚好我还遇到过CompilerGeneratedAttribute。感觉两个特性差不多,都可以用于标识......