[cf1290D]Coffee Varieties
思路
统计数的种类数,也等价于统计有多少个数满足其之前没有与其相同的数
将序列以$\frac{k}{2}$为块大小分块,那么即会有$m=\frac{2n}{k}$个块
(关于$k=1$的情况,以1为块大小分块即可,具体可以自行代入检验)
考虑$\forall 1\le i<j\le m$,将第$i$个块的数和第$j$个块中的数依次加入$S$中(然后清空),那么一个数有贡献当且仅当其每一次加入时$S$中都没有与其相同的数
另外,每一个块内部只要其被操作即会考虑,注意特判$m=1$时(此时必然是$n=k=1$)
考虑这样的询问次数,不难得到即为$k{m\choose 2}\approx\frac{2n^{2}}{k}$,显然无法通过
优化1
考虑优化,对于$1\le i<j<k\le m$,操作完第$i$个块和第$j$个块后可以不清空,直接操作第$j$个块和第$k$个块,这样只需要加入第$k$个块中的数即可,那么次数也即从$k$变为了$\frac{k}{2}$
具体的,可以看作一张$m$个点的单向完全图(即仅有$i<j$时满足$(i,j)\in E$),将所有的边划分为若干条链(不允许重复,重复不妨拆成两条链),最终询问次数即为$\frac{k}{2}{m\choose 2}+\frac{k}{2}$链数(长度非0)
关于如何划分,考虑枚举$d=j-i$,并将这类边按以下方式划分
$$
1-(d+1)-(2d+1)-...\\2-(d+2)-(2d+2)-...\\......\\d-2d-3d-...
$$
考虑链数,对$d$的值分类讨论:
1.若$d\le \frac{m}{2}$,显然只有$d$条链
2.若$d>\frac{m}{2}$,注意到若起点大于$m-d$,那么长度为0,因此也只有$m-d$条链
综上,链数即为$\sum_{d=1}^{\frac{m}{2}}d+\sum_{d=\frac{m}{2}+1}^{m}(m-d)=\frac{n^{2}}{k^{2}}$,代入可得询问次数约为$\frac{3n^{2}}{2k}$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2005
4 int n,m,k,ans,st[N],ed[N],vis[N];
5 char s[1];
6 void clear(){
7 printf("R\n");
8 fflush(stdout);
9 }
10 void add(int x){
11 printf("? %d\n",x);
12 fflush(stdout);
13 scanf("%s",s);
14 if (s[0]=='Y')vis[x]=1;
15 }
16 void write(int x){
17 printf("! %d\n",x);
18 fflush(stdout);
19 }
20 int main(){
21 scanf("%d%d",&n,&k);
22 k=max(k/2,1),m=n/k;
23 if (m==1){
24 write(1);
25 return 0;
26 }
27 for(int i=1;i<=m;i++)st[i]=(i-1)*k+1,ed[i]=i*k;
28 for(int i=1;i<=m/2;i++)
29 for(int j=1;j<=i;j++){
30 clear();
31 for(int k=j;k<=m;k+=i)
32 for(int l=st[k];l<=ed[k];l++)add(l);
33 }
34 for(int i=m/2+1;i<=m;i++)
35 for(int j=1;j<=m-i;j++){
36 clear();
37 for(int k=j;k<=m;k+=i)
38 for(int l=st[k];l<=ed[k];l++)add(l);
39 }
40 for(int i=1;i<=n;i++)
41 if (!vis[i])ans++;
42 write(ans);
43 return 0;
44 }
优化2
注意到长度$>\frac{m}{2}$的链至多只有1条,因此$\frac{3n^{2}}{2k}$基本已经达到了下限,还需要新的优化
具体的,考虑在查询时,如果当前数已经确定没有贡献,就不再加入
这样优化的意义并不仅仅是减少了这一次操作,而是整张图并不一定要是DAG,即使出现环也可以保证每一种数恰好产生一个贡献(即保留一个)
此时,图即变成了无向图(每一条边可以任意定向),将$m$个点的无向完全图划分为$\frac{m}{2}$条路径($m$为偶数)是一个经典的问题,具体方式即
$$
1-m-2-(m-1)-3-...-(\frac{m}{2}+1)\\2-1-3-m-4-...-(\frac{m}{2}+2)\\......\\\frac{m}{2}-(\frac{m}{2}-1)-(\frac{m}{2}+1)-(\frac{m}{2}-2)-(\frac{m}{2}+2)-...-m
$$
关于正确性,感性理解即将这$m$个点按$1,2,...,m$顺时针排列,每一次即将上一次的路径顺时针旋转一格,那么每一条边都恰好旋转了一圈,即遍历了逆时针方向该跨度的所有边
综上,链数即为$\frac{m}{2}$,代入可得询问次数为$\frac{n^{2}}{k}$($\frac{mk}{4}$恰和前者${m\choose 2}$估计为$m^{2}$的误差抵消),可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2005
4 int n,m,k,ans,st[N],ed[N],vis[N];
5 char s[1];
6 void clear(){
7 printf("R\n");
8 fflush(stdout);
9 }
10 void add(int x){
11 if (vis[x])return;
12 printf("? %d\n",x);
13 fflush(stdout);
14 scanf("%s",s);
15 if (s[0]=='Y')vis[x]=1;
16 }
17 void write(int x){
18 printf("! %d\n",x);
19 fflush(stdout);
20 }
21 int main(){
22 scanf("%d%d",&n,&k);
23 k=max(k/2,1),m=n/k;
24 if (m==1){
25 write(1);
26 return 0;
27 }
28 for(int i=1;i<=m;i++)st[i]=(i-1)*k+1,ed[i]=i*k;
29 for(int i=1;i<=m/2;i++){
30 clear();
31 int shift=0;
32 for(int j=1;j<=m;j++){
33 int pos=(i+shift+m-1)%m+1;
34 for(int k=st[pos];k<=ed[pos];k++)add(k);
35 if (j&1)shift++;
36 shift=-shift;
37 }
38 }
39 for(int i=1;i<=n;i++)
40 if (!vis[i])ans++;
41 write(ans);
42 return 0;
43 }
[cf1290D]Coffee Varieties的更多相关文章
- Codeforces Round #616 Coffee Varieties
题意 不太容易讲清,看英文吧 codeforces 做法 先从简单的看起 将块以\(\frac{k}{2}\)个元素为界,然后类似线段树一样递归下去,每次一层的左子树跟右子树的块相互暴力比较 \[\b ...
- Codeforces 1290D - Coffee Varieties(分块暴力+完全图的链覆盖)
Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 发现自己交互题烂得跟 s ...
- 支付宝WAP支付接口开发(Node/Coffee语言)
此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...
- nssm在windows服务器上部署nodejs,coffee启动方式
本想用forever / pm2 来部署nodejs, 百度后发现只能在Linux系统上使用,window上没法使用,兜一圈后又转nssm了.... 在Linux上,可以轻松的使用forever或者p ...
- Coffee Script 笔记 1
安装node 虽然官网提供了单文件bin的版本 但是并不知道怎么安装npm 于是乎还是得安装msi (坑 当使用 coffee -w -c . 监视文件改变 即时编译的时候会 提示 Error: T ...
- 【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
Drip Coffee
- HER COFFEE夜场代金券【1折】_北京美食团购_360团购导航
HER COFFEE夜场代金券[1折]_北京美食团购_360团购导航 HER COFFEE夜场代金券
- Coffee
Coffee 从接触Spring 到现在已经差不多2年多了,期间用它做过几个项目,从个人使用角度来说,Spring无疑是非常的成熟和方便的,但是知道怎么用,却不知道原理是码农和攻城师的区别,现在准备自 ...
- B. Karen and Coffee
B. Karen and Coffee time limit per test 2.5 seconds memory limit per test 512 megabytes input standa ...
随机推荐
- Java实现红黑树(平衡二叉树)
前言 在实现红黑树之前,我们先来了解一下符号表. 符号表的描述借鉴了Algorithms第四版,详情在:https://algs4.cs.princeton.edu/home/ 符号表有时候被称为字典 ...
- The Data Way Vol.1|风口下的开源市场:如何看待开源与商业的关系?
关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...
- SpringBoot-自动装配2
配置文件到底能写什么?怎么写? SpringBoot官方文档中有大量的配置,直接去记忆的话,好像不是我们程序员的行事风格! 分析自动配置原理 能自动配置的组件一般都有命名为下面规则的两个类: xxxx ...
- Jenkins 进阶篇 - 单元测试覆盖率
我们做项目开发,肯定免不了要写单元测试,不管是 Java 项目.Python 项目.PHP 项目,甚至是 nodejs 项目,都应该要写单元测试,本小节就来介绍单元测试的覆盖率报告输出和展示,在后面的 ...
- Go语言核心36讲(Go语言进阶技术二)--学习笔记
08 | container包中的那些容器 我们在上次讨论了数组和切片,当我们提到数组的时候,往往会想起链表.那么 Go 语言的链表是什么样的呢? Go 语言的链表实现在标准库的container/l ...
- C++ 类继承 笔记(初步)
本节内容源于对C++ primer第13章的学习,这本书把C++的原理将得明明白白.网上的博客往往讲得一头雾水.到头来还不如看原书本. 问题 首先给出一题: #include<stdio.h&g ...
- MyBatis的框架设计
1.MyBatis的框架设计 2.整体设计 2.1 总体流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信 ...
- Python中的sys.stdin和input、sys.stdout与print--附带讲解剑指offer42-连续子数组的最大和
2020秋招季,终于开始刷第一套真题了,整套试卷就一道编程题,还是剑指offer上的原题,结果答案死活不对,最后干脆直接提交答案算了,看了下别人的答案,原来是输入数据没有获取的原因,不过这个语法sys ...
- 【数学】快速傅里叶变换(FFT)
快速傅里叶变换(FFT) FFT 是之前学的,现在过了比较久的时间,终于打算在回顾的时候系统地整理一篇笔记,有写错的部分请指出来啊 qwq. 卷积 卷积.旋积或褶积(英语:Convolution)是通 ...
- OO第三次博客作业--第三单元总结
一.JML 语言的理论基础及应用工具链 JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段.通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver ...