2019.6.28 JZ DAY4总结

本文介绍了2019年JZ DAY4考试中关于泉水流量指数匹配的问题,涉及到了数据处理和算法应用。题目要求找出不同年份间相同泉水流量指数的年份数对,可以通过哈希表和枚举方法解决。此外,文章还提及了其他两道难度较高的题目,分别是基于密室通道和越狱路线的问题,涉及图论和几何知识。

DAY4DAY4DAY4

T1T1T1
泉泉

Description
济南,中国环渤海地区南翼和黄河中下游地区中心城市,山东省省会,山东省第一大城市,山东省政治、文化、教育中心,华东五大城市之一,区域性金融中心,副省级城市。济南位于山东省中西部,北临黄河,南依泰山。济南分别与西南部的聊城、北部的德州和滨州、东部的淄博、南部的莱芜和泰安交界。济南有着2700 余年的历史,是龙山文化的发祥地。因境内有“七十二名泉”故被称为“泉城”,并素有“四面荷花三面柳,一城山色半城湖”
的美誉。济南历史上涌现了很多文人墨客,著名有李清照、辛弃疾等。济南是国家创新型城市、中国软件名城、全国重要的交通枢纽和物流中心。继济南全运会取得圆满成功后,2013年济南将举办第十届中国艺术节,并成为2015 年“第二十二届国际历史科学大会”的主办城市,为济南建设国际大都市注入了新的活力。
济南市“泉历史研究小组”依据济南特有的泉脉关系将济南的泉水分为六个区域,分别是市中区、历下区、天桥区、槐荫区、历城区、长清区。
作为光荣的济南泉历史研究小组中的一员,铭铭收集了历史上N 个不同年份时不同泉区的泉水流量指数,这个指数是一个小于2^30 的非负整数。第i 个年份时六个泉区的泉水流量指数分别为A(i,1),A(i,2),A(i,3),A(i,4),A(i,5)与A(i,6)。
现在铭铭希望知道有多少对不同的年份:i 和j,满足这两年恰好有K 个泉区的泉水流量指数对应相同。

Input
第一行有2 个整数,分别是N 个K。
之后N 行,每行有6 个整数。第i 行的第j 个数字(i,j)表示第i 个年份中第j 个泉区的泉水流量指数。

Output
只一行,一个整数。表示有多少对不同的年份,满足恰有K 个泉区的泉水流量指数对应相同。

Sample Input
3 3
1 2 3 4 5 6
1 2 3 0 0 0
0 0 0 4 5 6

Sample Output
2

Data Constraint
有8%的数据,N<=1000,A<=20
有8%的数据,N<=1000,A<=2^30
有24%的数据,N<=100000,A<=20
有28%的数据,N<=10000,A<=2^30
有32%的数据,N<=100000,A<=2^30
对于100%的数据,0<=K<=6,且所有数据中K 是等概率出现的,即对于任意的0<=x<=6,都有大约1/7 的数据中K=x。

额,后面两题实在是太难了,只会第一题的暴力分。于是乎,就花十分钟不到完成了16分的暴力,然后开始想更高的分,可不知道是不是因为脑子短路,硬是想不出任何方法,最终造就了今日的三题总分16。
考后其实这题并不是很难,思路很简单易懂。首先将问题转化为求至少有K个相同的组数,那么枚举所有情况,然后用哈希判是否满足,最后再通过容斥求出答案即可。
AC Code:

#include <cstdio>
#include <algorithm>
#include<tr1/unordered_map>
#define ull unsigned long long
#define ll long long
using namespace std::tr1;

const int maxn = 1e5 + 10;
int n,k,a[maxn][7],mx;
ll ans,f[70],C[7][7],T[7];
ull mod = 212370440130137957;
int prime = 233317;
ull base = 131;
unordered_map <ull,int> ma;

int read()
{
	int x = 0,w = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {if (ch == '-') w = -1; ch = getchar();}
	while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
	return x * w; 
}

int cnt(int a)
{
	int res = 0;
	while (a)
	{
		res += a % 2;
		a >>= 1;
	}
	return res;
}

ll sum(int x)
{
	int tot = 0,b[10],cnt = 0;
	ll res = 0;
	ma.clear();
	while (x)
	{
		cnt ++;
		if (x % 2 == 1) b[++ tot] = cnt;
		x >>= 1;
	}
	for (int i = 1; i <= n; i ++)
	{
		ull k = 0;
		for (int j = 1; j <= tot; j ++)
			k = (k * base + a[i][b[j]]) % mod + prime;
		res += 1ll * ma[k];
		ma[k] ++;
	}
	return res;
}

int main()
{
	T[0] = T[1] = 1;
	for (int i = 2; i <= 6; i ++) T[i] = T[i - 1] * i;
	for (int i = 0; i <= 6; i ++)
		for (int j = 0; j <= i; j ++)
			C[i][j] = T[i] / (T[j] * T[i - j]);
	n = read(),k = read();
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= 6; j ++) a[i][j] = read();
	mx = (1 << 6) - 1;
	for (int i = 0; i <= mx; i ++)
	{
		ll u = sum(i);
		int ct = cnt(i);
		if (ct >= k)
		{
			if ((ct - k) & 1) ans -= u * C[ct][k]; else ans += u * C[ct][k];
		}
	}
	printf("%lld",ans);
	return 0;
}

