思路

统计数的种类数,也等价于统计有多少个数满足其之前没有与其相同的数

将序列以$\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的更多相关文章

  1. Codeforces Round #616 Coffee Varieties

    题意 不太容易讲清,看英文吧 codeforces 做法 先从简单的看起 将块以\(\frac{k}{2}\)个元素为界,然后类似线段树一样递归下去,每次一层的左子树跟右子树的块相互暴力比较 \[\b ...

  2. Codeforces 1290D - Coffee Varieties(分块暴力+完全图的链覆盖)

    Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 发现自己交互题烂得跟 s ...

  3. 支付宝WAP支付接口开发(Node/Coffee语言)

    此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...

  4. nssm在windows服务器上部署nodejs,coffee启动方式

    本想用forever / pm2 来部署nodejs, 百度后发现只能在Linux系统上使用,window上没法使用,兜一圈后又转nssm了.... 在Linux上,可以轻松的使用forever或者p ...

  5. Coffee Script 笔记 1

    安装node 虽然官网提供了单文件bin的版本 但是并不知道怎么安装npm 于是乎还是得安装msi  (坑 当使用 coffee -w -c . 监视文件改变 即时编译的时候会 提示 Error: T ...

  6. 【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴

    Drip Coffee

  7. HER COFFEE夜场代金券【1折】_北京美食团购_360团购导航

    HER COFFEE夜场代金券[1折]_北京美食团购_360团购导航 HER COFFEE夜场代金券

  8. Coffee

    Coffee 从接触Spring 到现在已经差不多2年多了,期间用它做过几个项目,从个人使用角度来说,Spring无疑是非常的成熟和方便的,但是知道怎么用,却不知道原理是码农和攻城师的区别,现在准备自 ...

  9. B. Karen and Coffee

    B. Karen and Coffee time limit per test 2.5 seconds memory limit per test 512 megabytes input standa ...

随机推荐

  1. Java集合——List,Set,Map总结笔记

    1. 集合 Collection 1.1 Java 集合框架 ​ ​ ​ ​ ​ ​ ​ ​ Java 集合框架位于 java.util 包中.Java 集合框架主要包括两种类型的容器,一种是集合(C ...

  2. mysql增删改查——条件查询+模糊查询

    条件查询一般是 = 等于 >大于 <小于 >=大于等于 <=小于等于 <>区间 between and区间 or并且 and或者 in包含 like模糊查询 实例, ...

  3. linux kill信号详解

    大家对kill -9 肯定非常熟悉,在工作中也经常用到.特别是你去重启tomcat时.可是多半看来,我们对-9的理解只是表面而已. 很少有人(包括我)认真的去了解一下 kill -n 这个n到底是什么 ...

  4. 题解 [NOI2019]弹跳

    题目传送门 题目大意 给出 \(n\) 做城市,每座城市都有横纵坐标 \(x,y\).现在给出 \(m\) 个限制 \(p,t,l,r,d,u\),表示从 \(p\) 城市出发,可以花费 \(t\) ...

  5. 洛谷4631 [APIO2018] Circle selection 选圆圈 (KD树)

    qwq纪念AC450 一开始想这个题想复杂了. 首先,正解的做法是比较麻烦的. qwqq 那么就不如来一点暴力的东西,看到平面上点的距离的题,不难想到\(KD-Tree\) 我们用类似平面最近点对那个 ...

  6. uoj22 外星人(dp)

    题目大意: 给定一个\(n\)个数的序列\(a\),给定一个\(x\),其中\(a\)数组可以进行顺序的调换,每一个\(a_i\)都能使$x=x \mod a_i \(, 求最后经过一系列计算后的\) ...

  7. SpringBoot入门07-Thymeleaf中显示ajax请求到的数据

    Thymeleaf中显示ajax请求所需依赖 <!--所需依赖--><dependency> <groupId>org.springframework.boot&l ...

  8. tcl概述

    tcl,全名tool command language,是一种通用的工具语言. 1)每个命令之间,通过换行符或者分号隔开: 2)tcl的每个命令包含一个或者多个单词,默认第一个单词表示命令,第二个单词 ...

  9. 浏览器有别_HTTP报文的回车换行

    本来以为浏览器HTTP报文的生成应该是完全一致的.但最近在做一个项目的时候,发现Safari和Chrome提交同一份表单,后端的处理结果不一致.看提交结果呢,是因为Safari多了个回车.由于原项目的 ...

  10. ByteCTF2021 double sqli

    double sqli easy sqli http://39.105.175.150:30001/?id=1 http://39.105.116.246:30001/?id=1 http://39. ...