题解

区间dp,先离散化所有价值

\(f[i][j][k]\)表示\([i,j]\)区间里最小值为\(k\)的价值最大是多少

只考虑\(i <= a <= b <= j\)的区间,枚举中间点\(h\),然后如果这个区间包括h就统计在内

\(f[i][j][k] = max(f[i][h - 1][ >=k] + cost(k) + f[h + 1][j][>=k])\)

构造答案的时候通过记录每个点前一个转移点来递归即可

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 500005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,M;
int id[500005],val[4005],tot,ans[55];
int a[4005],b[4005],c[4005],cnt[4005][55];
int f[55][55][4005],g[55][55][4005],pre[55][55][4005];
vector<int> p[55][55];
void dfs(int l,int r,int v,int t = 1) {
if(l > r) return;
for(int k = t ; k <= tot ; ++k) {
if(f[l][r][k] == v) {
if(l == r) {ans[l] = val[k];return;}
int p = pre[l][r][k];
if(!p) {
for(int i = l ; i <= r ; ++i) ans[i] = val[k];
return;
}
ans[p] = val[k];
dfs(l,p - 1,g[l][p - 1][k],k);dfs(p + 1,r,g[p + 1][r][k],k);
return;
}
}
}
void Init() {
read(N);read(M);
for(int i = 1 ; i <= M ; ++i) {
read(a[i]);read(b[i]);read(c[i]);
val[i] = c[i];
for(int k = 1 ; k <= N ; ++k) {
for(int h = k ; h <= N ; ++h) {
if(a[i] >= k && b[i] <= h) p[k][h].pb(i);
}
}
}
sort(val + 1,val + M + 1);
tot = unique(val + 1,val + M + 1) - val - 1;
for(int i = 1 ; i <= tot ; ++i) {
id[val[i]] = i;
}
}
void Solve() {
for(int d = 1 ; d <= N ; ++d) {
for(int i = 1 ; i <= N ; ++i) {
int j = i + d - 1;
if(j > N) break;
memset(cnt,0,sizeof(cnt));
int s = p[i][j].size();
for(int k = 0 ; k < s ; ++k) {
int t = p[i][j][k];
cnt[id[c[t]]][a[t]]++;cnt[id[c[t]]][b[t] + 1]--;
}
for(int k = tot ; k >= 1 ; --k) {
for(int h = i ; h <= j ; ++h) cnt[k][h] += cnt[k][h - 1];
for(int h = i ; h <= j ; ++h) cnt[k][h] += cnt[k + 1][h];
}
for(int k = tot ; k >= 1 ; --k) {
for(int h = i ; h <= j ; ++h) {
if(f[i][j][k] < cnt[k][h] * val[k] + g[i][h - 1][k] + g[h + 1][j][k]) {
pre[i][j][k] = h;
f[i][j][k] = cnt[k][h] * val[k] + g[i][h - 1][k] + g[h + 1][j][k];
}
}
g[i][j][k] = max(g[i][j][k + 1],f[i][j][k]);
}
}
}
int r = 0;
for(int i = 1 ; i <= tot ; ++i) r = max(r,f[1][N][i]);
out(r);enter;
dfs(1,N,r);
for(int i = 1 ; i <= N ; ++i) {
out(ans[i]);
i == N ? enter : space;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
return 0;
}

【BZOJ】4380: [POI2015]Myjnie的更多相关文章

  1. 【BZOJ 4380】4380: [POI2015]Myjnie (区间DP)

    4380: [POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗 ...

  2. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  3. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  4. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  5. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  6. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  7. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  8. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

  9. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

随机推荐

  1. LOJ#2983. 「WC2019」数树

    传送门 抄题解 \(Task0\),随便做一下,设 \(cnt\) 为相同的边的个数,输出 \(y^{n-cnt}\) \(Task1\),给定其中一棵树 设初始答案为 \(y^n\),首先可以发现, ...

  2. Java基础-逻辑运算符Logic Operators

    Java基础-逻辑运算符Logic Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.逻辑运算符 逻辑运算符是对布尔值进行操作运算的,常见的有: 1>.逻 ...

  3. 怎么在sublime里面显示编码格式

    我要在sublime text里面显示编码格式 点击Preference—settings 然后再user里面加入这个 // Display file encoding in the status b ...

  4. protobuf与json相互转换的方法

    google的protobuf对象转json,不能直接使用FastJson之类的工具进行转换,原因是protobuf生成对象的get方法,返回的类型有byte[],而只有String类型可以作为jso ...

  5. 转---一文读懂 python 的元类

    译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...

  6. WHAT I READ FOR DEEP-LEARNING

    WHAT I READ FOR DEEP-LEARNING Today, I spent some time on two new papers proposing a new way of trai ...

  7. 读书笔记:《思考的乐趣:Matrix67数学笔记》第4章 统计数据的陷阱

    <思考的乐趣:Matrix67数学笔记>第4章讲了几个统计学上的陷阱,由于现在流行的大数据与统计学很有渊源,所以认真读了这一章,在<大数据时代>中指出只考虑相关性就够了,而不考 ...

  8. 《Linux命令行与shell脚本编程大全》第十一章 构建基本脚本

    11.1使用多个命令 $date;who   //  命令列表,加入分号就可以,这样会依次执行.参见5.2.1节 注意区分$(date;who),这个是进程列表,会生成一个子shell来执行 Shel ...

  9. 强悍的CSS工具组合:Blueprint, Sass, Compass

    掌握CSS是每个Web开发者的基本要求,虽然CSS本身并不复杂,但怎样写出支持所有主流浏览器(特别是IE)的CSS,以及在大型网站中如何有序地组织好CSS结构却是一个相当棘手的问题.我更多的是一个开发 ...

  10. Nessus扫描策略

    本篇将简单介绍下Nessus的扫描策略设置.选用plugins及如何使用定制的策略来进行扫描任务. Step 1: 启动Nessus服务 root@kali:~# /etc/init.d/nessus ...