Educational Codeforces Round 160 (Rated for Div. 2)

A. Rating Increase

纯暴力,分割字符串,如果n1<n2就输出,如果遍历完整个数组都不存在n1<n2就输出-1.

const int N = 2e5 + 10;

int toint(string s)
{
stringstream ss;
ss << s;
int v;
ss >> v;
return v;
} void solve()
{
string s;
cin >> s;
for (int i = 0; i < s.size(); i++)
{
if ((i<s.size()-1 && s[i+1] != '0') || i==s.size()-1)
{
int n1 = toint(s.substr(0, i+1));
int n2 = toint(s.substr(i + 1));
if (n1 < n2)
{
cout << n1 << " " << n2 << endl;
return;
}
}
}
cout << "-1" << endl;
}

B. Swap and Delete

贪心题目,可以先遍历整个字符串,统计0和1的个数,然后再次遍历整个字符串,碰到1就用0填,0就用1填,直到0和1中有一个消耗完,则说明此后所有的字符都应该删掉,答案即为n-i

const int N = 2e5 + 10;

void solve()
{
string s;
cin >> s;
int n1 = 0, n2 = 0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0') n1++;
else n2++;
}
for(int i=0;i<s.size();i++)
{
if(s[i]=='1') n1--;
else n2--;
if(n1 <0 || n2<0)
{
cout << s.size() - i<<endl;
return;
}
}
cout << 0 << endl;
}

C. Game with Multiset

首先用一个数组存入所有的2的i次方的个数,例如w[2]表示2的2次方的个数,然后每次要验证一个数是否可以由现有的数构成时,先拷贝一份w,然后从低位向高位二进制枚举要合成的数a的每一位(因为低位可以合成高位,但是高位无法分解成低位),如果a的i位为1且w[i]>=1,则将w[i]--(用于合成),并且将w[i]除以二加到他的高一位上去,若w[i]==0,则说明无法合成,输出-1,如果遍历完w数组,则说明可以合成,返回true

int w[32];

void solve()
{
int op,a;
cin >> op >> a;
if(op==1)
{
w[a]++;
}
else
{
int bak[32];
memcpy(bak,w,sizeof w);
for(int i=0;i<31;i++)
{
if(a&1)
{
if(bak[i])
{
bak[i]--;
}
else
{
puts("NO");
return;
}
}
a >>= 1;
if(i<30)
bak[i+1] += bak[i]/2;
}
puts("YES");
}
}

D. Array Collapse

dp,题解看注释

#define int long long
const int N = 3e5 + 10, MOD = 998244353;
//dp(i,0/1)表示是否选择第i个数,last_min(i)表示1~i-1中最接近nums[i]的小于nums[i]的数的下标,sum[i]表示前i个数中可达数组的sum
int dp[N][2], last_min[N], sum[N];
int nums[N];
int n; void solve()
{
cin >> n;
for (int i = 1; i <= n; i++) //初始化
{
cin >> nums[i];
last_min[i] = 0;
sum[i] = 0;
dp[i][0] = dp[i][1] = 0;
}
stack<int> stk; //单调栈,用于处理last_min
for (int i = 1; i <= n; i++)
{
while (stk.size() && nums[stk.top()] > nums[i]) //如果栈顶大于nums[i]则全部pop
stk.pop();
if (stk.size()) //如果栈顶存在小于nums[i]的数,那么他一定是最接近nums[i]的数
last_min[i] = stk.top();
stk.push(i); //入栈
}
dp[0][0] = 1;
sum[0] = 1;
for (int i = 1; i <= n; i++)
{
if (last_min[i]) //如果存在比nums[i]小的数
{
//如果要选nums[i],那么应该减去包含last_min[i]的部分(因为如果存在last_min[i],肯定不存在nums[i],
//因为last_min[i]一定比nums[i]小,这会导致nums[i]一定会被删掉)
//同时如果不包含last_min[i]了,还应该加上不选last_min[i]的数量,也就是dp[last_min[i]][0]
dp[i][1] = (sum[i - 1] - sum[last_min[i] - 1] + dp[last_min[i]][0] + MOD) % MOD;
//如果不选nums[i],则说明肯定选了last_min[i]或者更小的部分,因此直接加上last_min的全部情况即可
dp[i][0] = (dp[last_min[i]][1] + dp[last_min[i]][0]) % MOD;
}
else //如果不存在比nums[i]小的数,则说明nums[i]一定可以选上,而且相当于方案数就是sum[i-1]
{
dp[i][1] = sum[i - 1];
}
//累加方案总数
sum[i] = (sum[i - 1] + dp[i][1]) % MOD;
}
cout << (dp[n][0] + dp[n][1]) % MOD << endl;
}

