前天参加了这场比赛,当时记错时间了,差点晚了半个小时QAQ。

过程中一直卡在第一题,不过结果挺好的,做出了3个题,239名。

算是混了件T恤(然而信息没有填写完整,不知道还能不能搞得到)

这里就先把前三题的题解放在这里同大家分享。

三角魔法

题目链接

这道题简单来说,就是需要我们判断某个点是否在三角形内。题目给定我们三角形三个顶点的坐标以及一个待判断的点。

解决这个问题我们需要一些数学上的知识:叉积

我们设有向量:
a⃗=[x1y1z1]b⃗=[x2y2z2]\vec{a} = \begin{bmatrix} x_1\\y_1\\z_1 \end{bmatrix} \vec{b} = \begin{bmatrix} x_2\\y_2\\z_2 \end{bmatrix} a=⎣⎡​x1​y1​z1​​⎦⎤​b=⎣⎡​x2​y2​z2​​⎦⎤​
则他们的叉积为:
a⃗×b⃗=∣i⃗j⃗k⃗x1y1z1x2y2z2∣\vec{a}\times\vec{b} = \begin{vmatrix} \vec{i} &\vec{j} &\vec{k} \\ x_1& y_1 &z_1 \\ x_2& y_2 &z_2 \end{vmatrix} a×b=∣∣∣∣∣∣​ix1​x2​​j​y1​y2​​kz1​z2​​∣∣∣∣∣∣​
我们知道叉积结果是具有几何意义的,参考这一张图:

叉积的结果是一个向量,这个向量垂直于向量ab所在的平面,它的模就是a和b如上图围成的平行四边形的面积。

它的方向同ab满足右手螺旋法则即我们使用右手卷曲四指,四指先穿过a向量再穿过b向量,拇指指向即为结果向量的方向。

特殊的,在二维平面中,所有向量的竖坐标为零,则两个向量的叉积为:
a⃗×b⃗=∣i⃗j⃗k⃗x1y10x2y20∣=x1y2k⃗−x2y1k⃗=(x1y2−x2y1)k⃗\vec{a} \times\vec{b}=\begin{vmatrix} \vec{i}&\vec{j}&\vec{k}\\ x_1&y_1&0\\ x_2&y_2&0 \end{vmatrix} =x_1y_2\vec{k} - x_2y_1\vec{k} = (x_1y_2 - x_2y_1)\vec{k} a×b=∣∣∣∣∣∣​ix1​x2​​j​y1​y2​​k00​∣∣∣∣∣∣​=x1​y2​k−x2​y1​k=(x1​y2​−x2​y1​)k
依据这个式子我们根据(x1y2 - x2y1)的符号来判断向量的位置关系。

  • 当(x1y2 - x2y1) < 0时a在b的左侧
  • 当(x1y2 - x2y1) = 0时ab共线
  • 当(x1y2 - x2y1) > 0时a在b的右侧

有了这样的铺垫,这道题我们就可以解决了。

首先,我们将三角形的三边看作是三个首尾相接的向量,像这样:

接着,我们从每个顶点向带判断的点构造一个向量:

对于每个顶点,我们将以他为始点的两个向量做叉积,根据符号,我们可以判断该点在这条边的那一侧。

可以知道的是,如果该点在所有边向量的同一侧,即所有叉积的值符号相同,那么这个点就在三角形内。如果其中出现叉积为0,那么该点就在某条边上。

由于题目中说到,位于边上的点也算作三角内,

所以我们只需要检测三个叉积中非零的符号即可。

最后,需要注意一种情况(这种情况卡了我n久),就是三点共线且点在该线上。

这个时候三个叉积都是零,排除这个情况,剩下的使用叉积就可以完美解决了。

考虑到,最多可能有连续的两个叉积为0(在顶点处),所以我们可以循环五次,照顾到所有相邻的叉积(主要是第一个和最后一个)

