http://codeforces.com/contest/734/problem/F

因为 x + y = (x & y) + (x | y)

有了这个公式后,然后应该手动模拟一下,把公式化简。一开始的时候知道有这个公式,但是自己却不动手。动手能力太差。思考能力太弱了。

如果你肯动手,这题是可以化简的,当然后面的还需要一些技巧来判断

b[i] + c[i] = (a[i] + a[j] )(1 <= j <= n)

这是根据我们的公式得来的。

所以b[i] + c[i] = n * a[i] + suma

然后对n个式子求和。(sumb + sumc - n * suma) / n = suma

所以就能得到suma = (sumb + sumc) / (2 * n)

所以就能每个每个算出a[i]

算完后,还要判断下a[i]是否合法。

比如

3

5

这样你算出来的是4,但是是不合法的

所以要检验下,检验的时候暴力是O(n * n),要技巧。

就是,比如

10110

01110

10111

01000

把a[i]都弄成二进制。

如果是 & 操作。

对于第一个数,就是b[1]

如果当前位是0,那什么都不用说了,不贡献,

如果是1,那么,记cnt[k]表示那一位有多少个,比如cnt[1] = 3

此时的贡献是cnt[1] * (1 << j)个。

|的操作类似,不过如果当前位是1,就要加上n * (1 << j),否则就和上面的差不多了。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string> const int maxn = + ;
int b[maxn];
int c[maxn];
int a[maxn];
int t[maxn];
int n;
bool dp[maxn][];
int cnt[];
bool check() {
for (int i = ; i <= n; ++i) {
for (int j = ; j <= ; ++j) {
dp[i][j] = a[i] & ( << j);
cnt[j] += dp[i][j];
}
}
for (int i = ; i <= n; ++i) {
int tb = ;
int tc = ;
for (int j = ; j <= ; ++j) {
if (dp[i][j]) {
tc += ( << j) * n;
} else {
tc += ( << j) * cnt[j];
}
if (dp[i][j] == ) continue;
tb += ( << j) * cnt[j];
}
if (tb != b[i] || tc != c[i]) {
return false;
}
}
return true;
}
void work() {
// printf("%d\n", 1 << 30);
cin >> n;
LL sum = ;
for (int i = ; i <= n; ++i) {
cin >> b[i];
sum += b[i];
}
for (int i = ; i <= n; ++i) {
cin >> c[i];
t[i] = b[i] + c[i];
sum += c[i];
}
if (sum % ( * n) != ) {
printf("-1\n");
return;
}
LL tsum = sum / ( * n);
for (int i = ; i <= n; ++i) {
if (t[i] - tsum < || (t[i] - tsum) % n != ) {
printf("-1\n");
return;
}
a[i] = (t[i] - tsum) / n;
}
if (!check()) {
cout << "-1" << endl;
return;
}
for (int i = ; i <= n; ++i) {
cout << a[i] << " ";
}
}
int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

最新文章

  1. Java 中的 Filter 过滤器详解
  2. Junity测试最大子数列和的Java程序
  3. 天气预报API(五):城市代码--“新编码”和“旧编码” 对比
  4. SQLProfiler_SQL抓包
  5. 实现LoaderCallbacks接口动态循环加载网上图片并展示在手机屏幕上 ...
  6. hdu3416 Marriage Match IV【最短路+最大流】
  7. .NET(C#):浅谈程序集清单资源和RESX资源
  8. Lak3 Counting(POJ No.2386)
  9. 横向、纵向时间轴timeline系列
  10. 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计
  11. JavaBean转JSON方式
  12. JavaScript 深入之从原型到原型链
  13. SpringBoot整合Mybatis之Annotation
  14. 【1】JVM-内存模型
  15. Python面向对象之成员修饰符
  16. Html页面Dom对象之Element
  17. 第7课 Qt中的坐标系统
  18. JQ+css3 导航栏到底部上移
  19. js对字符串进行加密和解密
  20. 实验一 MiniOS

热门文章

  1. Mysql性能优化笔记
  2. Deep Learning 31: 不同版本的keras,对同样的代码,得到不同结果的原因总结
  3. JSON与localStorage的爱恨情仇
  4. iOS开发中对于一些常用的相对路径(持续更新)
  5. [Android6.0][RK3399] 修改默认按键 KEY-PAD 的功能【转】
  6. 关于encodeURIComponent的用法
  7. I.MX6 AW-NB177NF WIFI 驱动移植问题
  8. 并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和
  9. 【POJ 2406】 Power Strings
  10. HNOI2008 GT考试 (KMP + 矩阵乘法)