$CF809C\ Find\ a\ car$ 数位$dp$
正解:数位$dp$
解题报告:
然后因为没有翻译所以先放个翻译$QAQ$
有一个无穷大的矩阵,第$i$行第$j$列的数是$(i-1)\ xor\ (j-1)+1$,有$q$次询问,每次询问一个矩形内$(x_{1},y_{1})(x_{2},y_{2})$小于等于$k$的数的和
好像是考试题,,,?学长出的$QwQ$?
然后考虑怎么做趴$QwQ$,发现这个式子其实要拆成两个部分?一个是$\sum (i-1)\ xor\ (j-1)$,一个是$\sum 1$,所以考虑拆成两个部分?一个为和一个为方案数$QwQ$
其实和与方案数的求法差不多,,,我就以和为$eg$港下怎么做嗷$QwQ$
其实是类似普通的数位$dp$的,设$f_{i,0/1,0/1,0/1}$表示考虑到第$i$位,$x$是否到达上限,$y$是否到达上限,$x\ xor\ y$是否到达上限.这么解释着可能有点儿空,,,,详细解释下$QwQ$
$f_{i,p,q,r}$,$i$表示二进制拆分后从高位到低位考虑到$x\ xor\ y$的第$i$位了,$p$表示二进制拆分后行号$x$是否是顶着$x_{1}$/$x_{2}$的,$q$表示二进制拆分后列号$y$是否是顶着$y_{1}$/$y_{2}$的,$r$表示二进制拆分后$x\ xor\ y$的值是否是顶着$k$的,然后转移下就好.这样解释下大概就能$get$了?发现其实和普通的数位$dp$也差不多,只不过平常的数位$dp$是十进制分解,这里因为涉及二进制运算所以就二进制分解掉了$QwQ$
然后转移也和普通的数位$dp$差不多?就如果顶着上线继续转移,否则随便搞
$over$?
对了这题不用$dfs$,直接$for$循环那种转移简洁明了$w$
恩留一个坑,就其实题目最开始给定的是说$(x,y)$这个格子的值是$mex_{i=1,j=1}^{x-1,y-1}dat_{i,j}$,但是因为我并不会证为什么它就等于$(x-1)\ xor\ (y-1)$,,,所以咕了$QwQ$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define ri register int
#define rb register int
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int mod=1e9+,N=;
int K,f[N][][][],g[N][][][]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int solv(ri x,ri y)
{
memset(f,,sizeof(f));memset(g,,sizeof(g));f[][][][]=;if(x< || y<)return ;
my(i,,)
rp(p,,)
rp(q,,)
rp(r,,)
if(f[i+][p][q][r])
rp(j,,)
rp(k,,)
{
if(!p && j && !(x&(<<i)))continue;
if(!q && k && !(y&(<<i)))continue;
if(!r && (j^k) && !(K&(<<i)))continue;
ri tmpp=p,tmpq=q,tmpr=r;
if(!j && (x&(<<i)))tmpp|=;
if(!k && (y&(<<i)))tmpq|=;
if(!(j^k) && (K&(<<i)))tmpr|=;
(f[i][tmpp][tmpq][tmpr]+=f[i+][p][q][r])%=mod;
(g[i][tmpp][tmpq][tmpr]+=g[i+][p][q][r])%=mod;
if(j^k)(g[i][tmpp][tmpq][tmpr]+=1ll*(<<i)*f[i+][p][q][r]%mod)%=mod;
}
ri ret=;rp(i,,)rp(j,,)rp(k,,)(ret+=g[][i][j][k])%=mod,(ret+=f[][i][j][k])%=mod;return ret;
} main()
{
//freopen("809c.in","r",stdin);freopen("809c.out","w",stdout);
ri T=read();
while(T--)
{
ri x_1=read()-,y_1=read()-,x_2=read()-,y_2=read()-;K=read()-;
printf("%d\n",(solv(x_2,y_2)+solv(x_1-,y_1-)+mod+mod-solv(x_2,y_1-)-solv(x_1-,y_2))%mod);
}
return ;
}
随机推荐
- Node.js MVC模式+MongoDB实现学员管理系统
目录结构: 项目入口文件 /* Author:张波 */ /* 文件说明: 此文件是本项目的入口文件 启动这个项目,会先执行本文件中的代码 */ // 1. 引入模块 const http = req ...
- BUAA 169 电话费
http://oj55.bianchengla.com/problem/169/ 还有这个,不怎么好做,最后用栈做出来了. 感觉比较有用的一个数据是: 10 3 1010101010 代码如下: #i ...
- LocalDate、LocalDateTime与timestamp、Date的转换
LocalDate.LocalDateTime与timestamp.Date的转换 1.LocalDate转Date LocalDate nowLocalDate = LocalDate.now(); ...
- 2018-10-20-WPF-通过位处理合并图片
title author date CreateTime categories WPF 通过位处理合并图片 lindexi 2018-10-20 16:53:49 +0800 2018-10-20 1 ...
- H3C RARP
- Element-ui学习笔记3--Form表单(三)
InputNumber <el-input-number v-model="num" @change="handleChange" :min=" ...
- [WC2013]平面图——平面图点定位
[WC2013]平面图 码农题 平面图点定位: 1.平面图转对偶图:[HNOI2016]矿区 2.扫描线点定位 把所有的顶点和询问点排序,扫描线 每个边在fr的位置加入,to的位置删除,竖直直线不要 ...
- HDU 6438"Buy and Resell"(贪心+优先级队列)
传送门 •参考资料 [1]:HDU6438(优先队列+思维) •题意 有n个城市,第 i 天你会达到第 i 个城市: 在第 i 个城市中,你可以用 ai 元购买一个物品,或者用 ai 元卖掉一个物品, ...
- 【u232】围棋游戏
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 为了增强幼儿园小朋友的数数能力,小虎老师给了一个家庭游戏作业.让小虎那一块空的围棋盘,随机在一些方格中 ...
- echarts 图表自适应外部盒子大小
项目中用到了echarts,由于页面是自适应的,还得兼容移动, 因此图表还需要根据盒子的大小来变化. 自适应窗口及盒子大小 页面中有一个[放大.缩小]功能,及全屏展示和预览图表 窗口自适应 let m ...