2019 TCO Round 1B——[ 状压DP ]
第一题是 EllysSki 。
题意:给n个数,求两个方向的最长递减区间。
可以O(n)。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int Mx(int a,int b){return a>b?a:b;} class EllysSki{
public:
int getMax(vector <int> height);
}; int EllysSki::getMax(vector <int> height)
{
int n=height.size(),ans=;
for(int i=;i<n;i++)
{
int j=i;
while(j+<n&&height[j+]<=height[j])
j++;
ans=Mx(ans,j-i+); i=j;
}
for(int i=n-;i>=;i--)
{
int j=i;
while(j&&height[j-]<=height[j])
j--;
ans=Mx(ans,i-j+); i=j;
}
return ans;
}
第二题是 EllysTeleport 。
题意:连边,找最长链。
自己写了tarjan,没调出来。其实 n2 暴力也行。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
const int N=1e4+;
int n,h[N],to[N]; bool vis[N];
class EllysTeleport{
int fnd(int x)
{
int l=,r=n,ret=;
while(l<=r)
{
int mid=l+r>>;
if(h[mid]<=x)ret=mid,l=mid+;
else r=mid-;
}
return ret;
}
public:
int getMax(int N, int H1, int A, int B, int P, int Q, int M)
{
n=N; h[]=H1;
for(int i=;i<=n;i++)
h[i]=((ll)h[i-]*A+B)%M;
sort(h+,h+n+);
for(int i=;i<=n;i++)
{
int d=((ll)h[i]*P+Q)%M;
to[i]=fnd(d);
}
int ans=;
for(int i=;i<=n;i++)
{
memset(vis,,sizeof vis);
int cnt=,cr=to[i]; vis[i]=;
while(cr&&!vis[cr])
{
cnt++;vis[cr]=;cr=to[cr];
}
ans=Mx(ans,cnt);
}
return ans;
}
};
第三题是 EllysPearls 。
题意:n(<=50) 个球排成一排,每个球是 m(<=15) 种颜色之一。一次操作可以拿出序列中任意一个球,再插进序列的任意一个位置。求最少操作次数使得相同颜色的球是一个区间。
题解:https://www.topcoder.com/blog/2019-topcoder-open-algorithm-round-1b-editorials/
颜色只有 15 ,考虑状压。 1 表示该颜色之前已经确定了一个位置,即当前球必须取出、融入之前自己颜色的区间。
特殊情况就是当前球不动,就能合法;所以再记目前最后的颜色是什么(可以是空)。
还可能遇到当前球,但是把它放在后面,即尚不确定当前颜色。发现这种情况和“融入之前自己颜色的区间”都是要花费1的代价,并且不改变状压的状态。
所以 dp[ i ][ j ][ s ] 表示前 i 个、末尾颜色是 j 、已经确定位置的颜色集合是 s ,即可转移。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=,K=,M=(<<)+;
int n,m,a[N],bin[K],dp[][K][M];
class EllysPearls{
void cz(int &x,int y){if(y<x)x=y;}
public:
int getMin(int tN, int tM, vector <int> pearls)
{
n=tN; m=tM; for(int i=;i<n;i++)a[i+]=pearls[i];
bin[]=;for(int i=;i<=m;i++)bin[i]=bin[i-]<<;
memset(dp[],0x3f,sizeof dp[]);
dp[][][]=; bool u=,v=;
for(int i=;i<=n;i++,swap(u,v))
{
memset(dp[v],0x3f,sizeof dp[v]);
for(int j=;j<=m;j++)
for(int s=;s<bin[m];s++)//[m]not[n]
{
int tp=dp[u][j][s]; if(tp>N)continue;
int d=bin[a[i]-];
cz(dp[v][j][s],tp+);
if(!j||j==a[i])
cz(dp[v][a[i]][s|d],tp);
if(!(s&d))
cz(dp[v][a[i]][s|d],tp);
}
}
int ans=N;
for(int j=;j<=m;j++)
for(int s=;s<bin[m];s++)
cz(ans,dp[u][j][s]);
return ans;
}
};
2019 TCO Round 1B——[ 状压DP ]的更多相关文章
- MMM 状压dp学习记
状压dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...
- [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...
- Codeforces Round #363 LRU(概率 状压DP)
状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp
题目链接: 题目 D. Kefa and Dishes time limit per test:2 seconds memory limit per test:256 megabytes 问题描述 W ...
- 状压dp Codeforces Beta Round #8 C
http://codeforces.com/contest/8/problem/C 题目大意:给你一个坐标系,给你一个人的目前的坐标(该坐标也是垃圾桶的坐标),再给你n个垃圾的坐标,这个人要捡完所有的 ...
- Educational Codeforces Round 13 E. Another Sith Tournament 状压dp
E. Another Sith Tournament 题目连接: http://www.codeforces.com/contest/678/problem/E Description The rul ...
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)
http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...
- Codeforces Beta Round #8 C. Looking for Order 状压dp
题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...
- 【loj6177】「美团 CodeM 初赛 Round B」送外卖2 Floyd+状压dp
题目描述 一张$n$个点$m$条边的有向图,通过每条边需要消耗时间,初始为$0$时刻,可以在某个点停留.有$q$个任务,每个任务要求在$l_i$或以后时刻到$s_i$接受任务,并在$r_i$或以前时刻 ...
随机推荐
- 使用kindeditor直接粘贴本地图片或者是qq截图
我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...
- luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元
求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$ 考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$ $\Rightarrow \sum_{i ...
- Pangu and Stones HihoCoder - 1636 区间DP
Pangu and Stones HihoCoder - 1636 题意 给你\(n\)堆石子,每次只能合成\(x\)堆石子\((x\in[L, R])\),问把所有石子合成一堆的最小花费. 思路 和 ...
- Spring通知类型及使用ProxyFactoryBean创建AOP代理
Spring 通知类型 通过前面的学习可以知道,通知(Advice)其实就是对目标切入点进行增强的内容,Spring AOP 为通知(Advice)提供了 org.aopalliance.aop.Ad ...
- Workflow:Workflow 百科
ylbtech-Workflow:Workflow 百科 工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”.是对工作流程及其各操作步骤之间业务规则的抽象.概括描述.在计 ...
- Git 提交的正确姿势
Git 提交的正确姿势:Commit message 编写指南 SCOP范围 middleware core config plugin test type范围 Git 每次提交代码,都要写 Comm ...
- LeetCode 实现 Trie (前缀树)
题目链接:https://leetcode-cn.com/problems/implement-trie-prefix-tree/ 题目大意: 略. 分析: 字典树模板. 代码如下: class Tr ...
- eclipse搭建jmeter编译环境(Jmeter二次开发)
jmeter是开源项目,方便大家对代码进行改动. 写了一个简单教程,帮助入门者进行搭建jmeter编译环境! 下载地址 文件格式为zip,解压后为docx微软office2007文档. 或者直接访问我 ...
- MybatisPlus自动填充公共字段的策略
背景:数据库中多个表有时间字段,并且字段名一致 需求:该时间字段由MybatisPlus自动插入和更新,业务代码无需处理 方法: 一.创建基础实体[BaseEntity],定义需要处理的公共字段(创建 ...
- Vue 创建组件的两种方法
地址:https://blog.csdn.net/cofecode/article/details/74634301 创建组件的两种方法 1.全局注册 2.局部注册 var child=Vue.ext ...