CF693Div3-F,G
前言:
这次DIV3还是蛮简单的
F.题目大意:
给你一个 2 × N 2 \times N 2×N大小的棋盘,有 m m m个点被禁止。问你是否能够放 1 × 2 和 2 × 1 1 \times 2 和 2 \times 1 1×2和2×1将棋盘填满.
题目思路:
考虑填满,条件很苛刻。不妨从前往后看:
最开始一定是竖着放。比横着放好。
直到遇到第一个障碍,找规律后不难发现它一定是要与后面的那个障碍成对组成一段满的.(从前往后两两配对.)
而两个障碍若在同一行则距离必须为偶数,反之必须为奇数.这样才能填满.
我们用 m a t c h [ i ] match[i] match[i]来标志 第 i i i 个方块是否配对.对方块排序后 O ( m ) O(m) O(m)扫一遍两两配对即可.
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
pii a[maxn];
int match[maxn];
int main()
{ios::sync_with_stdio(false);int t; cin >> t;while (t--){int n , k; cin >> k >> n;for (int i = 1 ; i <= n ; i++){int x , y; cin >> x >> y;a[i].first = y;a[i].second = x;match[i] = 0;}if (n == 1){cout << "NO" << endl;continue;}sort(a + 1 , a + 1 + n);for (int i = 2 ; i <= n ; i++){if (a[i].first == a[i - 1].first)match[i] = match[i - 1] = 1;}for (int i = 2 ; i <= n ; i ++){if (match[i]) continue;if (match[i - 1]) continue;if (a[i].second != a[i - 1].second){if ((a[i].first - a[i - 1].first) % 2 == 0)match[i] = match[i - 1] = 1;}else {if ((a[i].first - a[i - 1].first) % 2)match[i] = match[i - 1] = 1;}}bool ok = true;for (int i = 1 ; i <= n ; i++)if (!match[i]) ok = false;if (ok) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}
G.题目大意:
给你一个有向无权图。令 d i d_i di为从 1 1 1节点到 i i i节点的最短路.对于图中每个点,求出以下条件限制下能够达到的具有最小 d j d_j dj的值.
条件:在 i i i点上,可以任意次的往 d d d增大的方向走. 或者只能最多走一次,往 d d d非递增的方向走一步.
题目思路:
先BFS求出 d i s t dist dist数组。考虑其生成的以1为根的bfs外向生成树.
考虑一个点 i i i最终答案能比 d i d_i di小的条件:
1.直接和它相连的返祖边使得到达 j j j,其 d j ≤ d i d_j \leq d_i dj≤di.(这时候只能停止或者往 d d d增大的方向走,所以 d j d_j dj是最优的)
2.没有返祖边,但是它能够通过生成树到达 1这种点,那么可以更新这个点的答案.
(其实就是所有返祖边导致成环,那么环里的点都能被更新)
所以bfs后我们可以用一次dfs来更新答案.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
vector<int> e[maxn];
int d[maxn][2];
void dfs (int u)
{for (auto v : e[u]){if (d[u][0] >= d[v][0])d[u][1] = min(d[u][1] , d[v][0]);else {dfs(v);d[u][1] = min (d[u][1] , d[v][1]);}}return ;
}
int main()
{ios::sync_with_stdio(false);int t; cin >> t;while (t--){int n , m; cin >> n >> m;for (int i = 1 ; i <= n ; i++){e[i].clear();d[i][0] = d[i][1] = 1e9;}for (int i = 1 ; i <= m ; i++){int x , y; cin >> x >> y;e[x].pb (y);}queue<int> q;q.push(1);d[1][0] = 0;while (q.size()){int g = q.front();q.pop();for (auto v : e[g])if (d[v][0] == 1e9)d[v][0] = d[g][0] + 1 , q.push(v);}dfs(1);for (int i = 1 ; i <= n ; i++)cout << min(d[i][0],d[i][1]) << " ";cout << endl;}return 0;
}
CF693Div3-F,G相关推荐
- 哈夫曼树哈夫曼编码(已知A,B,C,D,E,F,G的概率分别为:17,25,50,67,40,60,30.画出其哈夫曼树和每个字符对应的哈夫曼编码)
[也可以哈夫曼树与最优不等长编码] 已知A,B,C,D,E,F,G的概率分别为:17,25,50,67,40,60,30.画出其哈夫曼树和每个字符对应的哈夫曼编码.
- 假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。 它们在电文中出现的频度分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}。【MOOC答案】
目 录 1.题目 2.答案and详细题解过程 1)为这7个字母设计哈夫曼编码: 1.1.答案 1.2.详细题解过程 2)为这7个字母设计等长编码,至少需要几位二进制数?[3位] 2.1.答案 2. ...
- 假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。它们在电文中出现的频度分别为
假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成.它们在电文中出现的频度分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}, 1)为这7个字母设计哈夫曼 ...
- 如果令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于
如果令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- ACM-ICPC 2018 沈阳赛区网络预赛(E F G J K)
ACM-ICPC 2018 沈阳赛区网络预赛(E F G J K) 复杂的模拟题懒癌患者表示写不动 D. Made In Heaven (K短路) 略 int head[MAXN]; int cure ...
- printf打印浮点数,%e %f %g的区别
打印浮点数有%e %f %g三种格式,它们的区别如下: %e 以科学计数法表示,小数点左边只有一位,小数点右边保留6位(过长则截去,不够则补零),接着是符号e,再接着就是10的多少次幂. %f 要求小 ...
- ACM-ICPC 2018 焦作赛区网络预赛(A B E F G H I K L)
ACM-ICPC 2018 焦作赛区网络预赛(A B E F G H I K L) 发了博客一万年之后才发现H1写错了(tao A. Magic Mirror 题目链接 题面: Jessie has ...
- 卷积满足交换律:F*G(x)=G*F(x)
求证:卷积满足交换律 F ∗ G ( x ) = G ∗ F ( x ) F*G(x)=G*F(x) F∗G(x)=G∗F(x) 证明:依据卷积的定义, F ∗ G ( x ) ≜ ∫ − ∞ + ∞ ...
- 思仪 4024A/B/C/D/E/F/G/H/L频谱分析仪
4024频谱分析仪系列产品具有工作频段宽.性能指标高.扫描速度快.测试功能多.操作简便等多重优点,性能指标方面具有优良的平均噪声电平.相位噪声以及扫描速度,测量功能方面具有频谱分析.场强测量.干扰分析 ...
- 格式化输出,浮点数e,f,g保留位数的计算方式不同,e,f :%.3e/f:取小数点后三位,g:%.3g总共有效位数为3,不包括小数点
格式化输出:format() format():把传统的%替换为{}来实现格式化输出 使用位置参数:就是在字符串中把需要输出的变量值用{}来代替,然后用format()来修改使之成为想要的字符串,位置 ...
最新文章
- 包邮免费送2022年科研人专属趣味台历,微科盟年终福利,错过悔一年!
- __add__,关于运算符重载(用户权限)
- P1311 选择客栈
- SPOJ 4110 Fast Maximum Flow (最大流模板)
- 在地图上 添加柱状_如何做出一份惊艳的PPT地图页?这2个字,你一定要知道!...
- 〖Android〗存在多个Android设备时,使用Shell脚本选择一个Android设备
- java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...
- android launcher推荐,追求效率的你,需要这款 Android 最快启动器:FastKey Launcher
- 转-TabHost组件(二)(实现底部菜单导航)
- c语言鸢尾花智能分类,基于LogisticRegression的鸢尾花分类
- webpack-dev-server启动后, localhost:8080返回index.html的原理
- ISO27001LA国际信息安全管理主任审核员(IRCA)认证
- Python爬虫 抓取拉勾招聘信息
- 51单片机学习历程(一)单片机入门
- 暑期实践第二十九天 2022-8-1
- 用matlab画阻尼振动包络线,matlab阻尼振动模拟.doc
- HCNE之RIP协议总结
- Jenkins项目自动化部署工具的安装、配置及使用
- Ecstore的微信账号绑定会员免登录
- 【叮咚买菜】叮咚抢菜使用教程