[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 几何题 位运算 面试编程的更多相关文章

  1. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集   67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...

  2. LeetCode解题中位运算的运用

    位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...

  3. bzoj5108 [CodePlus2017]可做题 位运算dp+离散

    [CodePlus2017]可做题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 87  Solved: 63[Submit][Status][Dis ...

  4. [LeetCode]78. 子集(位运算;回溯法待做)

    题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   ...

  5. leetcode上的位运算

    136-只出现过一次的数字 思路:可以考虑到数字以二进制形式存储,当两个不同的数字异或的时候会是true,所以把数组里的数字都一一处理一遍就可以了. class Solution { public: ...

  6. [位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15

    NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest. ...

  7. Google Earth Engine 中的位运算

    Google Earth Engine中的位运算 按位运算是编程中一个难点,同时也是在我们后续处理影像数据,尤其要使用影像自带的波段比如QA波段经常会用到的一个东西.通过按位运算我们可以筛选出我们想要 ...

  8. 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集

    Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...

  9. LeetCode编程训练 - 位运算(Bit Manipulation)

    位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...

随机推荐

  1. 【整理】STL中的bitset(二进制华丽解决假五维偏序题)

    ------------更多Bitset的运用,请看这里http://www.cnblogs.com/hua-dong/p/8519739.html. 由于在学cdq分治,看到了这道题.先来看一道题目 ...

  2. 使用AspNetPager进行分页,查询条件丢失问题

    在Asp.Net中使用AspNetPager进行分页时,发现一个问题: 当通过查询条件进行查询后,对查询结果进行翻页操作时,查询条件会丢失. 当修改UrlPaging属性后(设置UrlPaging=“ ...

  3. Facebook的工程师文化——《打造facebook》读后感

    在今年北京的QCon大会上听了facebook早期中国籍工程师王淮的演讲,受益匪浅,主题是如何打造高效能团队,主要介绍他在facebook的一些经历和管理上的经验分享.现在的他是一名天使投资人,投资的 ...

  4. 银行卡号每隔4位插入空格 (再用户填写银行卡号的时候挺有用的) IE9+

    链接 输入4为数字, 再输入一个数字调试一下就能看懂了 <head lang="en"> <meta charset="UTF-8"> ...

  5. chrome 49 版本bug: flex父元素设置flex:1 , 子元素用height:100%无法充满父元素

    1 <div class="container"> <div class="item"> <div class="ite ...

  6. myeclipse web servelet调试输入的中文在TOMCAT服务器的命令行显示为????

    B 问题:myeclipse web servelet调试输入的中文在TOMCAT服务器的命令行显示为???? 解决:调整JSP页面编码:gb2312--->utf-8

  7. 用 PHPMailer 发送邮件

    REFs http://gohom.win/2015/07/02/PHPmailer/ http://blog.wpjam.com/m/phpmailer/ https://www.kancloud. ...

  8. 配置Yaf

    pecl里面的yaf最新测试版http://pecl.php.net/package/Yaf 安装pcre 要先安装pcre, Debian ubuntu执行 sudo apt-get install ...

  9. java 之DelayQueue,TaskDelayed,handlerFactory,dataChange消息配置.收发等.java spring事务处理TransactionTemplate

    java 之DelayQueue,TaskDelayed,handlerFactory,dataChange消息配置.收发等.java spring事务处理TransactionTemplate等. ...

  10. 开发中PG,PL,SE,PM都是什么意思

    注:参考连接:http://blog.csdn.net/ahutqi/article/details/42104361 项目最顶层是项目负责人,接下来项目会落实到pm(项目经理PM),项目经理将任务分 ...