leetcode 几何题 位运算 面试编程
[BZOJ][CQOI2014]数三角形
Description
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
Input
输入一行,包含两个空格分隔的正整数m和n。
Output
输出一个正整数,为所求三角形数量。
Sample Input
2 2
Sample Output
76
数据范围
1<=m,n<=1000
首先答案就是所有取出三个点的方案数减去会三点共线的方案数
显然n*m的网格上有(n+1)*(m+1)个整点,然后令t=(n+1)*(m+1),那么取三个点的方案数就是t*(t-1)*(t-2)/6(就是排列组合啦)
然后要考虑怎么算三点共线的方案数
然后有一个结论是在(a,b) (x,y)两点构成的线段上有gcd(a-x,b-y)-1个整点(a>x,b>y)
我们固定(a,b) (x,y)为共线的三点中左边两个,那么第三个点的方案数就是gcd(a-x,b-y)-1
但是这样枚举abxy的复杂度是O(n^2*m^2)
优化是把这线段平移到原点处,那么会发现其实只要枚举(0,0) (x-a+1,y-b+1),其他的线段平移就可以了(这里强烈建议自己动手画一画!)
画完很容易发现这样(0,0) (x-a+1,y-b+1)的线段可以平移出(n-i+1)*(m-j+1)种不同方案,在 (x-a+1,y-b+1)的时候如果不在坐标轴上还要算两次
#include<cstdio>
#define LL long long
int gcd[][];
int n,m;
LL t,ans;
inline int getgcd(int a,int b)
{
if (gcd[a][b])return gcd[a][b];
if (!a)return gcd[a][b]=b;
if (!b)return gcd[a][b]=a;
return gcd[a][b]=getgcd(b,a%b);
}
inline void calc()
{
for(int i=;i<=m;i++)gcd[][i]=i;
for(int i=;i<=n;i++)gcd[i][]=i;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
getgcd(i,j);
}
int main()
{
scanf("%d%d",&n,&m);
calc();
t=(n+)*(m+);
ans=t*(t-)*(t-)/;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (i||j)
{
if (!i||!j)ans-=(LL)(gcd[i][j]-)*(n-i+)*(m-j+);
else ans-=(LL)*(gcd[i][j]-)*(n-i+)*(m-j+);
}
printf("%lld",ans);
}
最多不重叠的非空区间xor=0
给出n个数字a_1, …., a_n,求最多有多少个不重叠的非空区间,使得每个区间内数字的异或(xor)都为0。
即找出最大的k,使得存在k个区间(l(i),r(i)),满足
1<=l(i)<=r(i)<=n (1<=i<=k), r(i)<l(i+1) (1<=i<k),且
a[l(i)] xor a[l(i)+1] xor …. xor a[r(i)] ==0 (1<=i<=k)
例如:
当输入为[3, 0, 2, 2]时,答案为2,存在2个区间[1] 和 [2, 2]满足;
当输入为[2, 2, 0, 2, 2]时,答案为3,[2, 2],[0] 和[2, 2]满足。
解题思路:首先要读懂题意,不重叠的区间,区间需要连续,某些数可以不选,划分为最多的区间,区间的所有的数异或结果为0。
然后我们解题的时候可以保存从头开始一直异或到当前位置i的值,如果后面位置j有出现异或的值和位置i的值一样的话,那么区间[i, j]就是一个异或结果为0的区间。
所以我们可以用一个set或者map更新一下。每重复出现一次就清空一下所有信息并且答案++,然后重新保存set或map。开始的时候要放一个map[0]为了考虑边界条件(也就是一开始就是0的情况)。
#include <iostream>
#include <map>
using namespace std; int main()
{
int n, x;
while(cin >> n)
{
map<int, bool> M;
int res = , ans = ;
M[]++;//M[0]=1
while(n--)
{
cin >> x;
res^=x;
if(M[res])//后面位置j有出现异或值和位置i的值一样
{
M.clear();
ans++;//每重复出现一次就清空一下所有信息并且答案++
}
M[res] = true;
} cout << ans << endl;
}
return ;
}
非均匀的概率生成器=>等概率
非均匀的概率生成器myRandom,能够不等概率的生成0 or 1
现在给定数值n,利用上述myRandom函数,等概率的生成1~n-1中的任意一个数值
public void get(){
int m=myRandom();
int n=myRandom();
while(1){
if(m==1&&n==0) return 1;
else if(m==0&&n==1) return 0;
}
}
public static void main(String[] args){
Scanner sca=new Scanner(System.in);
int n=sca.nextInt();
int i=0;
int num=0;
while(n%2=0){
n=n/2;
num++;
}
StringBuffer str=new StringBuffer();
int j=0;
while(j<num){
str.append(get()+"");
}
return Integer.parseInt(str.toString(),2);
}
n个[0,n)的数,求每个数的出现次数(不能开辟额外空间)
这里关键是看清楚题意,n个数,然后是左闭右开的区间,也就是说每个数都不会大于等于n,那么思路就来了:如果我们给一个索引i下的数不管加上多少个n,那么这个数a[i]对n取余的话,我们就能知道这个数原来是多少;另一方面,如果一个数出现一次,我们就在对应索引i位置下的数加上n,那么每个数对应索引位置上的数a[i]除以n的话,就是这个数出现的次数。这样就做到了没有开辟额外的空间。
leetcode 几何题 位运算 面试编程的更多相关文章
- C#LeetCode刷题-位运算
位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...
- LeetCode解题中位运算的运用
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
- bzoj5108 [CodePlus2017]可做题 位运算dp+离散
[CodePlus2017]可做题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 87 Solved: 63[Submit][Status][Dis ...
- [LeetCode]78. 子集(位运算;回溯法待做)
题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...
- leetcode上的位运算
136-只出现过一次的数字 思路:可以考虑到数字以二进制形式存储,当两个不同的数字异或的时候会是true,所以把数组里的数字都一一处理一遍就可以了. class Solution { public: ...
- [位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15
NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest. ...
- Google Earth Engine 中的位运算
Google Earth Engine中的位运算 按位运算是编程中一个难点,同时也是在我们后续处理影像数据,尤其要使用影像自带的波段比如QA波段经常会用到的一个东西.通过按位运算我们可以筛选出我们想要 ...
- 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集
Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...
- LeetCode编程训练 - 位运算(Bit Manipulation)
位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...
随机推荐
- Rails-Treasure chest3 嵌套表单; Ransack(3900✨)用于模糊查询, ranked-model(800🌟)自订列表顺序; PaperTrail(5000✨)跟踪model's data,auditing and versioning.
自订列表顺序, gem 'ranked-model' 多步骤表单 显示资料验证错误讯息 资料筛选和搜寻, gem 'ransack' (3900✨); 软删除和版本控制 数据汇出(csv), 自订列表 ...
- Page.TryUpdateModel 方法
使用来自值提供程序的值更新指定的模型实例. 使用来自值提供程序的值更新指定的模型实例. 命名空间: System.Web.UI程序集: System.Web(System.Web.dll 中) ...
- python 字符串、列表、字典相关内建方法
"""字符串相关内建方法""" # a = ["qwe", "name", "sex&qu ...
- 知识梳理——CSS篇
css引入方法 内嵌 <head> <meta charset="UTF-8"> <title>Document</title> & ...
- [转载]字符串匹配的KMP算法
作者: 阮一峰 日期: 2013年5月 1日 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另 ...
- Python自动化运维之路-01
python的主要应用 python的擅长领域 学python有没有前途?python的语言排名 语言选择 运维会了开发后可以干什么? python的最大优势就是什么都能做. 课程概述 毕业目标 周五 ...
- 彻底解决WP的TextBox中文字过长显示不出来的问题
文字如果过长的话在TextBox中会显示不完全,这个大家都知道了,后来有人做了ExTextblock增强控件,大部分文字是可以显示出来了,不过,在某些情况下还是会有显示不全的情况. 这个时候一个解决方 ...
- L205 EE
As an Electrical Engineer at P, you will: Design, build, and verify PCBAsCreate, modify, and update ...
- Alpha阶段敏捷冲刺---Day1
一.Daily Scrum Meeting照片 二.今天冲刺情况反馈 1.昨天已完成的工作 昨天我们组全体成员在五社区五号楼719召开了紧急会议,在会议上我们梳理了编写这个程序的所有流程,并且根 ...
- 基于tiny4412的u-boot移植(一)
作者信息 作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 平台介绍 开发环境:win7 64位 + VMware11 + Ubuntu14.04 64位 ...