首页 > 代码库 > hdu 4768 异或运算
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; }
hdu 4768 异或运算
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。