Codeforces Round #821 (Div. 2)

带你学习Android中的ContentObserver 通过使用,开发者可以有效地监听系统设置的变化,例如屏幕亮度等。这种机制使得应用能够动态响应系统设置的更改,提升用户体验。在实现需要与系统设置交互的应用时,合理使用是非常重要的。 阅读详情

Codeforces Round #821 (Div. 2)

Dashboard - Codeforces Round #821 (Div. 2) - Codeforces

A. Consecutive Sum

思路

  • 贪心

选择一个连续 k k k个,因此等价于找到 m o d   k = 0 , 1 , 2.. , k − 1 mod\ k=0,1,2..,k-1 mod k=0,1,2..,k−1 的最大的 a a a 的和。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin >> T;
    while (T -- ) {
        cin >> n >> k;
        for (int i = 1; i <= n; i ++) cin >> a[i];

        LL res = 0;
        for (int i = 1; i <= k; i ++) {
            int mx = 0;
            for (int j = i; j <= n; j += k)
                mx = max(mx, a[j]);
            res += mx;
        }

        cout << res << '\n';
            
    }
    return 0;
}

B. Rule of League

思路

  • 构造

由于第一轮一定有一个人输因此 x , y x,y x,y 里必须有一个 0 0 0,假设 x ! = 0 x!=0 x!=0如果接下来等价于是否让每个人均赢 0 / x 0/x 0/x轮,判断 x ∣ n − 1 x|n-1 x∣n−1是否成立即可,然后模拟就行。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin >> T;
    while (T -- ) {
        int x, y; cin >> n >> x >> y;
        if ((x && y) || (!x && !y)) cout << -1 << '\n';
        else {
            if (x < y) swap(x, y);
            if ((n - 1) % x != 0) cout << -1 << '\n';
            else {
                int cnt = (n - 1) / x;
                int id = 2;          
                while (cnt) {
                    for (int i = 1; i <= x; i ++) cout << id << ' ';
                    id += x;
                    cnt --;
                }                                     
                cout << '\n';
            }
        }
    }
    return 0;
}

C. Parity Shuffle Sorting

思路

  • 贪心

​ 假设有 1 , 2 , 1 1,2,1 1,2,1 我们发现无论如何都可以让 2 → 1 2\to 1 2→1,因此先将 a 1 , a n a_1,a_n a1​,an​ 搞成一样的,然后再将 i ∈ [ 2 , n − 1 ] i\in [2,n-1] i∈[2,n−1]都搞成和首尾一样的即可。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin >> T;
    while (T -- ) {
        cin >> n;
        for (int i = 1; i <= n; i ++) cin >> a[i];
        vector<PII> res;        
        if (a[1] != a[n])
            if ((a[1] + a[n]) & 1) a[n] = a[1], res.push_back({1, n});
            else a[1] = a[n], res.push_back({1, n});

        for (int i = 2; i < n; i ++) {
            if ((a[i] + a[1]) & 1) res.push_back({1, i});
            else res.push_back({i, n});
        }

        cout << res.size() << '\n';
        for (auto t : res) cout << t.x << ' ' << t.y << '\n';
    }
    return 0;
}

D2. Zero-One (Hard Version)

题意

​ 给你两个字符串 a , b a,b a,b。你可以对 a a a 串进行如下操作,选择 [ l , r ] [l,r] [l,r] 将 a l ⊕ 1 , a r ⊕ 1 a_l\oplus 1,a_r\oplus 1 al​⊕1,ar​⊕1,如果 l + 1 = = r l+1==r l+1==r 花费 x x x,否则花费 y y y,问你将 a a a 变成 b b b 的最小花费是多少。

思路

  • d p dp dp

由于一次改变两个位置的值,因此当不同的位置为 o d d odd odd 的时候无解。

​ 首先 e a s y   v e r s i o n easy\ version easy version有 x ≥ y x\ge y x≥y 且 n ≥ 5 n\ge 5 n≥5,因此我们直接贪心,设不同位置有 c n t cnt cnt个,如果 c n t = = 2 cnt==2 cnt==2 且相邻 我们有两种操作方法,直接用 x x x,或者用两个 y y y,其余情况直接用 y y y 成对消除即可。

