由于一次比赛被虐得太惨,,生发开始写blog的想法,于是便有了这篇随笔(找了个近期的cf比赛练练手(bushi))第一次写blog,多多包涵。

第二场cf比赛,第一场打的Div2,被虐太惨,所以第二场挑了个Div4...

比赛链接: https://codeforces.com/contest/1669

A. Division

  

翻译(参考):

  t组样例,每组样例给出一个正整数,判断该整数所在的范围

题解:

  签到题,分类讨论下即可

B.Trip

翻译(参考):

  t组样例,每组给出一个长度为n的数组,对每组样例输出一个在该数组中出现三次及三次以上的数字(可能有多个,输出任意一个就好),若不存在则输出-1.

题解:

  签到题,An<=2e5,值域范围不大,开个数组记录即可(值域过大可以考虑用map记录)。

C. Odd/Even Increments

翻译(参考)

  t组样例,对每组样例给出一个长度为n的数组(下标从1开始),有以下两种操作,每种操作可进行任意次

    1. 对所有奇数下标的元素+1

    2. 对所有偶数下标的元素+1

  问是否能进行以上两种操作使得数组所有元素都为奇数或都为偶数

题解:

  思维题,很容易想到如果原数组奇数和偶数分别对应的下标不满足均为奇数或者均为偶数不可能经过操作满足条件

  故而,分别判断奇数下标是否全为奇或全为偶,偶数下标是否全为奇或全为偶即可。

D. Colorful Stamp

翻译(参考):

  t组样例,每组给出一个仅由W R B组成的字符串。问该字符串能否经过操作(选择相邻的两个字符,一个变为R另一个变为B)由全为W的等长字符串得到,若可以输出YES,否则输出NO

题解:

样例解释:

  (BRB)

    WWW→WRB→BRB(YES)

  (RRR)

    不可能由WWW得到(NO)

  思维题,我们很容易想到每次操作的结果都是一个R一个B,,操作变换有以下四种情况(对W不能进行操作,因为W改变了不可能再变回去)

    1. RR ---> RB / BR(减少一个R)

    2. BB ---> RB / WR(减少一个W)

    3. RB ---> BR

    4. BR ---> RB

可以得出结论,只要字串中既含B又含有R就可以得到目标字串

把W看成空格得到一堆字串,判断这些字串中是否全为B或者全为B即可

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
string s;
void solve()
{
    int n, r = 0, b = 0, cnt = 0; // r记录R的个数,b记录B的个数
    cin >> n;
    getline(cin, s); //消除换行符
    getline(cin, s); //读入目标字符串
    for (int i = 0; i < n; i++)
    {
        if (s[i] == 'R')
        {
            cnt++;
            r++;
        }
        else if (s[i] == 'B')
        {
            cnt++;
            b++;
        }
        else //遇到W标志已得到一个子串进行判断该字串是否满足条件
        {
            if (r == 0 || b == 0)
            {
                cout << "NO\n";
                return;
            }
            cnt = 0, r = 0, b = 0;
        }
    }
    if (r == 0 || b == 0) //最后的一个不以W分隔的子串
    {
        cout << "NO\n";
        return;
    }
    cout << "YES\n";
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int __;
    cin >> __;
    getline(cin, s);
    while (__--)
    {
        solve();
    }
}
E.2-Letter Strings

翻译(参考):

  t组样例,对每组样例给出n个长度为2的仅由abcdefghijk构成的字符串,求有几对字符串满足只有一个对应位置相同。

题解:

样例解释:

7
aa
bb
cc
ac
ca
bb
aa
("aa", "ac"), ("aa", "ca"), ("cc", "ac"), ("cc", "ca"), ("ac", "aa") and ("ca", "aa")
共计6种

  可以由容斥原理想到,先分别统计对每种字符在多少个字符串的第一个位置出现和对每种字符在多少个字符串的第二个位置出现的数量减去2*相同的字符串的个数(因为相同的字符串在第一个字符相同和第二个字符相同都有被统计)。利用组合数求出对应的每种情况的个数C2m

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
string s;
void solve()
{
    ll ans = 0;
    map<char, ll> mp1, mp2; // mp1统计在位置一(s[0])相同的字符串个数,mp2统计在位置二(s[1])相同的字符串个数
    map<string, ll> mp;     //统计相同的字符串个数
    int n;
    cin >> n;
    getline(cin, s); //吸收换行符
    for (int i = 0; i < n; i++)
    {
        string ss;
        getline(cin, ss);
        if (mp.find(ss) != mp.end())
        {
            mp[ss]++;
        }
        else
        {
            mp[ss] = 1;
        }
        if (mp1.find(ss[0]) != mp1.end())
        {
            mp1[ss[0]]++;
        }
        else
        {
            mp1[ss[0]] = 1;
        }
        if (mp2.find(ss[1]) != mp2.end())
        {
            mp2[ss[1]]++;
        }
        else
        {
            mp2[ss[1]] = 1;
        }
    }
    for (auto it : mp1) //统计每种字符在位置一相同的字符串的贡献
    {
        if (it.second != 1)
        {
            int t = it.second;
            ans += (t * (t - 1) / 2);
        }
    }
    for (auto it : mp2) //统计每种字符在位置二相同的字符串的贡献
    {
        if (it.second != 1)
        {
            int t = it.second;
            ans += (t * (t - 1) / 2);
        }
    }
    for (auto it : mp) //统计每种相同字符串的贡献
    {
        if (it.second > 1)
        {
            int t = it.second;
            string te = it.first;
            ans -= 2 * (t * (t - 1) / 2);
        }
    }
    cout << ans << "\n";
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int __;
    cin >> __;
    getline(cin, s);
    while (__--)
    {
        solve();
    }
}
F. Eating Candies

翻译(参考):

  t组样例,对每组样例给出n个数分别为糖果的价值,Alice从左开始吃糖果,Bob从右往左开始吃糖果,每次只能有一个人吃到糖果,问是否能有一种方案使得两人在中途吃到的糖果总数量相同,输出最大糖果数量

题解:

样例解释:

9

7 3 20 5 15 1 11 8 10

Alice :  [7,3,20]

Bob :  [10,8,11,1]

两人吃的总价值均为30

可以吃的最多的糖果数量为7个

  笔者认为此题考查了前缀和,后缀和,二分。前缀和维护Alice吃的糖果总价值,后缀和维护Bob吃的糖果的总价值,二分查找前缀和对应的元素在后缀和数组中的位置,若出现可更新结果(Alice和Bob的总价值相同),对结果取max输出即可

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll w[200009], a[200009], b[200009]; //记得开long long,因为前缀和或后缀和可能很大会爆int
void solve()
{
    int n, ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> w[i];
        a[i] = a[i - 1] + w[i]; //前缀和->Alice的总价值
    }
    b[n + 1] = 0;
    for (int i = n; i >= 1; i--)
    {
        b[i] = b[i + 1] + w[i]; //后缀和->Bob的总价值
    }
    for (int r = n; r > 1; r--)
    {
        int p = lower_bound(a + 1, a + 1 + r - 1, b[r]) - a; //二分查找
        if (p != r && a[p] == b[r])                          //找到的位置值相同,更新答案
        {
            ans = max(ans, p + n - r + 1); // Alice:p个  Bob:n-r+1个
        }
    }
    cout << ans << "\n";
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int __;
    cin >> __;
    while (__--)
    {
        solve();
    }
}
G. Fall Down

翻译(参考):

t组样例,对每组样例给出n*m的地图,‘*’代表石头,‘.’代表空地,‘o’代表障碍,对每个石头可以进行下落直到遇到障碍或到达底部,输出最终的地图。

样例:

6 10
.*.*....*.
.*.......*
...o....o.
.*.*....*.
..........
.o......o*

输出:

..........
...*....*.
.*.o....o.
.*........
.*......**
.o.*....o*

题解:

  对每个*(石头)往下找第一个不为.(空地)的位置或已到达底部,将二者进行交换即可

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
void solve()
{
    int n, m;
    cin >> n >> m;
    char s[60][60];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> s[i][j]; //读入
        }
    }
    for (int i = n - 2; i >= 0; i--)
    {
        for (int j = 0; j < m; j++)
        {
            if (s[i][j] == '*') //石头
            {
                int k = i + 1;
                while (k < n && s[k][j] == '.') //找第一个不为空地的位置或已到达底部
                {
                    k++;
                }
                swap(s[i][j], s[k - 1][j]); //交换
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << s[i][j];
        }
        cout << "\n";
    }
    cout << "\n";
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int __;
    cin >> __;
    while (__--)
    {
        solve();
    }
}
H. Maximal AND
 