(注意中间不要爆long)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;public class Solution1 {/*向量类*/class Vec{public long x;public long y;public Vec(long x,long y) {this.x = x;this.y = y;}/*向量叉积*/public long crossProduct(Vec v) {return x * v.y - y * v.x;}}public String castMagic(List<List<Integer>> triangle, int[] point) {// write your code hereVec[] vecTri = new Vec[3];Vec[] vecSig = new Vec[3];for(int i = 0;i < 3;i++) {vecTri[i] = new Vec((long)triangle.get((i + 1) % 3).get(0) - triangle.get(i).get(0),(long)triangle.get((i + 1) % 3).get(1) - triangle.get(i).get(1));vecSig[i] = new Vec((long)point[0] - triangle.get(i).get(0),(long)point[1] - triangle.get(i).get(1));}long flag = 0;for(int i = 0;i < 5;i++) {if(flag * vecTri[i % 3].crossProduct(vecSig[i % 3]) < 0) {return "No";}else {flag = sign(vecTri[i % 3].crossProduct(vecSig[i % 3]));}}if(vecTri[0].crossProduct(vecSig[0]) == 0 && vecTri[1].crossProduct(vecSig[1]) == 0 && vecTri[2].crossProduct(vecSig[2]) == 0)return "No";return "Yes";}/*符号判断*/private long sign(long a) {if(a == 0)return 0;return a > 0 ? 1 : -1;}
}

区间异或

题目链接

这个题目的主要难点在于快速的求出一个区间内的最大值和最小值。

使用线段树就可以解决这个问题啦。

纪念一下最后12分钟码完一棵线段树一A的神奇事件。最后一分钟一次提交通过是真的很爽!!

import java.util.List;public class Solution2 {class Node{public int l;public int r;public int max;public int min;public Node left;public Node right;}public int Intervalxor(int[] num, List<List<Integer>> ask) {Node root = new Node();create(num,1,num.length,root);int ans = 0;for(List<Integer> list : ask) {ans ^= getMax(root,list.get(0),list.get(1)) + getMin(root,list.get(2),list.get(3));}return ans;}private void create(int[] num, int l, int r,Node k) {// TODO Auto-generated method stubk.l = l;k.r = r;if(l == r) {k.max = num[l - 1];k.min = num[l - 1];return;}k.left = new Node();k.right = new Node();int mid = (l + r) >> 1;create(num,l,mid,k.left);create(num,mid + 1,r,k.right);k.max = Math.max(k.left.max, k.right.max);k.min = Math.min(k.left.min, k.right.min);}private int getMax(Node k,int l,int r) {if(k.l == l && k.r == r) {return k.max;}int mid = (k.l + k.r) >> 1;if(r <= mid)return getMax(k.left,l,r);else if(l > mid) return getMax(k.right,l,r);else return Math.max(getMax(k.left,l,mid), getMax(k.right,mid + 1,r));}private int getMin(Node k,int l,int r) {if(k.l == l && k.r == r) {return k.min;}int mid = (k.l + k.r) >> 1;if(r <= mid)return getMin(k.left,l,r);else if(l > mid) return getMin(k.right,l,r);else return Math.min(getMin(k.left,l,mid), getMin(k.right,mid + 1,r));}
}

五字回文

题目链接

这道题的难度不高,暴力枚举并验证即可。复杂度就是O(m)

需要注意的就是回文串需要时abcba型,即其中的前三个字符不能够相同。

import java.util.Scanner;public class Solution3 {public int Fivecharacterpalindrome(String s) {int ans = 0;for(int i = 0;i <= s.length() - 5;i++) {ans += check(s.substring(i, i + 5)) ? 1 : 0;}return ans;}private boolean check(String substring) {for(int i = 0;i < 2;i++) {if(substring.charAt(i) != substring.charAt(5 - i - 1)) {return false;}}return substring.charAt(0) != substring.charAt(1) && substring.charAt(0) != substring.charAt(2) && substring.charAt(1) != substring.charAt(2);}
}

阿里云超级码力第二场记录相关推荐

  1. 阿里云 超级码力在线编程大赛初赛 第2场 题目4. 小栖的金字塔(超级卡特兰数+除法求模/乘法逆元)

    文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683739284070 2. 解题 按道 ...

  2. 阿里云 超级码力在线编程大赛初赛 第1场(第245名)

    文章目录 1. 比赛结果 2. 题目 1. 树木规划 2. 正三角形拼接 3. 大楼间穿梭 4. 对称前后缀 1. 比赛结果 通过了 3 题,第245名,进入复赛了,收获 T恤 一件,哈哈. 2. 题 ...

  3. 阿里云 超级码力在线编程大赛初赛 第4场 题目3. from start to end

    文章目录 1. 题目 2. 解题 1. 题目 样例1: 输入: "abcd" "bcda" 输出: true样例2: 输入: "abcd" ...

  4. 阿里云 超级码力在线编程大赛初赛 第3场 题目2. 房屋染色(DP)

    文章目录 1. 题目 2. 解题 1. 题目 有n个房子在一列直线上,现在Bob需要给房屋染色,共有k种颜色. 每个房屋染不同的颜色费用也不同,Bob希望有一种染色方案使得相邻的房屋颜色不同. 但Bo ...

  5. 阿里云 超级码力在线编程大赛初赛 第3场 题目1. 最大公倍数

    文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15179470890799741/85251759933690467 2. 解题 看的 ...

  6. 阿里云 超级码力在线编程大赛初赛 第3场 题目4. 完美字符串

    文章目录 1. 题目 2. 解题 1. 题目 描述 定义若一个字符串的每个字符均为'1',则该字符串称为完美字符串. 给定一个只由'0'和'1'组成的字符串s和一个整数k. 你可以对字符串进行任意次以 ...

  7. 阿里云 超级码力在线编程大赛初赛 第2场 题目3. 五字回文

    文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683722506852 2. 解题 注意 ...

  8. 阿里云 超级码力在线编程大赛初赛 第2场 题目1. 三角魔法

    文章目录 1. 题目 2. 解题 1. 题目 题目来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683722506851 2. 解题 ...

  9. 超级码力在线编程大赛初赛第1场-1-树木规划题解

    目录 题目描述 示例 输入 输出 说明 分析 代码 动规 贪心 其他题目 题目描述 在一条直的马路上,有n棵树,每棵树有一个坐标,代表它们距离马路起点的距离. 如果每相邻的两棵树之间的间隔不小于d,那 ...

最新文章

  1. Node.js 究竟是什么?
  2. 查看平台内核信息脚本
  3. 如何利用线框图展示初期产品
  4. ML之多分类预测之PLiR:使用PLiR实现对六类label数据集进行多分类
  5. [CSS]BlendTrans滤镜
  6. 在Web服务器磁盘上缓存数据和HTML页面
  7. 超燃!支付宝技术双11纪录片《一心一役》全球独家首发
  8. RTT学习笔记4-线程同步
  9. RK3308(5)---编译根文件系统
  10. 开机加电到系统打开究竟发生了什么?(1)
  11. 长春去哪辅导高二理综好?高中生数理化培优补差辅导
  12. MSSQL · 实现分析 · SQL Server实现审计日志的方案探索
  13. hello world你知多少------300种编程语言中的hello world程序汇
  14. c语言火柴棒编辑,【NOIP2008】火柴棒等式
  15. poco mysql 登录_POCO数据库操作简介
  16. python 连通区域_opencv 查找连通区域 最大面积实例
  17. 软件工程第一次阅读作业
  18. 演唱会门票1秒钟就没了?没错,跟你竞争的不是人……
  19. 电脑桌面计算机怎么设置,电脑桌面日历怎么设置全透
  20. mcldownload文件夹_我的世界存档在哪个文件夹及导入存档的方法介绍

热门文章

  1. 响应式Web设计(四):响应式Web设计的优化
  2. 根据Email地址跳转到邮箱登录界面
  3. Scala入门-大数据云计算下的开发语言
  4. Unity的Animator的动画层(Layer)
  5. 罗赖马山(Mount Roraima)+天使瀑布(Angel Fall)
  6. 计算机os五大功能,美博客列Mac OS X Lion系统五大功能
  7. 鸿蒙强者排行榜,琉璃美人煞十大强者排名,腾蛇垫底,司凤第七,罗喉计都屈居第二...
  8. uva 11021 Tribbles 麻球繁衍 概率
  9. 全国计算机软件测试工程师,全国计算机等级考试软件测试工程师.doc
  10. 蓝牙助手android,蓝牙助手手机版