T2T2T2
刺客信条刺客信条

Description
故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客。最终,凭借着他的努力和出众的天赋,成为了杰出的刺客大师,他不仅是个身手敏捷的武林高手,飞檐走壁擅长各种暗杀术。刺客组织在他的带领下,为被剥削的平民声张正义,赶跑了原本统治意大利的圣殿骑士首领-教皇亚历山大六世。在他的一生中,经历了无数次惊心动魄、扣人心弦的探险和刺杀。
曾经有一次,为了寻找Altair 留下的线索和装备,Ezio 在佛罗伦萨中的刺客墓穴进行探索。这个刺客墓穴中有许多密室,且任何两个密室之间只存在一条唯一的路径。这些密室里都有一个刺客标记,他可以启动或者关闭该刺客标记。为了打开储存着线索和装备的储藏室,Ezio 必须操作刺客标记来揭开古老的封印。要想解开这个封印,他需要通过改变某些刺客标记的启动情况,使得所有刺客标记与封印密码“看起来一样”。在这里,“看起来一样”
的定义是:存在一种“标记”密室与“密码”密室之间一一对应的关系,使得密室间的连接情况和启动情况相同(提示中有更详细解释)。幸运的是,在Ezio 来到刺客墓穴之前,在Da Vinci 的帮助下,Ezio 已经得知了打开储藏室所需要的密码。
而你的任务则是帮助Ezio 找出达成目标所需要最少的改动标记次数。

Input
第一行给出一个整数n,表示密室的个数。
第二行至第n 行,每行给出两个整数a 和b,表示第a 个密室和第b 个密室之间存在一条通道。
第n+1 行,给出n 个整数,分别表示当时每个密室的启动情况(0 表示关闭,1 表示启动)。
第n+2 行,给出n 个整数,分别表示密码中每个密室的启动情况。

Output
输出只有一行,即输出最少改动标记次数。

Sample Input
4
1 2
2 3
3 4
0 0 1 1
1 0 0 0

Sample Output
1

Data Constraint
对于30%的数据,n<=10。
对于60%的数据,n<=100。
对于100%的数据,n<=700,且每个密室至多与11 个密室相通。

Hint
样例解释:
密室的编号是可以变的!将第三个密室关闭后,在当前标记和密码之间,存在1->4,2->3,3->2,4->1 的对应关系,重新编号后连接情况没有改变,且标记与密码对应。对于更一般的情况,存在一个1 到n 的置换P,使得对于任意密室之间的道路u-v,都一定有密码密室中的道路P(u)-P(v);如果不存在密室之间的道路u-v,则一定没有密码密室中的道路P(u)-P(v)。

看到题面直接自闭,考后才看懂题目大意,思路尚不清晰,还在思考。


T3T3T3
逃考逃考

Description
高考又来了,对于不认真读书的来讲真不是个好消息。为了小杨能在家里认真读书,他的亲戚决定驻扎在他的家里监督他学习,有爷爷奶奶、外公外婆、大舅、大嫂、阿姨……
小杨实在是忍无可忍了,这种生活跟监狱有什么区别!为了他亲爱的小红,为了他的dota,他决定越狱!
假设小杨的家是个n*m 的矩阵,左下角坐标为(0,0),右上角坐标为(x1,y1)。小杨有n 个亲戚,驻扎在矩阵里(位置不同,且不在矩阵的边上)。小杨家里的每个地方都被亲戚监控着,而且只被距离最近的亲戚监控:
也就是说假设小杨所在的位置是(3,3),亲戚A 在(3,0),A 距离小杨距离是3;亲戚B 在(6,7),则B 距离小杨距离是5。距离A < 距离B,所以(3,3)位置由A 监控。
如果“最近距离”出现同时有几个亲戚,那么那个位置同时被那几个亲戚监控。
给出小杨的坐标(x0,y0)。因为被发现的人数越少,越狱成功的机会越大,所以小杨需要你设计一条越狱路线到达矩形的边上,且被发现的人数最少。
Ps:小杨做的方向是任意的,也就是说路线上的任意位置只需要是实数。
保证一开始小杨只被一个亲戚监控着。
.
Input
第一行,一个正整数t<=3,表示数据个数。
接下来t 个数据:
第一行n,表示小杨的亲戚个数。
接下来一行四个正整数,表示矩形右上角的坐标(x1,y1)和小杨的坐标(x0,y0)。
接下来n 行,每行两个正整数,代表一个亲戚的位置。

Output
每个数据输出一个正整数,表示小杨越狱被发现人数的最小值。

Sample Input
3
4
10 10 5 5
5 6
3 5
7 5
5 3
0
10 10 5 5
3
3 3 2 2
1 1
2 2
2 1

Sample Output
1
0
1

Data Constraint
前50%数据,n<=200;
其余数据n<=600。

