2019-08-15下午三道练习题CF1199
思路有点难想 but很好实现
这是原网站链接:传送门 这里只完成D, E, F三题

文章目录

  • D:Welfare State
    • 题目大意
    • 正解
    • 瞅瞅代码
  • E:Matching vs Independent Set
    • 题目大意
    • 正解
    • 代码实现
  • F:Rectangle Painting 1
    • 题目大意
    • 正解
    • 代码实现

D:Welfare State

题目大意

=
n个人
接下来一行有n个数,第i个数表示第i个人手上的钱a[i]
q次操作
操作分为两种:
1): 1 x 表示所有人手上的不能低于x ,即钱数少于x的人,把它的钱数变为x
2): 2 x y 表示第x个人的钱变为y
数据范围:
n (1≤n≤2⋅10^5) (0≤ai≤10^9) (1≤q≤2⋅10^5) (1≤p≤n, 0≤x≤10^9) (0≤x≤10^9)

正解

=
第二种操作很好解决,直接赋值覆盖即可
问题就在于第一种操作
如果我们读入一条语句就进行操作,那么就必须在线O(n)操作 坑定会炸!
想一下,在i个人的最后一次2操作j时,那么j+1~q次操作中的1操作都有可能影响i
所以我们就从后往前离线操作,记录到j次操作为止中1操作的最大值,与这个人最后一次2操作进行比较max

瞅瞅代码

#include <cstdio>
#include <iostream>
using namespace std;
#define MAXN 500005
struct node {int kind, x, y;
}a[MAXN];
int n, q, Max;
int res[MAXN];
bool flag[MAXN];
int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &res[i] );scanf ( "%d", &q );for ( int i = 1;i <= q;i ++ ) {a[i].y = -1;scanf ( "%d", &a[i].kind );if ( a[i].kind == 1 ) scanf ( "%d %d", &a[i].x, &a[i].y );else scanf ( "%d", &a[i].x );}for ( int i = q;i >= 1;i -- ) {if ( a[i].kind == 1 ) {if ( flag[a[i].x] ) continue;elseres[a[i].x] = max ( a[i].y, Max );flag[a[i].x] = 1;}elseMax = max ( Max, a[i].x );}for ( int i = 1;i <= n;i ++ ) {if ( ! flag[i] ) res[i] = max ( res[i], Max );printf ( "%d ", res[i] );}return 0;
}

E:Matching vs Independent Set

题目大意

T组数据,第一行输入n,m 共有3n个点,m条边
接下来m行,表示u,v两点之间有无向边相连
1)如果任选n条边,满足这n条边上的点只被一条边覆盖,即这些点的入度和出度和为1.eg:选两条边1,2和2,3就不符合题意因为2被两条边覆盖了
符合题意就输出Matching,第二行输出这n条边的编号
2)如果任选n条边后,满足至少n个点是孤立的,eg:选两条边1,2和2 3那么1,3就满足题意因为它们之间无直接边相连 (且1,3算两个点)
满足题意就输出IndSet,第二行输出这n个点的编号
3)如果都不满足就输出Impossible
(1≤n≤10^5, 0≤m≤5*10^5)1≤vi,ui≤3⋅n)

正解

首先要想明白,根本没有Impossible的可能,证明一下:因为共有3n个点,选n条边,最多也只能覆盖2n个点,那么剩下的n个点也是孤立的。
其次,这个如果是考试一般要绑点,就别想着骗分了

那么很好想不能满足边,就一定满足点
我们就在线操作,对u,v进行打标,满足边就tot++,最后判断tot输出就好了
还可用打标的flag数组进行答案输出

代码实现