咳咳,鄙人不才,此题赛时没写出来,赛后也没去补题.....
 
ending:
第一次写blog,有什么错误之处欢迎指正!鄙人不胜感激!

[cf]Codeforces Round #784(Div 4)的更多相关文章

  1. CF Codeforces Round #231 (Div. 2)

    http://codeforces.com/contest/394 话说这次CF做的超级不爽,A题一开始交过了,我就没再管,B题还没看完呢,就死困死困的,后来觉得B题枚举一下估计能行,当时是觉得可以从 ...

  2. CF Codeforces Round #258 (Div. 2) B (451B)

    题意:找出一段逆序! 预存a[]数组到b[]数组.将b排序,然后前后找不同找到区间[l,r],然后推断[l,r]是否逆序就能够了!.当然还得特判本身就是顺序的!! ! AC代码例如以下: #inclu ...

  3. CF Codeforces Round #256 (Div. 2) D (448D) Multiplication Table

    二分!!! AC代码例如以下: #include<iostream> #include<cstring> #include<cstdio> #define ll l ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. 【cf比赛记录】Codeforces Round #601 (Div. 2)

    Codeforces Round #601 (Div. 2) ---- 比赛传送门 周二晚因为身体不适鸽了,补题补题 A // http://codeforces.com/contest/1255/p ...

  6. 【cf比赛记录】Codeforces Round #600 (Div. 2)

    Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...

  7. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  8. Codeforces Round #253 (Div. 1) (A, B, C)

    Codeforces Round #253 (Div. 1) 题目链接 A:给定一些牌,然后如今要提示一些牌的信息,要求提示最少,使得全部牌能够被分辨出来. 思路:一共2^10种情况,直接暴力枚举,然 ...

  9. CF922 CodeForces Round #461(Div.2)

    CF922 CodeForces Round #461(Div.2) 这场比赛很晚呀 果断滚去睡了 现在来做一下 A CF922 A 翻译: 一开始有一个初始版本的玩具 每次有两种操作: 放一个初始版 ...

随机推荐

  1. Java 中计算注意!!!

    * 使用BigDecimal需要注意的事项:  * 1.两个BigDecimal值不能使用" +, -, *, / " 进行加减乘除,要使用" add, substrac ...

  2. 为什么要使用 kafka,为什么要使用消息队列?

    缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理. 解耦 ...

  3. consumer提交offset原理

    1 数据结构 消费者的消费状态是保存在SubscriptionState类中的,而SubscriptionState有个重要的属性那就是assignment保存了消费者消费的partition及其pa ...

  4. 在并发情况下,Elasticsearch 如果保证读写一致?

    1.可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用 层来处理具体的冲突: 2.另外对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只 有当大多数 ...

  5. Django中间件 (middleware)

    中间件是处理django的请求和响应的框架级别的钩子,本质是一个类(直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作) 由于其影响的是全局,所以需要谨慎使用,使用不当会影响性 ...

  6. Contos 安装nodeJs环境

    1.去nodeJs官网选择版本: https://nodejs.org/en/download/ 选择64位,右键复制链接地址 https://nodejs.org/dist/v8.12.0/node ...

  7. 自动驾驶运动规划-Dubins曲线

    1.Simple Car模型 如下图所示,Simple Car模型是一个表达车辆运动的简易模型.Simple Car模型将车辆看做平面上的刚体运动,刚体的原点位于车辆后轮的中心:x轴沿着车辆主轴方向, ...

  8. Linux基础学习 | 目录及文件

    一.目录结构 Linux目录采用树形结构,以根目录/向下延伸呈一个倒置的树的形状. 每个目录下都有其相对应的子目录,而子目录中又有其子目录的存在,就像一棵树的树枝分叉,所有的目录层次结构分明,每个目录 ...

  9. 前端基础问题整理-HTML相关

    DOCTYPE的作用以及常见的DOCTYPE类型 <!DOCTYPE>声明位于文档中的最前面的位置,处于 <html> 标签之前,用来告知浏览器页面目前的文件是用哪种版本的HT ...

  10. javaweb之删除功能

    对数据库的删除,主要是通过表中的一个数据查询来进行逐个删除,否则会清空整张表. 一.dao层 在dao层加入删除方法 public boolean delete(Course n) { boolean ...