Hint
样例解释:
第一个数据,小杨直接往上走,只被(5,6)监控过。
第二个数据,小杨被(7,7)监控,走到(9,9)被(7,11)监控,然后直接往上走。

这题虽然很难,但思路比较简单,起码比起第二问还比较能叫人接受。关键是有个知识点我还未掌握所以敲不出来,半平面交,由于几何的基础较薄弱,可能学起来需要较长时间,不过慢慢来,会把这题学会的。


前一天晚上学带旋Treap学得头有点昏,第二天直接爆16,不过感觉Treap应该是我学得最清楚的一个平衡树了,不过还得多找些题练练手,别生了。
今日二三题着实有点难,关键还是自己技能包不够强。
带我明日回家休养生息一天,回来再与你们大战800回合。

### 光流法C++源代码解析与应用 #### 光流法原理 光流法是一种在计算机视觉领域中用于追踪视频序列中运动物体的方法。它基于亮度变性假设,即场景中的点在时间上保持相同的灰度值,从而通过分析连续帧之间的像素变化来估计运动方向和速度。在数学上,光流场可以表示为像素位置和时间的一阶导数,即Ex、Ey(空间梯度)和Et(时间梯度),它们共同构成光流方程的基础。 #### C++实现细节 在给定的C++源代码片段中,`calculate`函数负责计算光流场。该函数接收一个图像缓冲区`buf`作为输入,并初始化了几个关键变量:`Ex`、`Ey`和`Et`分别代表沿x轴、y轴和时间轴的像素强度变化;`gray1`和`gray2`用于存储当前帧和前一帧的平均灰度值;`u`则表示计算出的光流矢量大小。 #### 图像处理流程 1. **初始化和预处理**:`memset`函数被用来清零`opticalflow`数组,它将保存计算出的光流数据。同时,`output`数组被填充为白色,这通常用于可视化结果。 2. **灰度计算**:对每一像素点进行处理,计算其灰度值。这里采用的是RGB通道平均值的计算方法,将每个像素的R、G、B值相加后除以3,得到一个近似灰度值。此步骤确保了计算过程的鲁棒性和效率。 3. **光流向量计算**:通过比较当前帧和前一帧的灰度值,计算出每个像素点的Ex、Ey和Et值。这里值得注意的是,光流向量的大小`u`是通过`Et`除以`sqrt(Ex^2 + Ey^2)`得到的,再乘以10进行量化处理,以减少计算复杂度。 4. **结果存储与阈值处理**:计算出的光流值被存储在`opticalflow`数组中。如果`u`的绝对值超过10,则认为该点存在显著运动,因此在`output`数组中将对应位置标记为黑色,形成运动区域的可视化效果。 5. **状态更新**:通过`memcpy`函数将当前帧复制到`prevframe`中,为下一次迭代做准备。 #### 扩展应用:Lukas-Kanade算法 除了上述基础的光流计算外,代码还提到了Lukas-Kanade算法的应用。这是一种更高级的光流计算方法,能够提供更精确的运动估计。在`ImgOpticalFlow`函数中,通过调用`cvCalcOpticalFlowLK`函数实现了这一算法,该函数接受前一帧和当前帧的灰度图,以及窗口大小等参数,返回像素级别的光流场信息。 在实际应用中,光流法常用于目标跟踪、运动检测、视频压缩等领域。通过深入理解和优化光流算法,可以进一步提升视频分析的准确性和实时性能。 光流法及其C++实现是计算机视觉领域的一个重要组成部分,通过对连续帧间像素变化的精细分析,能够有效捕捉和理解动态场景中的运动信息
微信小程序作为腾讯推出的一种轻型应用形式,因其便捷性与高效性,已广泛应用于日常生活中。以下为该平台的主要特性及配套资源说明: 特性方面: 操作便捷,即开即用:用户通过微信内搜索或扫描二维码即可直接使用,无需额外下载安装,减少了对手机存储空间的占用,也简化了使用流程。 多端兼容,统一开发:该平台支持在多种操作系统与设备上运行,开发者无需针对同平台进行重复适配,可在一个统一的环境中完成开发工作。 功能丰富,接口完善:平台提供了多样化的API接口,便于开发者实现如支付功能、用户身份验证及消息通知等多样化需求。 社交整合,传播高效:小程序深度嵌入微信生态,能有效利用社交关系链,促进用户之间的互动与传播。 开发成本低,周期短:相比传统应用程序,小程序的开发投入更少,开发周期更短,有助于企业快速实现产品上线。 资源内容: “微信小程序-项目源码-原生开发框架-含效果截图示例”这一资料包,提供了完整的项目源码,并基于原生开发方式构建,确保了代码的稳定性与可维护性。内容涵盖项目结构、页面设计、功能模块等关键部分,配有详细说明与注释,便于使用者迅速理解并掌握开发方法。此外,还附有多个实际运行效果的截图,帮助用户直观了解功能实现情况,评估其在实际应用中的表现与价值。该资源适用于前端开发人员、技术爱好者及希望拓展业务的机构,具有较高的参与使用价值。欢迎查阅,助力小程序开发实践。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值