​ 对于 D 2 D2 D2,考虑 y > x y>x y>x 的情况就不好贪心了,我们先将 a a a和 b b b不同的位置取出来放到 c c c数组中,考虑 d p dp dp设 f [ l ] [ r ] f[l][r] f[l][r]:将 l , r l,r l,r 这个区间所有不同的位置消除的最小操作数(注意这里 的 l , r l,r l,r均是 c c c中的下标),那么对于 f [ l ] [ r ] f[l][r] f[l][r] 可以从哪些子状态转移过来呢,即考虑前一个操作,这里由于 y > x y>x y>x,如果用 y y y的话区间一定越长越优,否则可能被连续的 x x x 顶替掉,而如果操作相邻的话中间和两边均一样,因为会被子状态弄到。所以只会从 f [ l + 1 ] [ r − 1 ] , f [ l + 2 ] [ r ] , f [ l ] [ r − 2 ] f[l+1][r-1],f[l+2][r],f[l][r-2] f[l+1][r−1],f[l+2][r],f[l][r−2] 转移过来。

​ 对于任意两个点 ( i , j ) (i,j) (i,j) 合并,会有一下情况,如果 i + 1 = j i+1=j i+1=j 可以花费 m i n ( x , 2 × y ) min(x,2\times y) min(x,2×y) ,如果 i + 1 ! = j i+1!=j i+1!=j有 m i n ( y , ( j − i ) × x ) min(y,(j-i)\times x) min(y,(j−i)×x),因此转移的时候算一下贡献 即可。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
vector<int> ve;
LL x, y;
LL calc(int l, int r) {
    if (l + 1 == r) return min(x, y * 2);
    return min(y, x * (r - l));
}
LL f[5010][5010];
LL dfs(int l, int r) {
    if (r < l) return 0;
    if (f[l][r] != -1) return f[l][r];
    LL res = 1e18;
    res = min(res, dfs(l, r - 2) + calc(ve[r - 1], ve[r]));
    res = min(res, dfs(l + 2, r) + calc(ve[l], ve[l + 1]));
    res = min(res, dfs(l + 1, r - 1) + calc(ve[l], ve[r]));
    return f[l][r] = res;
}
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin >> T;
    while (T -- ) {
        cin >> n >> x >> y;
        string s, t; cin >> s >> t;
        ve.clear();        
        for (int i = 0; i <= n; i ++)
            for (int j = 0; j <= n; j ++)
                f[i][j] = -1;
        for (int i = 0; i < n; i ++)   
            if (s[i] != t[i]) ve.push_back(i + 1);
        if (ve.size() & 1) cout << -1 << '\n';
        else {
            if (ve.size() == 0) cout << 0 << '\n';
            else if (ve.size() == 2) cout << calc(ve[0], ve[1]) << '\n';
            else if (y <= x) cout << ve.size() / 2 * y << '\n';
            else cout << dfs(0, ve.size() - 1) << '\n';
            
        }
    }
    return 0;
}

E. Conveyor

题意

​ 给你 x × y x\times y x×y的的矩阵,每个格点的传送带一开始都是向右,第 0 0 0秒 ( 1 , 1 ) (1,1) (1,1) 有一个箱子,之后每一秒都会从 ( 0 , 0 ) (0,0) (0,0) 放置一个箱子,每一秒如果 ( i , j ) (i,j) (i,j)上有箱子话,会将箱子移动到指向的格点,然后向右的会变成指向上,向上的会指向右,给你 q q q 个询问,每次 t , x , y t,x,y t,x,y,问你第 t t t秒的时候 ( x , y ) (x,y) (x,y)上是否右箱子。

思路

  • 思维,前缀和优化

​ 想知道第 t t t秒的时候 ( x , y ) (x,y) (x,y)是否有箱子不好判断,但是我们可以求 ( i , j ) (i,j) (i,j) 在 t t t 秒内有多少个箱子经过假设为 c n t i , j cnt_{i,j} cnti,j​,假设我们求出了 c n t i , j cnt_{i,j} cnti,j​了,那么他会有一半向右边走,一半向下走,由于先向右,再向下,因此 c n t i , j + 1 + = c n t i , j + 1 2 cnt_{i,j+1}+=\frac{cnt_{i,j}+1}{2} cnti,j+1​+=2cnti,j​+1​, c n t i + 1 , j + = c n t i , j 2 cnt_{i+1,j}+=\frac{cnt_{i,j}}{2} cnti+1,j​+=2cnti,j​​,由于从 ( 1 , 1 ) → ( x , y ) (1,1)\to(x,y) (1,1)→(x,y)需要 x + y − 1 x+y-1 x+y−1秒,因此只有 t − ( x + y − 1 ) t-(x+y-1) t−(x+y−1)个箱子可能到第 ( x , y ) (x,y) (x,y)这个点,所以我们模拟一下 t t t 秒经过了多少个,减去 t − 1 t-1 t−1秒经过了多少个,减一下就知道第 t t t秒是否有箱子停在这里了。