#include <cstdio>
#include <cstring>
#define MAXN 300005
#define MAXM 500005
int n, m, t, cnt;
bool flag[MAXN];
int a[MAXM];
int main() {scanf ( "%d", &t );while ( t -- ) {for ( int i = 1;i <= 3 * n;i ++ )flag[i] = 0;cnt = 0;scanf ( "%d %d", &n, &m );for ( int i = 1;i <= m;i ++ ) {int u, v;scanf ( "%d %d", &u, &v );if ( flag[u] || flag[v] ) continue;else {flag[u] = flag[v] = 1;a[++ cnt] = i;}}if ( cnt >= n ) {printf ( "Matching\n" );for ( int i = 1;i <= n;i ++ )printf ( "%d ", a[i] );printf ( "\n" );}else {printf ( "IndSet\n" );int tot = 0;for ( int i = 1;i <= 3 * n;i ++ ) {if ( tot >= n ) break;if ( ! flag[i] ) {tot ++;printf ( "%d ", i );}}printf ( "\n" );}}return 0;
}

F:Rectangle Painting 1

题目大意

输入n,接下来输入nn的字符矩阵,‘#’, ‘.’
求最少把整个矩阵全都变为‘.’的代价和
自选矩阵大小h
w以及矩阵的位置,然后被这个矩阵所包含的所有点都变为‘.’
代价为max (h, w)
n (1≤n≤50)

正解

首先拿到这个题,坑定暴搜是有分的,但会炸
那我们就思考假设对于一个23的矩阵,那么影响这个矩阵的方案有13+23(把第一行和第二行断开),12+22(把第一列和第二三列断开),22+12(把第一二列和第三列断开)然后在对于每一种断开继续以上操作,直到分出11的矩阵,就知道答案了
所以我们就要记忆化搜索,防止重复遍历超时,不断更新最小值

代码实现

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 55
int n;
bool flag[MAXN][MAXN];
int dp[MAXN][MAXN][MAXN][MAXN];
int dfs ( int sx, int sy, int ex, int ey ) {if ( dp[sx][sy][ex][ey] != -1 ) return dp[sx][sy][ex][ey];if ( sx == ex && sy == ey ) return dp[sx][sy][ex][ey] = flag[sx][sy];int result1 = 0x7f7f7f7f, result2 = 0x7f7f7f7f;if ( sx != ex )for ( int i = sx;i < ex;i ++ )result1 = min ( result1, dfs ( sx, sy, i, ey ) + dfs ( i + 1, sy, ex, ey ) );if ( sy != ey )for ( int i = sy;i < ey;i ++ )result2 = min ( result2, dfs ( sx, sy, ex, i ) + dfs ( sx, i + 1, ex, ey ) );return dp[sx][sy][ex][ey] = min ( min ( result1, result2 ), max ( ( ex - sx  + 1 ), ( ey - sy + 1 ) ) );
}
int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "\n" );for ( int j = 1;j <= n;j ++ ) {char tu;scanf ( "%c", &tu );if ( tu == '#' ) flag[i][j] = 1;else flag[i][j] = 0;}}memset ( dp, -1, sizeof ( dp ) );int result = dfs ( 1, 1, n, n );printf ( "%d", result );return 0;
}


连A三道,偶的妈呀!大神这是要逆天啦!!!
你这次考了倒数第五名,从倒数第一进步了五名,这么学下去,你不得牛死!
好了代码,或者思路有任何不懂的,在评论区留言,我看见会给你进行答复知道你懂为止 ,让我们下期再见,bye~~

