比赛链接https://codeforc.es/contest/1199

 

A. City Day

题意:给出一个数列,和俩个整数\(x,y\),要求找到序号最靠前的数字\(d\),使得\(d\)满足\(a_d<a_j\) (\(d-x\leq j<d\) && \(d<j\leq d+y\))。

分析:由于x和y都小于7,所以直接暴力即可。

AC代码:

#include <bits/stdc++.h>
#define SIZE 200007
#define rep(i, a, b) for(int i = a; i <= b; ++i)
using namespace std;
typedef long long ll;
void io() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
ll n, x, y, a[SIZE];
int main() {
io();
cin >> n >> x >> y;
rep(i, 1, n) cin >> a[i];
rep(i, 1, n) {
bool flag = 1;
for (int k = i - 1, cnt = 1; k > 0 && cnt <= x; k--, cnt++) {
if (a[k] <= a[i]) { flag = 0; break; }
}
for (int k = i + 1, cnt = 1; k <= n && cnt <= y; k++, cnt++) {
if (a[k] <= a[i]) { flag = 0; break; }
}
if (flag) { cout << i << endl; return 0; }
}
}

 

B. Water Lily

分析:几何水题,推个方程就好。

AC代码:

#include <bits/stdc++.h>
using namespace std;
int main() {
double l, h;
cin >> h >> l;
double s = (l * l - h * h) / 2 / h;;
printf("%.12lf", s);
}

 

C. MP3

题意:一个数组中如果有\(K\)种不同的数,每个数的占用空间是\(k=log_2K\),这组数总内存是\(nk\),你有一个改变数的大小的能力,小于\(l\)可以改成\(l\)大于\(r\)可以改成\(r\),现在给出总内存,求最少改变次数。

分析:先求出最多能存\(k\)个数,然后我们显然用\(map\)来记录数据,然后把\(map\)中的前\(k\)个数和后k个数丢进一个双向队列(因为我们至少删除\(k\)个数,而这\(k\)个数只能在首或尾),对这\(2k\)个数求前缀和,在每k个数中求出最小值。

AC代码:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define SIZE 400007
#define rep(i, a, b) for(int i = a; i <= b; ++i)
using namespace std;
typedef long long ll;
void io() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
ll n, I, a[SIZE], pre[SIZE];
map<ll, ll> mp;
deque<pair<ll, ll> > q;
int main() {
io(); cin >> n >> I;
rep(i, 1, n) {
cin >> a[i];
++mp[a[i]];
}
ll k = 0; I *= 8; //用k记录最多存储几个数
while (1ll * ceil(log2(mp.size() - k))* n > I) k++;
auto it = mp.begin();
auto itr = mp.rbegin();
rep(i, 1, k) {
q.push_back(make_pair(it->first, it->second));
q.push_front(make_pair(itr->first, itr->second));
it++, itr++;
}
auto itx = q.begin();
rep(i, 1, q.size()) pre[i] = pre[i - 1] + itx++->second;
ll sum = INF;
rep(i, k, 2 * k) sum = min(sum, pre[i] - pre[i - k]);
cout << sum;
}

 

D. Welfare State

题意:给定一个\(n\)个数的数列和两种操作。操作一是把序号为\(p\)的数字修改为\(x\),操作二是把所有小于\(x\)的数字修改为\(x\)。输出最终的数列。

分析:乍一看像线段树,但是写得不好就会\(T\)(别问我怎么知道的),实际上直接乱搞就过了。我们发现对于第一种操作和第二种操作我们只需要考虑较大的那种,因此开两个数组,\(b\)数组保存操作一,\(maxx\)数组保存操作二,最后取\(max\)输出即可。

AC代码:

#include<bits/stdc++.h>
#define SIZE 200007
#define rep(i, a, b) for(int i = a; i <= b; ++i)
using namespace std;
typedef long long ll;
void io() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
ll n, m, a[SIZE], b[SIZE], sig, maxx[SIZE], pos;
int main() {
io(); cin >> n;
rep(i, 1, n) cin >> a[i];
cin >> m;
rep(i, 1, m) {
cin >> sig;
if (sig == 1) {
cin >> pos;
cin >> a[pos];
b[pos] = i;
}
else cin >> maxx[i];
}
for (int i = m; i; --i) maxx[i - 1] = max(maxx[i - 1], maxx[i]);
rep(i, 1, n) cout << max(a[i], maxx[b[i]]) << ' ';
}

 

E. Matching vs Independent Set

题意:给定一个\(3n\)个顶点,\(m\)条边的图和两个定义。定义一:如果一个边集中没有两条边共享一个端点,则称为匹配。定义二:如果一个点集中没有两个顶点与边连接,则一组顶点称为独立集。判断给定的图是否存在匹配或独立集(\(size=n\))。

分析:乍看像一道图论,实际上并不需要图论算法。首先用vector存图。然后观察到匹配和独立集必定至少存在一个。证明:我们考虑每次取\(n\)个点,若不存在独立集,则这\(n\)个点中至少存在一条边,这样操作到最后至多存在\(n-2\)个点不连边,且不存在独立集;但是这样的构造后我们发现,在那\(2n+2\)个点中至少存在\(n+1\)条边构成匹配。因此,我们只需要处理出所有独立的点,判断是否能构成独立集,若不能则至少有\(2n+2\)个点有连边,我们两两取边加入匹配集并输出即可。

AC代码:

#include <bits/stdc++.h>
#define SIZE 500007
#define rep(i, a, b) for(int i = a; i <= b; ++i)
using namespace std;
typedef long long ll;
void io() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
typedef long long ll;
vector <pair<int, int> > h[SIZE];
vector <int> edge, vec;
int n, m, T, cnt, u, v;
bool vis[SIZE];
int main() {
io(); cin >> T;
while (T--) {
cin >> n >> m;
edge.clear(); vec.clear(); cnt = 0;
rep(i, 1, 3 * n) { h[i].clear(); vis[i] = false; }
rep(i, 1, m) {
cin >> u >> v;
h[u].emplace_back(make_pair(v, i));
h[v].emplace_back(make_pair(u, i));
}
rep(i, 1, 3 * n) {
bool flag = false;
for (auto it : h[i]) {
int pos = it.first;
if (vis[pos]) {
flag = true; vis[pos] = false;
edge.emplace_back(it.second);
break;
}
}
if (!flag) vis[i] = true, cnt++;
else cnt--;
}
if (cnt >= n) {
cout << "IndSet" << endl;
int num = 0;
rep(i, 1, 3 * n) {
if (num >= n) break;
if (vis[i]) { num++; cout << i << ' '; }
}
}
else {
cout << "Matching" << endl;
rep(i, 0, n - 1) cout << edge[i] << ' ';
}
cout << endl;
}
}

 

F. Rectangle Painting 1

题意:给定一个\(n\times n\)的方格网。每次能在图中选择一个\(a\times b\)的矩形,将该矩形中的方格全部改为“.”,一次操作的花费为\(max(a,b)\)。要求把“#”全部改成“.”,求最小的花费。

分析:由于\(n\leq 50\),所以我们考虑直接暴力四重dp。用\(f[x][y]\)记录\((1,1)\)到\((x,y)\)的“#”数量,用\(dp[x][y][i][j]\)记录\((x,y)\)和\((i,j)\)之间全部染成“.”的花费,然后转移即可。

AC代码:

#include <bits/stdc++.h>
#define SIZE 55
#define rep(i, a, b) for(int i = a; i <= b; ++i)
using namespace std;
typedef long long ll;
void io() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
int n;
char s[SIZE][SIZE];
int dp[SIZE][SIZE][SIZE][SIZE];
int f[SIZE][SIZE];
int main() {
io(); cin >> n;
rep(i, 1, n) {
cin >> (s[i] + 1);
}
rep(i, 1, n) {
rep(j, 1, n) {
f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1] + (s[i][j] == '#');
}
}
rep(x, 1, n) {
rep(y, 1, n) {
rep(i, 1, n - x + 1) {
rep(j, 1, n - y + 1) {
int tx = i + x - 1, ty = j + y - 1;
int t = f[tx][ty] - f[i - 1][ty] - f[tx][j - 1] + f[i - 1][j - 1];
if (!t) { dp[i][j][tx][ty] = 0; continue; }
else dp[i][j][tx][ty] = max(x, y);
rep(k, i + 1, tx) {
dp[i][j][tx][ty] = min(dp[i][j][tx][ty], dp[i][j][k - 1][ty] + dp[k][j][tx][ty]);
}
rep(k, j + 1, ty) {
dp[i][j][tx][ty] = min(dp[i][j][tx][ty], dp[i][j][tx][k - 1] + dp[i][k][tx][ty]);
}
}
}
}
}
cout << dp[1][1][n][n];
}

Codeforces Round #576 (Div. 2) 题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  3. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  4. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  5. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  6. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  7. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  8. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

  9. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

随机推荐

  1. mvc 模板位置

    mvc4 模板位置 Common7\IDE\ItemTemplates\CSharp\Web\MVC 4\CodeTemplates mvc5 模板位置 Common7\IDE\Extensions\ ...

  2. Python之路【第三十二篇】:django 分页器

    Django的分页器paginator 文件为pageDemo models.py from django.db import models # Create your models here. cl ...

  3. JS高级---总结继承

    总结继承 面向对象特性: 封装, 继承,多态 继承, 类与类之间的关系, 面向对象的语言的继承是为了多态服务的   js不是面向对象的语言, 但是可以模拟面向对象,模拟继承,为了节省内存   继承: ...

  4. 小根堆(Heap)的详细实现

    堆的介绍 Heap是一种数据结构具有以下的特点: 1)完全二叉树 2)heap中存储的值是偏序 Min-heap: 父节点的值小于或等于子节点的值 Max-heap: 父节点的值大于或等于子节点的值 ...

  5. 开发笔记—钉钉服务商应用isv开发,从应用配置,到获取客户企业通讯录

    以第三方企业微应用为例 在第三方企业微应用应用时,比较底层的需求,就是应用需要获取客户企业的通讯录,即部门/员工的数据.本人整理以下几个关键数据,供大家开发参考. 新建第三方微应用时,能拿到这些初始数 ...

  6. 题解【洛谷P1938】 [USACO09NOV]找工就业Job Hunt

    题面 题解 将路径连边\((x, y, d)\) ,将航线连边\((x, y, d - w)\).其中线路是从\(x\)到\(y\),航线的费用为\(w\),\(d\)的含义如题面. 跑一遍\(SPF ...

  7. 每天进步一点点------verilog语言实现的分频

    一 .占空比50%的任意奇数分频 如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即 ...

  8. python接口自动化测试 - requests库的post请求进行文件下载

    前言 之前讲了文件上传,当然就有文件下载啦 文件下载操作步骤 极其简单,将二进制格式的响应内容存进本地文件中,根据需要下载的文件的格式来写文件名即可 down_url = 'https://www.i ...

  9. arcgis字段计算器

    arcgis字段计算器 一.VB脚本 1.取某字段前几位或者后几位 ) ) 2.合并字段,中间加符号 Dim a if [ZDDM2] ="" Then a= [ZDDM1] el ...

  10. 【一句话解释】docker and vm

    效果 在一个host上面运行多个os,达到快速部署以及充分利用资源的额目的 vm 虚拟机,会模拟一个完整的操作系统堆栈出来. 缺点开销大,优点,guest os 是一个完整的操作系统 根据hyperv ...