A guess

题意

选一个\([1,n](n\le 500)\)的整数,可以询问数是否属于区间\([l,r]\),多次询问一起回答,统计有多少种询问区间集合(无序)满足可以猜出这个数,对\(p(2^{29}\le p<2^{30})\)取模


中文题解看不懂,看了一下午英文题解,还是感觉理解的不好,就按照现在的理解说一下吧(为啥这题是今天最简单的啊...

首先你写暴力的话有个结论

每个权值\(i\)都有过询问区间集合\(S_i\),\(S_i\)代表覆盖整个值的询问集合。如果有某两个值的询问集合是一样的,那么就猜不出来,否则一定可以猜出来。

考虑按照这个把每个权值编号\(a_i\),以最小表示法来编号,要求是若\(S_i=S_j\),那么有\(a_i=a_j\)

不必在乎这个怎么编号的,反正一定可以编出来,可以发现\(\{S\}\)对\(\{a\}\)是一个单射,于是我们转过去统计\(\{a\}\)的数量。

按照要求我们可以统计存在\(a_i=a_j\)的集合的数量,就是补集的数量。

如果对于一个集合,有一个\(a_i=a_j\),那么我们可以把\([i,j]\)区间内的给拿开统计,等价于把这个区间缩成一个点,点的权值为\(a_i\),把所有类似这样的区间都拿开的话,剩下的集合是没有重复元素的,也就是我们最终需要求得的答案,记为\(f_i\)

注意理解一下为什么缩掉区间构成的子问题是相同的。

然后我们需要得到把一个原来长度为\(L\)的问题缩到\(K\)的方案数,设为\(g_{L,K}\)

不妨先把有关\(f\)的转移写出来

\[f_i=2^{\binom{i+1}{2}}-\sum_{j=1}^{i-1}f_jg_{i,j}
\]

即全集减去所有可以缩掉的方案(可缩的话一定不合法)

然后再考虑如何计算\(g\)

按照一些常见组合意义的东西的递推的方法,我们应该枚举最后一个一个集合大小。

首先不产生一个新的可缩的即\(g_{i-1,j-1}\)对\(g_{i,j}\)的贡献

然后枚举产生的缩掉的区间的大小\(k\),在这个区间里的询问集合是随意的,即为全集

那么转移就为

\[g_{i,j}=g_{i-1,j-1}+\sum_{k=0}g_{i-k-2,j-1}2^{\binom{k+1}{2}}
\]

嗯,感觉还是没理解到本质的东西...

如果非要写一些思路的话

把拥有集合的性质通过编号转换到元素统计上去,这点和后缀自动机状态的构建好像有些相似,后缀自动机定义了每个子串的endpos集合,然后按照每个子串集合划分状态,进行统计。这种方法应该可以成为一种思路吧,这个题大概就是通过最小表示法编号。

然后我们统计数量时,真正涉及计算的时候要回到集合的意义上才能统计,比如这个题就是回到了区间内的集合是全集,才能统计的数量,也只有在这个地方可以简单的进行统计和计算了。


Code:

#include <cstdio>
const int N=510;
int n,mod,po[N*N],g[N][N],f[N],d[N];
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
#define mul(a,b) (1ll*a*b%mod)
int main()
{
scanf("%d%d",&n,&mod);
po[0]=1;for(int i=1;i<=n*n;i++) po[i]=mul(po[i-1],2);
for(int i=1;i<=n;i++) d[i]=i*(i+1)/2;
g[0][0]=1;
for(register int i=1;i<=n;i++)
for(register int j=1;j<=i;j++)
{
g[i][j]=g[i-1][j-1];
for(register int k=0;k<=i-2;k++)
g[i][j]=add(g[i][j],mul(g[i-k-2][j-1],po[d[k]]));
}
for(register int i=1;i<=n;i++)
{
f[i]=po[d[i]];
for(register int j=1;j<i;j++)
f[i]=add(f[i],mod-mul(f[j],g[i][j]));
}
printf("%d\n",f[n]);
return 0;
}

2019.1.8

A guess 解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  10. ACM: Just a Hook 解题报告 -线段树

    E - Just a Hook Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   D ...

随机推荐

  1. 配置yum,nc,telnet

    一.学习中问题 最近学习在学习Hadoop的一个子项目Zookeeper,在测试其中的“四字命令”---”echo ruok|nc localhost 2181“时发现命令无法被识别,如下图所示: [ ...

  2. Java 多线程(五)之 synchronized 的使用

    目录 1 线程安全 2 互斥锁 3 内置锁 synchronized 3.1 普通同步方法,锁是当前实例对象(this) 3.1.1 验证普通方法中的锁的对象是同一个. 3.1.2 验证不同的对象普通 ...

  3. .Net Core 分布式微服务框架介绍 - Jimu

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...

  4. 微信小程序在当前页面设置其他页面的数据

    如果其他页面用到的数据是 globalData, 那么直接在当前页面修改 globalData 数据即可. 如果其他页面用到的数据是 storage, 那么直接在当前页面修改 storage 数据即可 ...

  5. TimelineJS JSON 数据格式 - 译文 [原创]

    TimelineJS 是用于绘制时间轴的 Javascript 开源脚本,目前是 TimelineJS3 版.参阅 https://github.com/NUKnightLab/TimelineJS3 ...

  6. Nmap命令

    命令行:(显示扫描过程 -v ) 扫描单个主机 #nmap www.hostName.com 扫描整个ip段(子网) #nmap 192.168.1.1/24 //表示当前ip下的24位掩码主机都要扫 ...

  7. Spring学习总结之装配bean

    1.  XML中显式配置 规范,文件头: <?xml version=”1.0” encoding=”UTF-8”?>            <beans xmlns=http:// ...

  8. Linux内核分析作业 NO.4

    扒开系统调用的三层皮(上) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  9. 《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁

    20135311傅冬菁 分析Linux内核创建一个新进程的过程 一.学习内容 进程控制块——PCB  task_struct数据结构 PCB task_struct中包含: 进程状态.进程打开的文件. ...

  10. HTML5遇到的问题

    一.Uncaught SyntaxError: Unexpected identifier 解决办法: Uncaught SyntaxError: Unexpected identifier这个问题, ...