【CF1199 D,E, F】Welfare State // Matching vs Independent Set // Rectangle Painting 1相关推荐

  1. F:跳蛙【2019北大夏令营F】

    F:跳蛙[2019夏令营F]找不到提交入口正确性未知 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个 1*n 的棋盘上生活着若干只青蛙:有恰好一只青蛙王和 ...

  2. 【Cf Edu #47 F】Dominant Indices(长链剖分)

    要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来. 参考重链剖分,由于一个点向上最多只有$log$条轻边,故 ...

  3. 【C#公共帮助类】JsonHelper 操作帮助类, 以后再也不用满地找Json了,拿来直接用...

     四个主要操作类:JsonConverter .JsonHelper .JsonSplit .AjaxResult 一.JsonConverter: 自定义查询对象转换动态类.object动态类转换j ...

  4. 【jzoj3734,Usaco2014Open银组】双导航(gpsdual)

    前言 这是今天C组的题,闲得无聊做了一会,结果就对了233.这算是学了SPFA之后的第一次实战了.反正其他C组题我也不想做了.好了现在bi~~(系统自动屏蔽)也在做这道题. 还有这道题的名字叫 正题 ...

  5. 【逆强化学习-2】最大熵学习(Maximum Entropy Learning)

    文章目录 0.引言 1.算法原理 2.仿真 0.引言 \qquad本文是逆强化学习系列的第2篇,其余博客传送门如下: 逆强化学习0-Introduction 逆强化学习1-学徒学习 \qquad最大熵 ...

  6. 【从零开始学习深度学习】34. Pytorch-RNN项目实战:RNN创作歌词案例--使用周杰伦专辑歌词训练模型并创作歌曲【含数据集与源码】

    目录 RNN项目实战使用周杰伦专辑歌词训练模型并创作歌曲 1.语言模型数据集预处理 1.1 读取数据集 1.2 建立字符索引 1.3 时序数据的2种采样方式 1.3.1 随机采样 1.3.2 相邻采样 ...

  7. 【安卓开发系列 -- APP 】APP 性能优化 -- 崩溃分析

    [安卓开发系列 -- APP ]APP 性能优化 -- 崩溃分析 [1]Native Crash 分析示例 [1.1]Linux 编译 breadpad 下载 breadpad 源码 git clon ...

  8. 【安全算法之SHA1】SHA1摘要运算的C语言源码实现

    [安全算法之SHA1]SHA1摘要运算的C语言源码实现 概述 头文件定义 C语言版本的实现源码 测试用例 github仓库 更多参考链接 概述 大家都知道摘要算法在安全领域,也是一个特别重要的存在,而 ...

  9. 【软考软件评测师】2014综合知识历年真题

    [软考软件评测师]2014综合知识历年真题 2014软件评测师综合知识历年真题 [软考软件评测师]2014综合知识历年真题 [2014年评测真题第01题:绿色] 01.三总线结构的计算机总线系统由( ...

最新文章

  1. python 使用安装虚拟环境 virtualenv
  2. 百度重新定义「智能屏」,瞄准10后
  3. 2020 ACM / ICPC 济南 A Matrix Equation (高斯消元、乘法原理)
  4. 【AI白身境】学深度学习你不得不知的爬虫基础​​​​​​​
  5. gorm存指针数据_gormt: gormt 是一个数据库映射工具,可以将 mysql 数据库自动生成 golang sturct 结构...
  6. Cpp 对象模型探索 / 静态局部对象只构造一次的原因和执行析构的方法
  7. Maven拉取私服Jar包和发布jar包到maven私服
  8. Oracle查看表空间和表空间中的对象
  9. 怎么在Windows 11中为音频输出选择扬声器
  10. 静默文件安装安装WebLogic
  11. 求字符串的最小正周期
  12. matlab 颜色对照表
  13. 计算机一级报名照片是几寸的,法考报名照片要求几寸
  14. LM317调压电阻计算
  15. JAVA POI导出Excel文件并添加水印
  16. 数据驱动进化优化(data-driven evolutionary optimization)
  17. 一个故事轻松记忆常见252个英语字根(31~80)
  18. Leetcode No.198 打家劫舍(动态规划)
  19. Linux下基础命令(二)
  20. 免费的WebService服务器

热门文章

  1. 什么样的程序员会让人讨厌
  2. java如何运行一个任务_如何每天从Java运行任务?
  3. php gd库 函数 建立gif,PHP_PHP GD库生成图像的几个函数总结,使用GD库中提供的函数动态绘 - phpStudy...
  4. linux应用与管理,Linux操作系统应用与管理
  5. java类同步_Java中方法,对象,类的同步
  6. 栈的基础概念与经典题目(Leetcode题解-Python语言)
  7. C++ 多态实现的三个条件
  8. [Java基础]Lambda表达式的格式与使用前提
  9. [蓝桥杯]字符串对比-模拟
  10. [蓝桥杯2018初赛]乘积尾零-数论