Codeforces Round #833 (Div. 2)

D. ConstructOR

知识点:高位和对低位无影响

一开始以为和广州的M一样,是数位dp,后来发现只要找到一个就行

果然无论什么时候都要看清题目

这时候还是没有什么思路,然后就看了题解的提示:当a和b有奇数时,d为偶数一定不可以

那显然这个结论可以继续推广,比较a,b,d的二进制后导0的大小即可

当a,b,d都截去d的后导0时,此时d为奇数

那么我们可以再次应用高位计算不会对低位产生影响这个条件

直接观察 \(a|b\) 如果当前第 \(i\) 位的 \(ans\) 与 \(a|b\) 不同时,

在这一位上加上 \(d<<i\) 即可对 \(ans\) 的第 \(i\) 位取反

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,l,r) for(int i=l;i<=r;i++) ll a, b, d; void solve()
{
cin >> a >> b >> d;
int w = __builtin_ctz(d);
if ((a & ((1 << w) - 1)) || (b & ((1 << w) - 1)))
{
cout << -1 << endl;
return;
}
a |= b;
a >>= w;
d >>= w;
ll ans(0);
for (int i = 0; (1ll << i) <= a; i++)
if ((ans ^ a) & (1 << i)) ans += d << i;
cout << (ans << w) << endl;
} int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
cin >> T;
rep(i, 1, T) solve();
}

E. Yet Another Array Counting Problem

知识点:笛卡尔树上dp

看的大佬的题解,已经说的很清楚了,我就不献丑了

属实没想到能把题面这么转化,涨见识了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pii pair<int,int>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
template<class T> using vc = vector<T>; const ll mod = 1e9 + 7; void solve()
{
int n, m;
cin >> n >> m;
vc<array<int, 2>> h(n + 1);
rep(i, 1, n) h[i][0] = h[i][1] = -1;
vc<int> a(n + 1);
rep(i, 1, n) cin >> a[i]; int sz = (int)log2(1.0 * n);
vc<vc<pii>> f(n + 1, vc<pii>(sz + 1));
rep(i, 1, n) f[i][0] = {a[i], i};
rep(j, 1, sz) for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
pii a = f[i][j - 1];
pii b = f[i + (1 << (j - 1))][j - 1];
if (a.fi >= b.fi) f[i][j] = a;
else f[i][j] = b;
} auto RMQ = [&](int l, int r)
{
int k = (int)log2(1.0 * r - l + 1);
pii a = f[l][k];
pii b = f[r - (1 << k) + 1][k];
if (a.fi >= b.fi) return a.se;
return b.se;
}; int rt = RMQ(1, n);
function<void(int, int, int)> build = [&](int rt, int l, int r)
{
if (l < rt)
{
int ls = RMQ(l, rt - 1);
h[rt][0] = ls;
build(ls, l, rt - 1);
}
if (r > rt)
{
int rs = RMQ(rt + 1, r);
h[rt][1] = rs;
build(rs, rt + 1, r);
}
};
build(rt, 1, n); vc<vc<ll>> dp(n + 1, vc<ll>(m + 1)); function<void(int)> dfs = [&](int rt)
{
int ls = h[rt][0], rs = h[rt][1];
if (ls == -1 && rs == -1) rep(i, 1, m) dp[rt][i] = 1;
else if (rs == -1)
{
dfs(ls);
rep(i, 1, m - 1)
dp[rt][i + 1] = (dp[ls][i] + dp[rt][i]) % mod;
}
else if (ls == -1)
{
dfs(rs);
rep(i, 1, m)
dp[rt][i] = (dp[rs][i] + dp[rt][i - 1]) % mod;
}
else
{
dfs(ls), dfs(rs);
rep(i, 1, m)
{
dp[ls][i] = (dp[ls][i] + dp[ls][i - 1]) % mod;
dp[rs][i] = (dp[rs][i] + dp[rs][i - 1]) % mod;
}
rep(i, 1, m)
{
dp[rt][i] = (dp[rt][i - 1] + (dp[rs][i] - dp[rs][i - 1]) * dp[ls][i - 1]) % mod;
dp[rt][i] = (dp[rt][i] + dp[rs][i - 1] * (dp[ls][i - 1] - (i > 1 ? dp[ls][i - 2] : 0))) % mod;
}
}
}; dfs(rt); ll ans(0);
rep(i, 1, m) ans = (ans + dp[rt][i]) % mod;
if (ans < 0) ans += mod;
cout << ans << endl;
} int main()
{
ios::sync_with_stdio(0), cin.tie(0);
int T; cin >> T;
rep(i, 1, T) solve();
return 0;
}

