文章目录

  • T3.五字回文
  • T2.区间异或
  • T1.三角魔法
  • T4.小栖的金字塔

T3.五字回文

class Solution {public:/*** @param s: The given string* @return: return the number of Five-character palindrome*/int Fivecharacterpalindrome(string &s) {// write your code hereint sz=s.size();string t;int ans=0;for(int i=0;i<sz-4;i++){t=s.substr(i,5);if(t[0]==t[4]&&t[1]==t[3]&&t[0]!=t[1]&&t[0]!=t[2]&&t[1]!=t1[2])ans++;}return ans;}
};

T2.区间异或

一开口就知道是老数据结构题了,经典的求区间最大值,数据结构用ST表或线段树均可。
(ST表的模板来自于这篇文章

const int N=5e4+10;
int x,y,k,a[N],lg[N],fmx[N][21],fmi[N][21];
vector<int>t;
class Solution {public:/*** @param num: array of num* @param ask: Interval pairs* @return: return the sum of xor*/int Intervalxor(vector<int> &num, vector<vector<int>> &ask) {// write your code hereint n=num.size();lg[0]=-1;for(int i=1;i<=n;i++){a[i]=num[i-1]; // 先把给出的num数组存到a数组中,方便下标从1开始fmx[i][0]=a[i];//从i开始的连续2^0个数的最大值就等于a[i]本身fmi[i][0]=a[i];lg[i]=lg[i/2]+1;//预处理log2(i),因为cmath库中自带的函数log2(x)速度较慢}for(int j=1;j<=20;j++)//O(nlogn)的预处理for(int i=1;i+(1<<j)-1<=n;i++)//i+2^j-1不能超过边界n{fmx[i][j]=max(fmx[i][j-1],fmx[i+(1<<(j-1))][j-1]);//把[i,i+2^j-1]分成左区间[i,i+2^(j-1)-1]和右区间[i+2^(j-1),i+2^j-1],取较大值fmi[i][j]=min(fmi[i][j-1],fmi[i+(1<<(j-1))][j-1]);}int q=ask.size();int ans=0;for(int i=0;i<q;i++){x=ask[i][0];y=ask[i][1];k=lg[y-x+1];//k为方程2^k<=y-x+1的解的最大值,即log2(y-x+1)向下取整int mx=max(fmx[x][k],fmx[y-(1<<k)+1][k]);x=ask[i][2];y=ask[i][3];k=lg[y-x+1];int mi=min(fmi[x][k],fmi[y-(1<<k)+1][k]);ans=ans^(mx+mi);}return ans;}
};

T1.三角魔法

计算几何的经典题,运用叉乘(向量积)来判断一个点P是否在三角形ABC内部。

(上图中i,j,k为x,y,z轴的单位向量)

简单介绍一下原理:叉乘a⃗×b⃗\vec{a}×\vec{b}a×b垂直于a⃗\vec{a}a和b⃗\vec{b}b组成的平面,根据a⃗×b⃗\vec{a}×\vec{b}a×b的正负,可得到a⃗\vec{a}a与b⃗\vec{b}b的相对位置关系。设三维空间中的平面向量a⃗=(x1,y1,0),b⃗=(x2,y2,0)\vec{a}=(x_1,y_1,0),\vec{b}=(x_2,y_2,0)a=(x1​,y1​,0),b=(x2​,y2​,0),那么a⃗×b⃗=(0,0,x1y2−x2y1)\vec{a}×\vec{b}=(0,0,x_1y_2-x_2y_1)a×b=(0,0,x1​y2​−x2​y1​),可用右手定则判断a⃗×b⃗\vec{a}×\vec{b}a×b的方向。若x1y2−x2y1>0x_1y_2-x_2y_1>0x1​y2​−x2​y1​>0,则b⃗\vec{b}b在a⃗\vec{a}a的左侧,从a⃗\vec{a}a到b⃗\vec{b}b是逆时针,如下图:

判断一个点P是否在三角形ABC内部,那么求t1=AB×AP,t2=AB×AC,若t1*t2>=0,说明P,C在AB的同一侧(t1*t2>0) 或者 P,C中至少有一个点在AB上(t1*t2=0);其他两种情况类似判断(P,A在BC的同一侧、P,B在CA的同一侧)。

注意还要判断三个点是否共线,共线就不能组成三角形了。

typedef long long ll;
class Solution {public:/*** @param triangle: Coordinates of three points* @param point: Xiaoqi's coordinates* @return: Judge whether you can cast magic*/bool istr(int x1,int y1,int x2,int y2,int x3,int y3) // 判断三点是否共线{ll a=(x3-x1)*(y2-y1);ll b=(x2-x1)*(y3-y1);return a!=b; // 不共线,三点可组成三角形}bool judge(int x1,int y1,int x2,int y2,int x3,int y3,int x,int y)// A(x1,y1) B(x2,y2) C(x3,y3) P(x,y)// AB=(x2-x1,y2-y1)// AC=(x3-x1,y3-y1)// BC=(x3-x2,y3-y2)// AP=(x-x1,y-y1)// BP=(x-x2,y-y2)// CP=(x-x3,y-y3)// 判断(x,y)是否在其他三点的内部{ll d=(y-y1)*(x2-x1)-(y2-y1)*(x-x1); // AB×APll q=(y3-y1)*(x2-x1)-(y2-y1)*(x3-x1); // AB×ACif(d*q<0) return false; // 两个叉积异号,说明P,C不在AB的同一侧,那么P在外部d=(y-y2)*(x3-x2)-(y3-y2)*(x-x2);  // BC×BPq=(y1-y2)*(x3-x2)-(y3-y2)*(x1-x2); // BC×BAif(d*q<0) return false; // 两个叉积异号,说明P,A不在BC的同一侧,那么P在外部d=(y-y3)*(x1-x3)-(y1-y3)*(x-x3); // CA×CPq=(y2-y3)*(x1-x3)-(y1-y3)*(x2-x3); // CA×CBif(d*q<0) return false; // 两个叉积异号,说明P,B不在CA的同一侧,那么P在外部return true;}string castMagic(vector<vector<int>> &triangle, vector<int> &point) {// write your code hereint ans1=istr(triangle[0][0],triangle[0][1],triangle[1][0],triangle[1][1],triangle[2][0],triangle[2][1]);int ans2=judge(triangle[0][0],triangle[0][1],triangle[1][0],triangle[1][1],triangle[2][0],triangle[2][1],point[0],point[1]);if(ans1&&ans2)return "Yes";else return "No";}
};

T4.小栖的金字塔

首先说明一下,这题是个固定的数列,前人已经研究出公式了,我只是在OEIS上查找这个数列…

用f(i)表示从左上角(1,1)到右下角(i,i)的方案数。
先写个打表代码,打表前10项,看看有没有规律。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10;
ll dp[N+10][N+10];
int main()
{ios::sync_with_stdio(false);for(int i=1;i<=N;i++){dp[i][1]=1;for(int j=2;j<=i;j++){dp[i][j]=dp[i][j-1]+dp[i-1][j-1];if(j!=i)dp[i][j]+=dp[i-1][j];}printf("i=%d dp[i][i]=%lld\n",i,dp[i][i]);}return 0;
}

得到前10项:
i=1 dp[i][i]=1
i=2 dp[i][i]=2
i=3 dp[i][i]=6
i=4 dp[i][i]=22
i=5 dp[i][i]=90
i=6 dp[i][i]=394
i=7 dp[i][i]=1806
i=8 dp[i][i]=8558
i=9 dp[i][i]=41586
i=10 dp[i][i]=206098

1, 2, 6, 22, 90, 394, 1806, 8558, 41586, 206098看起来确实没什么规律,去OEIS查一下,找到了题目要求的这个数列:http://oeis.org/A006318,Large Schröder numbers(大施罗德数)。

网页显示,Twice A001003 (except for the first term),也就是说,我们要求的大施罗德数是A001003这个数列中每个数的两倍(除了第一项)。

打开A001003这个数列:http://oeis.org/A001003,super-Catalan numbers or little Schroeder numbers(超级卡特兰数/小施罗德数)。找到求超级卡特兰数的公式:

D-finite with recurrence: (n+1) * a(n) = (6*n-3) * a(n-1) - (n-2) * a(n-2) if n>1. a(0) = a(1) = 1.

按上述公式O(n)递推求出超级卡特兰数,除了第一项(注意这里的第一项下标从0开始),大施罗德数 = 超级卡特兰数 * 2。

typedef long long ll;
const int N=1e7,mod=1e9+7;
ll f[N+10];
ll qpow(ll a,ll b)
{ll s=1;while(b){if(b&1)s=s*a%mod;a=a*a%mod;b/=2;}return s;
}
ll inv(ll a)
{return qpow(a,mod-2);
}
class Solution {public:/*** @param n: The number of pyramid levels n* @param k: Possible coordinates k* @return: Find the sum of the number of plans*/int pyramid(int n, vector<int> &k) {// write your code hereint sz=k.size();int ans=0;for(int i=0;i<=n;i++){if(i<=1)f[i]=1; // f[0]=f[1]=1;else f[i]=((6*i-3)*f[i-1]%mod-(i-2)*f[i-2]%mod+mod)%mod*inv(i+1)%mod;}for(int i=0;i<sz;i++){int pos=n-k[i];if(pos==0)ans=(ans+f[pos])%mod;else ans=(ans+f[pos]*2)%mod;}return ans;}
};

超级码力在线编程大赛初赛 第2场 T1-T4题解相关推荐

  1. 超级码力在线编程大赛初赛 第2场 1.三角魔法

    超级码力在线编程大赛初赛 第2场 1.三角魔法 题目链接 描述 小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 −1e9≤xi,yi≤1e9-1e9\l ...

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

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

  3. 超级码力在线编程大赛初赛 第3场 1.最大公倍数

    超级码力在线编程大赛初赛 第3场 1.最大公倍数 题目链接 描述 小栖有一个区间,他准备从中取三个数,他想知道如何取才能使得它们的最小公倍数最大 请直接告诉小栖最小公倍数是多少. 示例 输入: a = ...

  4. 超级码力在线编程大赛初赛 第2场 题解

    超级码力在线编程大赛初赛 第2场 题解 题目出的对退役老年选手很友好,拿个T恤跑路- 下面的题解仅代表个人观点,出了问题,概不负责. 比赛链接:https://tianchi.aliyun.com/o ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Twitter的应急预案、部署流程
  2. nginx 将请求全部指向到一个页面
  3. Linux 普通进程 后台进程 守护进程(转)
  4. 混沌图像---三翅鹰
  5. 音乐应用开发Android应用开发--MP3音乐播放器界面设计(2)
  6. php simpledateformat,Java中SimpleDateFormat的用法介绍(代码示例)
  7. 格瑞光电:智慧城市建设的引领者
  8. 28 数组中出现次数超过一半的数字
  9. 【特色团队采访】慌呀哩团队,用简洁算法达成高效协作
  10. python简单的爬取网页上的图片
  11. linux彻底卸载 mysql
  12. oracle财务系统名称,Oracle财务系统总账模块操作手册
  13. 二维vector初始化方法
  14. Android应用内设置多语言,可随系统语言改变而改变,也可设置app为固定语言不受系统语言影响
  15. 华为智慧屏V55升级鸿蒙2,华为智慧屏将作为第一批升级鸿蒙 OS 2.0 系统的终端产品...
  16. 数据产品新人的三大有毒问题,你犯了吗?
  17. 自动定时发送邮件的方法 —— 定时执行专家V6.8
  18. Vue 2.0/3.0
  19. vue el-table高度 height自适应
  20. 智能网联汽车成兵家必争之地,恒驰智能网联汽车亮点何在?

热门文章

  1. 2022-05-25 网工进阶(七)OSPF-影响邻居关系建立的因素、路由撤销、路由汇总、路由过滤、Silent-Interface、报文认证
  2. 小试DirectX游戏CPU优化
  3. 如何掌控自己的时间和生活 ---阿兰·拉金
  4. JAVA设计模式--结构型模式--代理模式
  5. 使用CSS中clip-path属性实现奥运五环
  6. OAuth认证原理与第三方登录
  7. 李建忠讲23种设计模式笔记-上
  8. CCF-集合竞价(开盘价定为买价,1e8*5000--long long)
  9. 10大Android手机杀毒软件
  10. java中private作用_java中private什么意思