A

讨论三种情况,不换/全换成0/全换成1 ,取一个花费最小值


#include <bits/stdc++.h>
using namespace std;
const int N = 1000 + 20; int n, c0, c1, h;
char str[N]; int main()
{
int T;
scanf("%d", &T);
while(T -- )
{
scanf("%d%d%d%d%s", &n, &c0, &c1, &h, str);
int a = 0, b = 0;
for(int i = 0; i < n; ++ i)
if(str[i] == '0') a ++;
else b ++;
int res = 1e9;
res = min(res, n * c0 + h * b);
res = min(res, n * c1 + h * a);
res = min(res, c0 * a + c1 * b);
printf("%d\n", res);
}
return 0;
}

B

排序之后,从\(n \times k - \dfrac{n}{2}\)开始取,每隔\(\dfrac{n}{2}\)取一个,取\(k\)个即可


#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1000 + 20; int n, k, a[N * N]; int main()
{
int T;
scanf("%d", &T);
while(T -- )
{
scanf("%d%d", &n, &k);
for(int i = 1; i <= n * k; ++ i) scanf("%d", &a[i]);
sort(a + 1, a + n * k + 1);
LL res = 0;
for(int i = n * k - n / 2, j = 1; j <= k; i -= n / 2 + 1, ++ j)
res += a[i];
printf("%lld\n", res);
}
return 0;
}

C1/C2

按行处理,处理前\(n - 2\)行,最后\(2\)行按列处理,处理到\(m - 2\)列,最后\(4\)个格子讨论即可.


#include <bits/stdc++.h>
using namespace std;
const int N = 100 + 5; int n, m;
int a[N][N]; struct zt
{
int a, b, c, d, e, f;
};
vector<zt> vec; int main()
{
int T;
scanf("%d",&T);
while(T --)
{
vec.clear();
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= m; ++ j)
scanf("%1d", &a[i][j]);
for(int i = 1; i <= n - 2; ++ i)
for(int j = 1; j <= m; ++ j)
if(a[i][j])
{
vec.push_back((zt){i, j, i + 1, j, i + 1, j < m ? j + 1 : j - 1});
a[i][j] ^= 1; a[i + 1][j] ^= 1; a[i + 1][j < m ? j + 1 : j - 1] ^= 1;
}
for(int j = 1; j <= m - 2; ++ j)
for(int i = n - 1; i <= n; ++ i)
if(a[i][j])
{
vec.push_back((zt){i, j, i, j + 1, i < n ? i + 1 : i - 1, j + 1});
a[i][j] ^= 1; a[i][j + 1] ^= 1; a[i < n ? i + 1 : i - 1][j + 1] ^= 1;
}
int num = a[n - 1][m - 1] + a[n - 1][m] + a[n][m - 1] + a[n][m];
if(num == 1)
{
if(a[n][m])
{
vec.push_back((zt){n, m, n, m - 1, n - 1, m - 1});
vec.push_back((zt){n, m, n, m - 1, n - 1, m});
vec.push_back((zt){n, m, n - 1, m, n - 1, m - 1});
}
if(a[n - 1][m])
{
vec.push_back((zt){n - 1, m, n - 1, m - 1, n, m - 1});
vec.push_back((zt){n - 1, m, n - 1, m - 1, n, m});
vec.push_back((zt){n - 1, m, n, m, n, m - 1});
}
if(a[n][m - 1])
{
vec.push_back((zt){n, m - 1, n - 1, m - 1, n - 1, m});
vec.push_back((zt){n, m - 1, n - 1, m - 1, n, m});
vec.push_back((zt){n, m - 1, n, m, n - 1, m});
}
if(a[n - 1][m - 1])
{
vec.push_back((zt){n - 1, m - 1, n, m - 1, n, m});
vec.push_back((zt){n - 1, m - 1, n, m - 1, n - 1, m});
vec.push_back((zt){n - 1, m - 1, n - 1, m, n, m});
}
}
if(num == 2)
{
if(a[n - 1][m - 1] && a[n - 1][m])
{
vec.push_back((zt){n - 1, m - 1, n, m - 1, n, m});
vec.push_back((zt){n, m - 1, n, m, n - 1, m});
}
if(a[n][m - 1] && a[n][m])
{
vec.push_back((zt){n, m - 1, n - 1, m - 1, n - 1, m});
vec.push_back((zt){n, m, n - 1, m, n - 1, m - 1});
}
if(a[n - 1][m - 1] && a[n][m - 1])
{
vec.push_back((zt){n - 1, m - 1, n - 1, m, n, m});
vec.push_back((zt){n, m - 1, n - 1, m, n, m});
}
if(a[n - 1][m] && a[n][m])
{
vec.push_back((zt){n - 1, m, n - 1, m - 1, n, m - 1});
vec.push_back((zt){n, m, n, m - 1, n - 1, m - 1});
}
if(a[n - 1][m - 1] && a[n][m])
{
vec.push_back((zt){n - 1, m - 1, n - 1, m, n, m - 1});
vec.push_back((zt){n, m, n - 1, m, n, m - 1});
}
if(a[n][m - 1] && a[n - 1][m])
{
vec.push_back((zt){n - 1, m, n - 1, m - 1, n, m});
vec.push_back((zt){n, m - 1, n - 1, m - 1, n, m});
}
}
if(num == 3)
{
vector<int> tmp;
if(a[n][m]) tmp.push_back(n), tmp.push_back(m);
if(a[n - 1][m - 1]) tmp.push_back(n - 1), tmp.push_back(m - 1);
if(a[n - 1][m]) tmp.push_back(n - 1), tmp.push_back(m);
if(a[n][m - 1]) tmp.push_back(n), tmp.push_back(m - 1);
vec.push_back((zt){tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5]});
}
if(num == 4)
{
vec.push_back((zt){n - 1, m - 1, n - 1, m, n, m - 1});
vec.push_back((zt){n, m, n, m - 1, n - 1, m - 1});
vec.push_back((zt){n, m, n, m - 1, n - 1, m});
vec.push_back((zt){n, m, n - 1, m, n - 1, m - 1});
}
printf("%d\n", vec.size());
for(int i = 0; i < vec.size(); ++ i)
printf("%d %d %d %d %d %d\n", vec[i].a, vec[i].b, vec[i].c, vec[i].d, vec[i].e, vec[i].f);
}
return 0;
}

