hdu 4768 异或运算

http://acm.hdu.edu.cn/showproblem.php?pid=4768

貌似非常多人是用的二分

可是更好的做法貌似还是异或

对于第k个人。假设他接到偶数个传单。那么异或的结果还是0

就是说op记录全部收到传单的人次的总的异或值。那么由于仅仅有一个是收到奇数次。所以异或值就是他的编号,至于收到几次,在O(n)能够计算

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;

#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const double pi = acos(-1.0);
const int INF = 100000000;
const int MAXN = 20010  +20;

int a[MAXN],b[MAXN],c[MAXN],n;

int main()
{
    while(~scanf("%d",&n)){
        int op=0,cnt=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&a[i],&b[i],&c[i]);
            for(int j=a[i];j<=b[i];j+=c[i])
                op^=j;
        }
        for(int i=0;i<n;i++){
            if(op>=a[i]  && op <=b[i] && (op-a[i])%c[i]==0)cnt++;
        }
        if(cnt%2==0)printf("DC Qiang is unhappy.\n");
        else printf("%d %d\n",op,cnt);
    }
    return 0;
}
时间: 2024-08-13 11:17:53

hdu 4768 异或运算的相关文章

HDU 5175 Misaki&#39;s Kiss again (异或运算,公式变形)

Misaki's Kiss again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 201    Accepted Submission(s): 57 Problem Description After the Ferries Wheel, many friends hope to receive the Misaki's kiss

HDU 5968 异或密码

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: center; font-family: 宋体; color: rgb(26,92,200); font-weight: bold; fo

异或运算的性质及用途

 1.两个数的交换  利用异或运算可以实习一种简单的不使用第三个数的交换方式, 代码如下所示: void swap(int a,int b) { a = a^b; b = a^b; a = a^b; }  原因是:异或运算是它本身的逆运算,故对于两个数或是布尔变量有如下性质: (a XOR b) XOR b = a 补充,异或运算的简单性质: 1. a ⊕ a = 0 2. a ⊕ b = b ⊕ a // 异或运算满足交换律 3. a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕

异或运算实现加密解密

异或运算中,如果某个字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x ,因此应用这个原理可以实现数据的加密解密功能. 异或运算在java中通常有两个比较常用的方法,一个是两个变量的互换(不借助第三个变量),一个便是数据的简单加密解密. 两个变量的互换 java运算中,如果要交换两变量的值,通常的做法就是借助第三个临时变量,然后完成操作. 如 public static void main(String[] args) { int[] arr =

网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.

本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 关于这个问题,网络上面有很多的解释,3种方法,我这里给比较一下各自的优缺点,然后简单分析一下汇编代码,分析代码如下: #include <stdio.h> void swap1(int &a,int &b) { int temp = a; a = b; b = temp; } void swap2(int &a,int &b) { a += b;

异或运算

将a与b的对应位进行异或运算,同为0或者同为1时,对应位结果为0:否则为1.

【Luogu】P1681最大正方形2(异或运算,DP)

题目链接 不得不说attack是个天才.读入使用异或运算,令que[i][j]^=(i^j)&1,于是原题目变成了求que数组的最大相同值. 然而我还是不理解为啥,而且就算简化成这样我也不会做. ai,我太菜了. f[i][j]表示考虑到i,j为止的最大值.当que[i][j]=que[i-1][j]=que[i][j-1]=que[i-1][j-1]的时候,f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1. #include<cstdi

FEC之异或运算应用

话说为啥FEC需要异或( ^/⊕ )操作呢? 异或:xor 异或运算规则: 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 异或运算特性: 1). a xor a = 0 2). a xor 0 = a 3). (a xor b) xor c = a xor (b xor c) 4). IF a xor b = c THEN a xor c = b    异或的运算特性有两点很好的应用 查找 case 1: 一个数组,除了其中一个元素,其他元素都为

bzoj4103【THUSC2015】异或运算

4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 359  Solved: 188 [Submit][Status][Discuss] Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor  yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij