参考博客:https://blog.csdn.net/u013534123/article/details/98877628#commentsedit

题目:


解题思路:


涉及到位运算,把A,B,C转化成二进制,记录每位上的值,最低位下标是1。

数位dp, 从高位开始处理,stax(sta1,sta2)有3种状态:0-还存在满足条件x的可能性,1-已经确定满足条件x,2-已经确定不满足条件x,lim1,lim2表示x,ypos位前面的位上的数有没有达到限制

剪枝+记忆化,注意返回值的判断条件,剩下的就和普通的数位dp差多了。

注意:题目要求x和y必须大于0,但是在数位dp的dfs里加大于0的判断稍微有点麻烦,可以在最后输出的时候处理一下。数位dp得到的结果是(0≤x≤A,0≤y≤B)对应的结果,应该减去(x=0,0≤y≤B)对应的结果,再减去(0≤x≤A,y=0)最后减去(x=0,y=0)的结果。(这里的字母符号和代码里的有点出入,莫事,小问题)

ac(?)代码:


没有账号,没法提交,枯了?

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[35][4][4][2][2], pow2[40], vala[40], valb[40];
int a[40], b[40], c[40];
int x, y, z;
int init()
{memset(dp, -1, sizeof dp);memset(a, 0, sizeof a);memset(b, 0, sizeof b);memset(c, 0, sizeof c);memset(vala, 0, sizeof vala);memset(valb, 0, sizeof valb);int X = x, Y = y, Z = z;int cnt1 = 0, cnt2 = 0, cnt3 = 0;while(X) a[++cnt1] = X&1, X >>= 1;while(Y) b[++cnt2] = Y&1, Y >>= 1;while(Z) c[++cnt3] = Z&1, Z >>= 1;int maxt = max(cnt1, max(cnt2, cnt3));for(int i = 1; i <= maxt; i++){for(int j = i; j >= 1; j--) // i-1{vala[i] = vala[i] << 1 | a[j];valb[i] = valb[i] << 1 | b[j];}}return maxt;
}
void get_pow2()
{pow2[0] = 1;for(int i = 1; i <= 32; i++)pow2[i] = pow2[i - 1] * 2;
}
ll dfs(int pos, int sta1, int sta2, bool lim1, bool lim2) //stax = 0 还可能存在满足条件x的情况,= 1,满足条件x, = 2, 不满足条件x(<成>这种)
{if(pos == 0) return sta1 == 1 || sta2 == 1; // 满足条件之一就返回1if(sta1 == 2 && sta2 == 2) return 0;if(sta1 == 1 || sta2 == 1){ll s1 = lim1 ? vala[pos] + 1 : pow2[pos]; // 如果pos前面的位上的数都已经达到了最大值ll s2 = lim2 ? valb[pos] + 1 : pow2[pos];return s1 * s2;}if(dp[pos][sta1][sta2][lim1][lim2] != -1) return dp[pos][sta1][sta2][lim1][lim2];int up1 = lim1 ? a[pos] : 1, up2 = lim2 ? b[pos] : 1;ll sum = 0;for(int i = 0; i <= up1; i++){for(int j = 0; j <= up2; j++){int v1 = i & j, v2 = i ^ j, sta11 = sta1, sta22 = sta2; // 应该v1 > C, v2 < C// 都不满足和至少有一个满足都处理了,只剩下00 ,02(20) 这种情况了if((v1 < c[pos] || sta1 == 2) && (v2 > c[pos] || sta2 == 2)) continue;if(sta1 == 0) // 上一位 x,y对应位上的值&后和z对应位上的值相同,还存在有解的可能性{if(v1 < c[pos]) sta11 = 2;else if(v1 > c[pos]) sta11 = 1;else sta11 = 0;}if(sta2 == 0){if(v2 > c[pos]) sta22 = 2;else if (v2 < c[pos]) sta22 = 1;else sta22 = 0;}//回溯时还要用到原来的值sum += dfs(pos - 1, sta11, sta22, lim1 && i == a[pos], lim2 && j == b[pos]);}}dp[pos][sta1][sta2][lim1][lim2] = sum;return sum;
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);get_pow2();int t;scanf("%d", &t);while(t--){scanf("%d %d %d", &x, &y, &z);int len = init();printf("%lld\n", dfs(len, 0, 0, true, true) - min(x, z - 1) - min(y, z - 1) - 1);}return 0;
}