E

线段树,维护一个min和max和区间和,利用单调不增的性质进行修改和查询


#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10; int n, m, w[N];
struct Node
{
int l, r;
LL maxv, minv, sum, lazy;
}tr[N * 4]; void pushup(int u)
{
tr[u].maxv = max(tr[u << 1].maxv, tr[u << 1 | 1].maxv);
tr[u].minv = min(tr[u << 1].minv, tr[u << 1 | 1].minv);
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
} void pushdown(int u)
{
Node &root = tr[u], &left = tr[u << 1], &right = tr[u << 1 | 1];
if(root.lazy)
{
left.maxv = right.maxv = root.lazy;
left.minv = right.minv = root.lazy;
left.sum = (left.r - left.l + 1) * root.lazy;
right.sum = (right.r - right.l + 1) * root.lazy;
left.lazy = right.lazy = root.lazy;
root.lazy = 0;
}
} void build(int u, int l, int r)
{
if(l == r) tr[u] = {l, r, w[r], w[r], w[r], 0};
else
{
tr[u] = {l, r, 0, 0, 0, 0};
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
} void modify(int u, int l, int r, int v)
{
if(tr[u].minv >= v) return;
if(tr[u].l >= l && tr[u].r <= r && tr[u].maxv < v)
{
tr[u].lazy = v;
tr[u].minv = tr[u].maxv = v;
tr[u].sum = (LL)(tr[u].r - tr[u].l + 1) * v;
}
else
{
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) modify(u << 1, l, r, v);
if(r > mid) modify(u << 1 | 1, l, r, v);
pushup(u);
}
} int query(int u, int l, int r, int &v)
{
if(tr[u].minv > v) return 0;
if(tr[u].l >= l && tr[u].r <= r && tr[u].sum <= v)
{
v -= tr[u].sum;
return tr[u].r - tr[u].l + 1;
}
else
{
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
int res = 0;
if(l <= mid) res = query(u << 1, l, r, v);
if(r > mid) res += query(u << 1 | 1, l, r, v);
return res;
}
} int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++ i) scanf("%d", &w[i]);
build(1, 1, n);
while(m -- )
{
int op, x, y;
scanf("%d%d%d", &op, &x, &y);
if(op == 1) modify(1, 1, x, y);
else printf("%d\n", query(1, x, n, y));
}
return 0;
}

2020.11.19

Codeforces Round #684 (Div. 2)的更多相关文章

  1. Codeforces Round #684 (Div. 2)【ABC1C2】

    比赛链接:https://codeforces.com/contest/1440 A. Buy the String 题解 枚举字符串中 \(0\) 或 \(1\) 的个数即可. 代码 #includ ...

  2. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  3. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  4. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

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

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

  6. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  7. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  8. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  9. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

随机推荐

  1. CentOS7安装配置 NFS

    一.NFS 简介 NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端N ...

  2. docker的企业级仓库-harbor

    Harbor 一.背景 Docker中要使用镜像,我们一般都会从本地.Docker Hub公共仓库或者其它第三方的公共仓库中下载镜像,但是出于安全和一些内外网的原因考虑,企业级上不会轻易使用.普通的D ...

  3. Automatic merge failed; fix conflicts and then commit the result.解决方法

    产生原因: git pull 的时候会分为两步,第一步先从远程服务器上拉下代码,第二步进行merge.当你merge时候失败了就会产生Automatic merge failed; fix confl ...

  4. select函数详细用法解析

    1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set ...

  5. HDU 6706 huntian oy(杜教筛 + 一些定理)题解

    题意: 已知\(f(n,a,b)=\sum_{i=1}^n\sum_{j=1}^igcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\mod 1e9+7\),\(n\leq1e9\),且 ...

  6. SpringBoot进阶教程(七十)SkyWalking

    流行的APM(Application Performance Management工具有很多,比如Cat.Zipkin.Pinpoint.SkyWalking.优秀的监控工具还有很多,其它比如还有za ...

  7. Linux 驱动框架---驱动中的并发

    并发指多个执行单元被同时.并行的执行,而并发执行的单元对共享资源的访问就容易导致竟态.并发产生的情况分为抢占和并行(多核)和硬抢占(中断).Linux为解决这一问题增加了一系列的接口来解决并发导致的竟 ...

  8. μC/OS-III---I笔记9---任务等待多个内核对象和任务内建信号量与消息队列

    在一个任务等待多个内核对象在之前,信号量和消息队列的发布过程中都有等待多个内核对象判断的函数,所谓任务等待多个内核对象顾名思义就是一任务同时等待多个内核对象而被挂起,在USOC-III中一个任务等待多 ...

  9. 中英文混排网站排版指南 All In One

    中英文混排网站排版指南 All In One 排版 数字与单位 正确 5G 的下载速度可以达到 1Gbps,4G 为100Mbps 1Gbps === 1000Mbps 错误 5G的下载速度可以达到1 ...

  10. dragable tabs & iframe & new window

    dragable tabs & iframe & new window https://www.npmjs.com/package/react-draggable-tab demo h ...