codeforces round 816 Div2

主要是前4题

Talk is Cheap, Show Me The Code

A

考察点: 贪心(横竖),构造(如何计算),数学(最大值和最小值如何取)

#include <bits/stdc++.h>
using namespace std;

int t;

int main(){
    ios::sync_with_stdio(false);
    cin >> t;
    int n,m;
    while(t--) {
        cin >> n >> m;
        int n1 = min(n,m);
        int m1 = max(n,m);
        if(n==1 && m==1){ // 记得特判一下哦
            cout << 0 << endl;
            continue;
        }
        // 最小拼两次,同时去除重合的两个点。
        cout <<(m1 + 2*n1 -2) << endl;
    }
    return 0;
}

B

考察点: 其实跟第一题差不多,看你如何细分 k - 1 , 同时如何特判 不存在的情况

#include <bits/stdc++.h>
using namespace std;
#define int long long // 1e18 
int t;
signed main()
{
    ios::sync_with_stdio(false);
    cin >> t;
    int n, k, b, s;
    while (t--)
    {
        cin >> n >> k >> b >> s;
        int temp = s / k - (n - 1);
        if (b * k > s) // 举不出反例,再加上b*k <= s ,那就大胆写吧
        {
            cout << -1 << endl;
            continue;
        }
        else
        {
            vector<int> a(n + 1, 0);
            a[0] = b * k;
            s -= b * k;
            for (int i = 0; i < n; i++)
            {
                if (s < k - 1)
                {
                    a[i] += s; // s 已经很小了,就不要强迫他了
                    s = 0;
                    break;
                }
                else
                {
                    a[i] += k - 1; // s还可以,那就继续以k-1补位
                    s -= (k - 1);
                }
            }
            if (s) // s太大了
            {
                cout << -1 << endl;
            }
            else
            {
                for (int i = 0; i < n; i++)
                {
                    cout << a[i] << " \n"[i == n - 1];
                }
            }
        }
    }
}

C

考察点: 归纳,累加,局部贡献如何求解

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m;
map<int, int> mp;
void slove(vector<int> T)
{

    int ans = 0;
    int t;
    mp.clear();
    mp[0] = 0;
    // cout << T.size() << endl;
    for (int i = 1; i <= T.size(); i++)
    {
        if (i == 1)
        {
            t = T[1];
            ans++;
            mp[i] = mp[i - 1] + ans; //我这里主要是方便观察出 i 之前所有的awareneass值
        }
        else
        {
            if (T[i] == t)
            {
                ans++; // +1 很小了因为跟前面合在一起了 qwq 
                mp[i] = mp[i - 1] + ans; 
            }
            else
            {
                t = T[i];
                ans += i; // 不一样就可以加上自己了
                mp[i] = mp[i - 1] + ans;
            }
        }
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin >> n >> m;
    vector<int> a;
    int temp;
    a.push_back(0);
    for (int i = 1; i <= n; i++)
    {
        cin >> temp;
        a.push_back(temp);
    }
    int index, x;
    slove(a);
    //cout << mp[n] << endl;
    for (int i = 0; i < m; i++)
    {
        cin >> index >> x;

        if (a[index] == x)
        {
            cout << mp[n] << endl;
        }
        else
        {
            if (a[index - 1] == x && a[index - 1] != a[index]) // 左右比较,进行贡献计算
                mp[n] -= (n - index + 1) * (index - 1);
            if (a[index - 1] != x && a[index - 1] == a[index])
                mp[n] += (n - index + 1) * (index - 1);
            if (a[index + 1] == x && a[index + 1] != a[index])
                mp[n] -= (n - index) * index;
            if (a[index + 1] != x && a[index + 1] == a[index])
                mp[n] += (n - index) * index; // mp[n] 
            cout << mp[n] << endl;
        }
        a[index] = x; // 改变a
    }
}

D

  • 考察点:贪心(总是找0补充位),位运算(& ),枚举(枚举i位置,反向推演j位置是否合理)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define up(x, y) x | y
int n, q;
const int maxn = 1e5 + 10;

vector<array<int, 2>> Arr[maxn];

signed main()
{
    ios::sync_with_stdio(false);
    cin >> n >> q;
    int i, j, x;

    for (int k = 1; k <= q; k++)
    {
        cin >> i >> j >> x;
        // a[i] | a[j] = x
        Arr[i].push_back({j, x});
        Arr[j].push_back({i, x});
    }
    vector<int> temp(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
        temp[i] = (1 << 31) - 1ll; // 凑30个1,因为 (x < 2 ^ 30)
        for (auto it : Arr[i])
        {
            temp[i] &= (int)it[1]; // w 的 1 都填充好,与 i 相关都 & 一遍
        }
        if (Arr[i].size() == 0) // 
        {
            temp[i] = 0; // greedy 直接取出0 sign
        }
    }

    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= 30; j++)
        {
            if (temp[i] >> j & 1)
            {
                bool flag = false;

                for (auto it : Arr[i])
                {
                    if (!(temp[it[0]] >> j & 1) || it[0] == i) // 或者是 前已经是 0 ,或者是本身 i和i,那我都可以直接赋值 
                    {
                        flag = true;                            // 因为 sign对此处已经置0。
                    }
                }
                if (!flag)
                {
                    temp[i] -= (1 << j); // 
                }
            }
        }
    }
    for (int i = 1; i <= n; i++)
        cout << temp[i] << " \n"[i == n];
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340