【2019牛客多校第七场:H】Pair(数位dp)相关推荐

  1. 2019牛客多校 第七场 B Irreducible Polynomial 多项式因式分解判断

    链接:https://ac.nowcoder.com/acm/contest/887/B 来源:牛客网 Irreducible Polynomial 时间限制:C/C++ 1秒,其他语言2秒 空间限制 ...

  2. 2019牛客多校第七场 C Governing sand

    因为当时时间不怎么够就没写... 其实就是一个模拟题而已下面注释很清楚 链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 时间限制:C/C++ 3 ...

  3. 2019牛客多校训练营第一场 H题 HOR 题解

    题目描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...

  4. 2019牛客多校第七场E Find the median 权值线段树+离散化

    Find the median 题目链接: https://ac.nowcoder.com/acm/contest/887/E 题目描述 Let median of some array be the ...

  5. 2019牛客多校第七场 F Energy stones 树状数组+算贡献转化模拟

    Energy stones 题意 有n块石头,每块有初始能量E[i],每秒石头会增长能量L[i],石头的能量上限是C[i],现有m次时刻,每次会把[s[i],t[i]]的石头的能量吸干,问最后得到了多 ...

  6. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  7. 2019牛客多校训练营第一场 E题 ABBA 题解

    问题描述: 输入描述: 输出描述: 示例1: 题解: 更多问题可关注牛客竞赛区,一个刷题.比赛.分享的社区. 传送门:https://ac.nowcoder.com/acm/contest/discu ...

  8. 2019牛客多校第四场 B xor (线性基求交)

    xor 思路 题目是要求[l,r][l, r][l,r]的所有集合是否都可以得到xxx,那么显然我们可以对这[l,r][l, r][l,r]个线性基求交,然后再特判能否xxx能否插入,如果能插入,显然 ...

  9. 2019牛客多校第三场 F.Planting Trees

    题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...

  10. 2019 牛客多校第三场 B Crazy Binary String

    题目链接:https://ac.nowcoder.com/acm/contest/883/B 题目大意 给定一个长度为 N 的 01 字符串,输出最长子串和子序列的长度,满足其中 0 和 1 的个数相 ...

最新文章

  1. 通过PRINT过程制作报表
  2. Codeforces Round #304 C(Div. 2)(模拟)
  3. 到底什么是面向对象,面试中怎么回答。面向过程和面向对象的区别是什么。java跨平台特性以及java和C++的区别。面向对象的三大特性——封装、继承和多态。面向对象的高拓展性以及低耦合度怎么体现?
  4. Hi3516A开发--编译内核、uboot
  5. mysql myisam 主从_MySQL的主从复制Replication之MyIsam和InnoDB数据复制发布
  6. 线段树HDU1698(成段更新)
  7. PHP代码中的情话,php语言编程情话
  8. AtCoder Beginner Contest 081
  9. easyui日期控件datebox的onchange事件
  10. 解决织梦CMS友情链接的字数个数限制
  11. python与数据挖掘课后实验答案_数据仓库与数据挖掘课后习题答案
  12. IOS从零开始之_objective-c初探上
  13. Ubuntu下载与安装
  14. 【统计学习方法】第10章 隐马尔可夫模型
  15. JIRA6.3安装及alige插件破解
  16. Go语言结构体指针为nil时的小坑
  17. 高中计算机会考试题考哪些,高中会考考哪几科
  18. G-FAQ – Why is Bit Depth Important?
  19. 欢聚时代财报背后:海外征途的持久战
  20. 现存最古老青海撒拉族手抄本《古兰经》首次公开展览

热门文章

  1. 一个日志框架的开源,有些不错的创意。
  2. 蓝桥杯 BASIC-10 十进制转十六进制
  3. C/C++ 输入字符串gets( )、scanf( )、getline( )以及单个字符getchar( )
  4. feignclient url_Feign-自定义FeignClient
  5. 机虚拟磁盘附加到计算机上,Hyper-V 怎样拷贝文件至虚拟硬盘并附加到虚拟机上...
  6. yb3防爆电机型号含义_【产品信息】防爆充电机
  7. mit的java教材_关于学习MIT6.828操作系统课程lab1记录
  8. C#实战篇-基于OOP设计新体育彩票选号器
  9. python sqlserver 数据操作_python上手--python操作数据库
  10. IOS小工具以及精彩的博客