由于一次比赛被虐得太惨,,生发开始写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. JSP是什么?有什么特点?

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.在Servlet当中开发嵌入html的脚本,会非常的繁琐.JSP支持在h ...

  2. DateUtils互转工具类

    public class DateUtils { /** * 取系统默认时区ID */ private static final ZoneId ZONE_ID; static { ZONE_ID = ...

  3. 为什么 Java 中的 String 是不可变的(Immutable)?

    Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字 符串设置为不可变可以允许多个客户端之间共享相同的字符串.

  4. 学习zabbix(四)

    一. 监控知识 1.硬件监控: 机房巡检,远程控制卡,IPMI 2.系统监控: cpu负载查看(指标):uptime(低于3),top(30%-70%), vmstat, mpstat 内存监控: f ...

  5. 用AltiumDesigner画完PCB生成gerber(光绘)文件详细说明

    什么是gerber文件             Gerber文件是所有电路设计软件都可以产生的文件,在电子组装行业又称为模版文件(stencil data),在PCB制造业又称为光绘文件.可以说Ger ...

  6. 好用开源的C#快速开发平台

    NFine 是基于 C# 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展,让Web开发更迅速.简单.NFine是一套基于 ASP.NET ...

  7. 「腾讯视频」微信小程序插件介绍

    上期,我们在<从原理到应用,一文带你了解小程序插件能力>一文中介绍了小程序插件的意义.作用以及应用.今天开始,我们会每期与大家分享一款优秀的小程序插件,从使用场景到使用方法,都将作出详细的 ...

  8. 原生js实现架子鼓特效

    这是代码完成的效果,按下abcd会出现对应的架子鼓音乐的效果. 简单的介绍下代码思路,html和css部分就不多说了. 重要的是js部分. 大致是这样的, 首先获取到所有的按钮为一个数组,然后遍历整个 ...

  9. CCF201403-2窗口

    问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域.窗口的边界上的点也属于该窗口.窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的 ...

  10. java反射相关

    反射的机制:反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言 ...