题目传送门

题目大意

不想写了,直接看题面吧。

思路

被这个题搞自闭了,因为读错题目想一个非常恶心的东西想了一场考试,然后就删代码,然后就被骂了。哎。

需要注意的是:我们只能选一次雀头

于是,不难看出一个 \(\Theta(n^3)\) 的做法,可以枚举听哪张牌,选哪个雀头,然后我们判断的时候显然我们应该多选刻子,选不下去的时候就从后面的值选出连子,实际操作中直接减就行了。也可以看出来,从后往前贪心也是可以的。

来看 \(\Theta(n^2)\) 做法。不难发现每次听牌的时候贪心前面一部分都是不变的,如果从后往前贪心也是一样。因为我们如果听牌 \(a\),那么只有后面的牌会受到影响。如果我们假设分别贪到 \(l,r\) 就不可以再继续贪了,那么我们的雀头一定在 \([r-1,l]\) 中(可以看出,在合法情况下 \(r<l\))。于是,我们可以考虑 dp,我们设 \(f_{i,0/1}\) 表示从前往后贪心贪到第 \(i\) 个位置,第 \(i+1/i+2\) 需要减去的值是多少,同理,我们可以设 \(g_{i,0/1}\) 表示从后往前的贪心。考虑一个点是否可以被听,可以发现如果设 \(x=a_{i}-f_{i-1,0}-g_{i+2,1},y=a_{i+1}\),那么当 \(x,y\ge 0\) 并且 \(x,y\) 中任一为 \(2\) 另一个为 \(0\) 牌 \(i-1\) 就是可听的。

所以,时间复杂度就降到了 \(\Theta(n^2)\)。