Educational Codeforces Round 160 (Rated for Div. 2) 题解A~D的更多相关文章

  1. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  2. Educational Codeforces Round 65 (Rated for Div. 2)题解

    Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...

  3. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  4. Educational Codeforces Round 60 (Rated for Div. 2) 题解

    Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...

  5. Educational Codeforces Round 58 (Rated for Div. 2) 题解

    Educational Codeforces Round 58 (Rated for Div. 2)  题目总链接:https://codeforces.com/contest/1101 A. Min ...

  6. Educational Codeforces Round 47 (Rated for Div. 2) 题解

    题目链接:http://codeforces.com/contest/1009 A. Game Shopping 题目: 题意:有n件物品,你又m个钱包,每件物品的价格为ai,每个钱包里的前为bi.你 ...

  7. Educational Codeforces Round 93 (Rated for Div. 2)题解

    A. Bad Triangle 题目:https://codeforces.com/contest/1398/problem/A 题解:一道计算几何题,只要观察数组的第1,2,n个,判断他们能否构成三 ...

  8. Educational Codeforces Round 33 (Rated for Div. 2) 题解

    A.每个状态只有一种后续转移,判断每次转移是否都合法即可. #include <iostream> #include <cstdio> using namespace std; ...

  9. Educational Codeforces Round 78 (Rated for Div. 2) 题解

    Shuffle Hashing A and B Berry Jam Segment Tree Tests for problem D Cards Shuffle Hashing \[ Time Lim ...

  10. Educational Codeforces Round 81 (Rated for Div. 2) 题解

    过了n天补的题解:D AB就不用说了 C. Obtain The String 思路挺简单的,就是贪心,但是直接贪心的复杂度是O(|s|*|t|),会超时,所以需要用到序列自动机 虽然名字很高端但是就 ...

随机推荐

  1. MySQL 慢查询探究分析

    背景: 性能测试过程中,数据库往往是造成性能瓶颈之一,而数据库瓶颈中sql 语句又是值得探究分析的一环,其中慢查询是重点优化对象,在MySQL中,慢查询是指查询执行时间较长或者消耗 较多资源的查询语句 ...

  2. selenium-wire兼容selenium和requests

    背景 在工作中UI自动化中可能会需要用到API来做一些数据准备或清理的事情,那UI操作是略低效的,但API操作相对高效. 而实战课就有这样一个案例,不过那个案例是UI操作和API分开的. 极少会遇到这 ...

  3. 转载|QA|Pycharm一行代码太长如何换行?|Pycharm|工具相关

  4. 《Python魔法大冒险》 001 序章:少年小鱼的不平凡一天

    在一个普通的城市里,生活着一个名叫小鱼的少年.他是一名初中生,但在班级里,他的学习成绩总是垫底.同学们经常取笑他,有时甚至戏称他为"倒数王". 放学后,小鱼一个人走在回家的路上,他 ...

  5. codeblock安装及汉化教程

    1.双击图标 2.弹出如下对话框: 3.单击按钮Next,弹出如下对话框: 4.单击按钮I Agree,弹出如下对话框: 5.单击按钮Next,弹出如下对话框: 6.单击Browse按钮,可以重新设置 ...

  6. Redis 不同插入方法的性能对比

    1. 测试目的 对比 Redis 不同插入方法(插入同时能设置过期时间)的性能区别. 2. 测试数据 key:SMGP_ value:JSON数据 { "spName":" ...

  7. Record - Nov. 28st, 2020 - Exam. REC

    Prob. 1 Desc. & Link. 暴力为 \(\Theta(NK)\). 正解(也许): 把每一个全为正整数的子段找出来. 然后判断一下中间连接的情况即可. 但是这样决策情况太多了. ...

  8. MySQL运维2-主从复制

    一.主从复制概念 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从服务器中,然后在从服务器上对这些日志重新执行也叫重做,从而使得从数据库和主库的数据保持同步. MySQL支持一台主库同时 ...

  9. Host-Only模式下虚拟机无法联网问题

    环境: 镜像:Linux CentOS7 \-----------------------------------------\ 问题描述: 虚拟设置了Host-Only模式的虚拟网卡VMNet4,并 ...

  10. VScode+X11支持连接服务器时支持open3d、openCV、matplotlib等可视化

    背景 连接服务器以后,想用open3d可视化点云.matplotlib画点图,但是一直不能用,原因也很简单,就是没有配置GUI传输显示,那肯定是要配置X11相关的东西. 过程 服务器 确保服务器下载了 ...