Codeforces Round #833 (Div. 2)补题的更多相关文章

  1. Codeforces Round #412 Div. 2 补题 D. Dynamic Problem Scoring

    D. Dynamic Problem Scoring time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  2. Codeforces Round #585 (Div. 2) [补题]

    前言 2019.9.16 昨天下午就看了看D题,没有写对,因为要补作业,快点下机了,这周争取把题补完. 2019.9.17 这篇文章或者其他文章难免有错别字不被察觉,请读者还是要根据意思来读,不要纠结 ...

  3. Codeforces Round #786 (Div. 3) 补题记录

    小结: A,B,F 切,C 没写 1ll 对照样例才发现,E,G 对照样例过,D 对照样例+看了其他人代码(主要急于看后面的题,能调出来的但偷懒了. CF1674A Number Transforma ...

  4. Codeforces Round #429 (Div. 2) 补题

    A. Generous Kefa 题意:n个气球分给k个人,问每个人能否拿到的气球都不一样 解法:显然当某种气球的个数大于K的话,就GG了. #include <bits/stdc++.h> ...

  5. Codeforces Round #419 (Div. 1) 补题 CF 815 A-E

    A-C传送门 D Karen and Cards 技巧性很强的一道二分优化题 题意很简单 给定n个三元组,和三个维度的上限,问存在多少三元组,使得对于给定的n个三元组中的每一个,必有两个维度严格小于. ...

  6. Codeforces Round #590 (Div. 3)补题

    要想上2000分,先刷几百道2000+的题再说 ---某神 题目 E F 赛时是否尝试 × × tag math bitmask 难度 2000 2400 状态 ∅ √ 解 E 待定 F 传送门 第一 ...

  7. Codeforces Round #574 (Div. 2)补题

    A. Drinks Choosing 统计每种酒有多少人偏爱他们. ki 为每种酒的偏爱人数. 输出ans = (n + 1)/2 >  Σki / 2 ? (n + 1)/2 - Σki / ...

  8. Codeforces Round #615 (Div. 3) 补题记录

    第一次搞CF,结果惨不忍睹...还是太菜了 A:要用到全部的钱,所以总数必须是3的倍数,而且初始状态下任意一人的钱数不能超过总数除以3,否则没法分了 (也就这个签到算是在我能力范围之内了....) # ...

  9. Codeforces Round #617 (Div. 3) 补题记录

    1296A - Array with Odd Sum 题意:可以改变数组中的一个数的值成另外一个数组中的数,问能不能使数组的和是个奇数 思路:签到,如果本来数组的和就是个奇数,那就OK 如果不是,就需 ...

随机推荐

  1. day33-线程基础03

    线程基础03 6.用户线程和守护线程 用户线程:也叫工作线程,当线程的任务执行完或者通知方法结束.平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程 守护线程(Daem ...

  2. gin如何多次shoubind一个请求参数

    gin多次绑定请求参数 package main import ( "fmt" "net/http" "time" "github ...

  3. (一)JPA的快速入门

    JPA简介 JPA是什么 JPA 是Java Persistence API的缩写,是一套由Java官方制定的ORM标准.当制定这套标准以后,市场上就出现很多JPA框架.如:OpenJPA(apach ...

  4. Containerd和Docker的关系

    联系 容器运行时(Container Runtime)是Kubernetes(k8s)最重要的组件之一,负责管理镜像和容器的生命周期.Kubelet通过Container Runtime Interf ...

  5. vivo 公司 Kubernetes 集群 Ingress 网关实践

    文章转载自:https://mp.weixin.qq.com/s/qPqrJ3un1peeWgG9xO2m-Q 背景 vivo 人工智能计算平台小组从 2018 年底开始建设 AI 计算平台至今,已经 ...

  6. 中国数字化是怎么转型成新范式TOP 50的?

    我不大认可"中国数字化转型成新范式TOP 50"的,确切的说,照着"中国数字化转型新范式TOP 50"做转型,大概率失败,对中国企业数字化转型的帮助甚微 ,尤其 ...

  7. KNN算法介绍及源码实现

    一.KNN算法介绍 邻近算法,或者说K最邻近(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它 ...

  8. 自己动手写ls命令——Java版

    自己动手写ls命令--Java版 介绍 在前面的文章Linux命令系列之ls--原来最简单的ls这么复杂当中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代码自己实现ls ...

  9. 洛谷 P5607 [Ynoi2013] 无力回天 NOI2017

    人生第一道Ynoi,开心 Description https://www.luogu.com.cn/problem/P5607 Solution 拿到这个题,看了一下,发现询问要求最大异或和,怎么办? ...

  10. HTTP缺点有哪些,如何解决

    前言 大家好,我是蜗牛,在上一篇中,我们介绍了不同版本的HTTP区别和发展背景,这篇文章我们来聊聊HTTP的缺点,HTTP缺点大致总结有以下三点: 通信使用明文(不加密),内容可能会被窃听. 不验证通 ...