\(\texttt{Code}\)

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define MAXN 5005 template <typename T> void read (T &x){char c = getchar ();x = 0;int f = 1;while (c < '0' || c > '9') f = (c == '-' ? -1 : 1),c = getchar ();while (c >= '0' && c <= '9') x = x * 10 + c - '0',c = getchar ();x *= f;}
template <typename T,typename ... Args> void read (T &x,Args& ... args){read (x),read (args...);}
template <typename T> void write (T x){if (x < 0) x = -x,putchar ('-');if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> void Mx (T &a,T b){a = max (a,b);}
template <typename T> void Mi (T &a,T b){a = min (a,b);} int n,k,a[MAXN],b[MAXN],dp1[MAXN][2],dp2[MAXN][2]; bool check (){
for (Int i = 1;i <= n;++ i) b[i] = a[i];
int posl = n - 1,posr = 2;//我无论如何怎么选雀头都必须对这两个点产生影响
for (Int i = 1;i <= n - 2;++ i){
b[i] -= dp1[i - 1][0];
if (b[i] < 0){
posl = i;
break;
}b[i] %= 3;
dp1[i][0] = dp1[i - 1][1] + b[i],dp1[i][1] = b[i];
}
for (Int i = 1;i <= n;++ i) b[i] = a[i];
for (Int i = n;i >= 3;-- i){
b[i] -= dp2[i + 1][0];
if (b[i] < 0){
posr = i;
break;
}b[i] %= 3;
dp2[i][0] = dp2[i + 1][1] + b[i],dp2[i][1] = b[i];
}
// cout << posl << " " << posr << endl;
for (Int i = posr - 1;i <= posl;++ i){
int x = a[i] - dp1[i - 1][0] - dp2[i + 2][1],y = a[i + 1] - dp1[i - 1][1] - dp2[i + 2][0];
if (x >= 0 && y >= 0)
if ((x % 3 == 0 && y % 3 == 2) || (x % 3 == 2 && y % 3 == 0))
return 1;
}
for (Int i = 1;i <= n;++ i) if (a[i] & 1) return 0;
return 1;
} signed main(){
read (n,k);
for (Int i = 1,val;i <= k;++ i) read (val),++ a[val];
vector <int> ans;
for (Int i = 1;i <= n;++ i){
++ a[i];
if (check ()) ans.push_back (i);
-- a[i];
}
write (ans.size()),putchar ('\n');
for (Int v : ans) write (v),putchar (' ');
return 0;
}

题解 P6454 麻将 加强版的更多相关文章

  1. 51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1158 1158 全是1的最大子矩阵  基准时间限制:1 秒 空 ...

  2. CSU - 1529 Equator —— DP 最大连续和子序列

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1529 题解: 一个加强版的最大连续和子序列,序列可以从末尾元素转到首元素. 分两种情 ...

  3. bzoj 1860: [Zjoi2006]Mahjong麻将 题解

    [原题] 1860: [Zjoi2006]Mahjong麻将 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 211  Solved: 122 [Subm ...

  4. 【题解】P3796【模板】AC自动机(加强版)

    [题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我 ...

  5. 题解[LuoguP6222]「P6156简单题」加强版

    题解[LuoguP6222]「P6156简单题」加强版 加强版很好地体现了这个题的真正价值.(当然是指卡常 本题解给出了本题更详尽的推倒导和思考过程,思路与 CYJian 的类似,具体式子的个别地方换 ...

  6. 题解 P1120 【小木棍 [数据加强版]】

    题面 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮 ...

  7. 洛谷 P2241统计方形(数据加强版) 题解

    题目传送门 说是加强版,其实可以把棋盘那道题的代码粘过来(注意要开long long): #include<bits/stdc++.h> using namespace std; ,c; ...

  8. 【题解】Luogu P5279 [ZJOI2019]麻将

    原题传送门 希望这题不会让你对麻将的热爱消失殆尽 我们珂以统计每种牌出现的次数,不需要统计是第几张牌 判一副牌能不能和,类似这道题 对于这题: 设\(f[i][j][k][0/1]\)表示前\(i\) ...

  9. GERALD07加强版题解

    题目描述: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 输入格式: 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来M行,代表图 ...

随机推荐

  1. LVS实现(VS/DR)负载均衡和Keepalived高可用

    LVS是Linux Virtual Server的简写即Linux虚拟服务器,是一个虚拟的服务器集群系统一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load ...

  2. uni-app中websocket的使用 断开重连、心跳机制

    前言 最近关于H5和APP的开发中使用到了webSocket,由于web/app有时候会出现网络不稳定或者服务端主动断开,这时候导致消息推送不了的情况,需要客户端进行重连.查阅资料后发现了一个心跳机制 ...

  3. Vs code添加自定义snippet

    Vs code添加自定义snippet(代码段) 前言 ​ 代码段能够帮助输入重复代码模式,在智能感知下可以帮我们快速补全代码,节省时间方便之余更利于代码格式的统一规范化. 1. Vs code代码段 ...

  4. vue页面跳转以及传参和取参

    vue中this.$router.push()路由传值和获取的两种常见方法 1.路由传值   this.$router.push() (1) 想要导航到不同的URL,使用router.push()方法 ...

  5. 大数据最后一公里——2021年五大开源数据可视化BI方案对比

    个人非常喜欢这种说法,最后一公里不是说目标全部达成,而是把整个路程从头到尾走了一遍. 大数据在经过前几年的野蛮生长以后,开始与数据中台的概念一同向着更实际的方向落地.有人问,数据可视化是不是等同于数据 ...

  6. call、apply、bind三者比较

    var obj={a:1}; var foo={ getA:function(item1,item2){ return this.a+item1+item2 } } // apply绑定参数为数组,一 ...

  7. [第四篇]——Windows Docker 安装之Spring Cloud直播商城 b2b2c电子商务技术总结

    Windows Docker 安装 Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境. Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境, ...

  8. 图论---DFS

    图论---DFS 1. 图的遍历 在理解DFS算法之前,我们首先需要对什么是遍历进行了解,遍历的概念就是:从某一个点出发(一般是首或尾),依次将数据结构中的每一个数据访问且只访问一遍. 2. DFS简 ...

  9. 洛谷P1583——魔法照片(结构体排序)

    https://www.luogu.org/problem/show?pid=1583#sub 题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人. ...

  10. Docker Command and Dockerfile

    镜像相关命令 # 下载镜像 docker pull xxx # 搜素镜像 docker search xxx # 查看已经下载了哪些镜像 docker images # 查看已下载镜像的id dock ...