Code

#include <bits/stdc++.h>
#define x first
#define y second
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8, pi = acos(-1), inf = 1e20;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
LL a[150][150];
int g(LL t, int x, int y) {
    memset(a, 0, sizeof a);
    a[0][0] = max(t - (x + y) + 1, 0ll);
    for (int i = 0; i <= x; i ++)
        for  (int j = 0; j <= y; j ++) {
            a[i + 1][j] += a[i][j] / 2;
            a[i][j + 1] += a[i][j] - a[i][j] / 2;
        }
    return a[x][y];
}
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int T;
    cin >> T;
    while (T -- ) {
        LL t; cin >> t >> n >> m;
        cout << (g(t, n, m) - g(t - 1, n, m) > 0 ? "YES" : "NO") << '\n';
    }
    return 0;
}
java爬虫(爬取银行理财数据) import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; imp 阅读详情

相关推荐

单片机通信总述——理论部分(CAN、串口、SPI、I2C等)

并行通信:传输原理:数据各个位同时传输;优点:速度快; 缺点:占用引脚资源多。是指使用 8、16、32 及 64 根或更多的数据线(有多少信号为就需要多少信号位)进行传输的通讯方式,可以同一时刻传输多个数据位的数据。串行通信: 传输原理:数据按位顺序传输;优点:占用引脚资源少; 缺点:速度相对较慢。是指设备之间通过一根数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,同一时刻只能传输一位(bit)数据。 单工: 数据传输只支持数据在一个方向上传输。信息只能单方向传输的工作方式,一

qq_42475191的博客 1万+

Codeforces Round #821 (Div. 2)(A~E)

Codeforces Round #821 (Div. 2)(A~E)

m0_62289613的博客 920

使用KITTI数据集测试不同算法的性能

该文章将使用同一个kitti数据集来测试不同算法的性能,目前已经测试的算法包括:LIO-SAM,FAST-LIO2,Point-LIO,Faster-LIO。

wwtx的博客 2586

Codeforces Round #821 (Div. 2)——A、B、C、D1

Codeforces Round #821 (Div. 2)——A、B、C、D1

Mango. 335

基于FPGA的PCIe核系列:FPGA root模式生成工程例子分析(1)

一、 PCIE系统架构 1.1 PCIE分层结构 PCIE结构 1.2 TLP包 四种TLP类型。 Memory (内存空间操作) IO (IO空间操作) Configuration (配置操作) Message (信息操作) 四种类型TLP,如果有需要响应,称为Non-Posted TLP,如果没有需要响应,称为Posted TLP。 TLP包类型 1.2.1 TLP结构 TLP数据格式 1.2.2 Header各个字段的含义 Header格式 ...

huangshanhu的博客 3433

3D美术14——max——fbx导入max后直接生成bip人形骨骼插件

最近经常会从unity里反八FBX到max里进行2次修改。 但是非常尴尬的事情就是,就是用max做的fbx,你在反导入回来,BIP骨骼都会变成预制体。这个时候有一个方法补救。那就是在导入的时候调整一下参数。(如下图) 把这里调整成设置为骨骼。就还可以了。 但是,如果你不是用max做的FBX。呵呵,那么你一定很头大,因为完全没有用。 所以,这个时候就要上插件了。 Autofbxtobip v.1.1 这个插件适用于2015及其以上版本。 在这之前我还用过一款叫BIPPY,但是效果相当感人,照着这个图片调整

qq_37576129的博客 1万+

D2 - Zero-One (Hard Version)(线性dp)

D2. Zero-One (Hard Version)

weixin_53037379的博客 445

SoulX-FlashHead 加速实践,提升3倍。

SoulX-FlashHead 加速实践,提升3倍。

jacke121的专栏 222

CF821 B. Rule of League

多加思考,把情况考虑清楚后依次进行模拟输出结果即可。

m0_63353853的博客 457

Python爬虫实战:如何爬取汽车之家报价信息

本文通过实战介绍了如何使用Python编写爬虫,抓取汽车之家网站的车型、价格、配置等信息。在爬虫实现过程中,我们使用了requests库来发送HTTP请求,使用解析HTML页面,提取嵌入的JSON数据,并将数据存储到CSV文件中。同时,我们还介绍了如何使用反爬虫策略(如随机User-Agent、请求延时、代理池等)来规避反爬虫机制,确保爬虫的稳定性。

2201_76125261的博客 1594

CDR插件开发之CPG插件004 - 认识VGCore并编译生成你的第一个CPG文件

上篇文章中,讲到了使用VS2019编译CDR类型库 VGCoreAuto.tlb,编译后得到了vgcoreauto.tlh和vgcoreauto.tli两个文件。本文将对这两个文件说明,并演示通过标准的libid形式来导入CDR类型库,在这个过程中,穿插一些VS2019的使用技巧(删除目录、复制工程、打开项目或解决方案、修改解决方案名称、修改项目名称等),使读者循序渐进,逐步提高对VS2019工具的熟练程度,最后通过修改项目属性配置,生成第一个CPG文件。

Zebe 2984

Codeforces Round #821 (Div. 2) 补题题解 (A、B、C、D1、D2)

思维题,首先排除不合法方案,在x和y都不是0的情况下,一定是不合理方案,所以在合理方案的情况下,遍历i,保证每个数输出的次数不大于x/y就行。简单思维,找到下标mod k的范围内最大的一组数即可。没有打比赛,纯赛后刷题。

qiaodxs的博客 265

智能车图像处理2-入门级分析1 ---基础扫线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 7747

Codeforces Round #821 (Div. 2) D2

Codeforces Round #821(Div 2) D2

m0_50269977的博客 296

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

CodeForces Round #821 (div.2) A~C

A. Consecutive Sum 题意: 给定一个长度为 n 的数组,每次操作选择索引 i 和 j ,满足 i % k == j % k ,并交换 a[i] 和 a[j] ,最多不超过 k 次操作。 操作完后,选择 k 个连续的元素,使得其和最大,输出最大值。 思路: i % k == j % k 翻译过来就是表示 元素 a[i] 与 a[j] 的距离为 k 。 所以,可以选定前 k 个数,然后以 k 的距离单位去依次遍历数组,选出每个对应位置上的最大元素,相加即为最大值。

Tom的博客 470

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Codeforces Round #420 (Div. 2)】Codeforces 821ABCDE

一句话题解。

YHaX的博客 475

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Codeforces Round #821 (Div. 2)D2

怎么处理这种问题呢?不难发现:一个位,如果被置反两次以上,是很亏的,因为这是没有意义的(会变成以前已经有过的状态,但是两次在本题中是可以的,因为必须这样来减少代价),若另使用相邻位置反称为操作1,直接置反称为操作2,显然,根据每位不能置反超过两次。我们不可能跨过一位使用操作1。思路:因为没保证X一定大于Y,所以现在多了一种操作:我们发现,对于一段连续区间,从左到右不断的置反相邻的位,则最后也能得到只置反区间左右端点的效果,不妨另len=r-l,若x*len

black_blue_lja的博客 378

Codeforces Round #821(Div.2)题解

总结:这次C题考场上还是思路卡住了,但毕竟这是参加的第二场,坚持补题的好习惯相信自己会有所进步!

marble567的博客 615

Codeforces Round #821 (Div. 2)ABC题解

Codeforces Round #821 (Div. 2)

m0_62233297的博客 450

Codeforces Round #420 (Div. 2) 821E. Okabe and El Psy Kongroo

题目链接: http://codeforces.com/contest/821/problem/E 题意: 一个人要从(0,0)到(k,0),并且只能往右或右上或右下走,问有多少种走法。这个平面上有n条平行于x轴的线段,设第i条线段的左起点为LX[i],右起点为RX[i],纵坐标为Y[i],并且RX[i]=LX[i+1],就是n条线段在X轴上的投影是连续的。当这个人在(x,y)点上且

t51645的博客 654

CodeForces Round #821 div.2 A-D题解

CodeForces Round #821 div.2 A-D题解 A.Consecutive Sum B.Rule of League C.Parity Shuffle Sorting D1. Zero-One (Easy Version)

m0_55733023的博客 347

Codeforces Round #821 (Div. 2) A-D2

Codeforces Round #821 (Div. 2)

过路人丶的博客 185

Codeforces Round #821 (Div. 2) A ~ D2

Codeforces Round #821 (Div. 2)

m0_63296665的博客 762

Codeforces Round #821 (Div. 2) D2、E

Codeforces Round #821 (Div. 2)

eyuhaobanga的博客 127
上一篇: Codeforces Round #751 (Div. 2)
下一篇: New Year Garland
枉玊
博客等级 码龄6年 73粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值