LINK:T1



算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了。

容易发现一个性质 那就是同一格子不会被两种以上的颜色染。(颜色就三种.

通过这个性质就可以进行dp了.先按照左端点排序。

设f[i]表示前i个画笔必选的最大价值。

枚举决策j 分类讨论相交还是包含 还是相离。

其中包含的情况没必要讨论 相交需要比对一下颜色再进行转移 不过我写的时候多打一个东西导致爆零.

值得一提的是 对于相交的情况 相交的部分不会被之前转移的线段给交上去 可以证明这样不是最优的。

所以这样dp是正确的。

code:

const int MAXN=100010;
int n,m,s1,s2,flag;
ll ans,f[MAXN];
struct wy{int x,y,c;}t[MAXN];
inline int cmp(wy a,wy b){return a.x<b.x;}
int main()
{
freopen("T1.in","r",stdin);
freopen("T1.out","w",stdout);
get(n);get(m);get(s1);get(s2);
rep(1,m,i)
{
int get(c),get(x),get(y);
t[i]=(wy){x,y,c};
if(!flag)flag=c;
else if(flag!=c)flag=INF;
}
sort(t+1,t+1+m,cmp);
if(flag!=INF)
{
ll ans=0;int mx=0;
rep(1,m,i)
{
if(mx>=t[i].y)continue;
if(t[i].x<mx)ans+=((ll)t[i].y-mx)*s1;
else ans+=(ll)((ll)t[i].y-t[i].x+1)*s1;
mx=t[i].y;
}
putl(ans);
return 0;
}
//putl(ans);
if(m<=1000)
{
rep(1,m,i)
{
rep(0,i-1,j)
{
if(t[i].y<=t[j].y)continue;
if(t[i].x>t[j].y)
{
f[i]=max(f[i],f[j]+((ll)t[i].y-t[i].x+1)*s1);
continue;
}
int ww=(t[i].c!=t[j].c);
f[i]=max(f[i],f[j]+((ll)t[i].y-t[j].y)*s1-((ll)t[j].y-t[i].x+1)*ww*(s1+s2));
}
ans=max(ans,f[i]);
}
putl(ans);return 0;
}
return 0;
}

考虑正解。其实正解很好想 不过我没胆子写。

容易 发现可以分类讨论。对于相离的情况 写一个线段树 在右端点放值 查询查左端点-1即可。

对于相交的情况 还是分类讨论 考虑如果是同颜色的话查 还是右端点放值 区间内查 放值的具体形式展开上述的dp式即可。

对于不同颜色相交 同样展开上述dp式 在线段树里做即可。

第一种情况需要一颗线段树 第二种情况需要三颗线段树 第三种情况同样需要三种 简单的做法是 三种不同颜色各自维护相交的情况。

由于所有的线段树维护的东西相同 所以可以使用指针做这件事情 也可以使用结构体。

const int MAXN=100010;
int n,m,top;ll s1,s2;
int b[MAXN<<1];
struct wy{int x,y,c;}t[MAXN];
inline int cmp(wy a,wy b){return a.x<b.x;}
struct jl
{
ll s[MAXN<<3];
inline void cle(){memset(s,0xcf,sizeof(s));}
inline void change(int p,int l,int r,int w,ll x)
{
if(l==r){s[p]=max(s[p],x);return;}
int mid=(l+r)>>1;
if(w<=mid)change(zz,l,mid,w,x);
else change(yy,mid+1,r,w,x);
s[p]=max(s[zz],s[yy]);
}
ll ask(int p,int l,int r,int L,int R)
{
if(L<=l&&R>=r)return s[p];
int mid=(l+r)>>1;
if(R<=mid)return ask(zz,l,mid,L,R);
if(L>mid)return ask(yy,mid+1,r,L,R);
return max(ask(zz,l,mid,L,R),ask(yy,mid+1,r,L,R));
}
}f[3],g[3],s;
int main()
{
freopen("1.in","r",stdin);
//freopen("T1.out","w",stdout);
get(n);get(m);get(s1);get(s2);
rep(1,m,i)
{
int get(c),get(x),get(y);
t[i]=(wy){x,y,c-1};
b[++top]=x;b[++top]=y;
}
sort(b+1,b+1+top);
int num=0;
rep(1,top,i)if(i==1||b[i]!=b[i-1])b[++num]=b[i];
rep(1,m,i)
{
t[i].x=lower_bound(b+1,b+1+num,t[i].x)-b;
t[i].y=lower_bound(b+1,b+1+num,t[i].y)-b;
}
sort(t+1,t+1+m,cmp);
s.cle();
rep(0,2,i)f[i].cle(),g[i].cle();
s.change(1,0,num,0,0);
rep(1,m,i)
{
ll ww=s.ask(1,0,num,0,t[i].x-1)+(b[t[i].y]-b[t[i].x]+1)*s1;
rep(0,2,j)
{
if(t[i].c==j)//同色转移用f
ww=max(ww,f[j].ask(1,0,num,t[i].x,t[i].y)+b[t[i].y]*s1);
else //不同色用g
ww=max(ww,g[j].ask(1,0,num,t[i].x,t[i].y)+b[t[i].x]*(s1+s2)-s1-s2+b[t[i].y]*s1);
}
s.change(1,0,num,t[i].y,ww);
f[t[i].c].change(1,0,num,t[i].y,ww-b[t[i].y]*s1);
g[t[i].c].change(1,0,num,t[i].y,ww-b[t[i].y]*(s1+s1+s2));
}
putl(s.s[1]);
return 0;
}

省选模拟赛 4.26 T1 dp 线段树优化dp的更多相关文章

  1. 省选模拟赛 Problem 3. count (矩阵快速幂优化DP)

    Discription DarrellDarrellDarrell 在思考一道计算题. 给你一个尺寸为 1×N1 × N1×N 的长条,你可以在上面切很多刀,要求竖直地切并且且完后每块的长度都是整数. ...

  2. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  3. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  4. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  5. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  6. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  7. zoj 3349 dp + 线段树优化

    题目:给出一个序列,找出一个最长的子序列,相邻的两个数的差在d以内. /* 线段树优化dp dp[i]表示前i个数的最长为多少,则dp[i]=max(dp[j]+1) abs(a[i]-a[j])&l ...

  8. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

  9. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

随机推荐

  1. Html中a标签用法总结:创建email,电话,描点链接等。以及防止链接被搜索引擎收录

    <a>标签可以用来创建一个到其他网页.文件.同一页面内的位置.电子邮件地址或任何其他URL的超链接.  是我们常用的一个标签之一,今天就讲讲如何使用a来创建email,电话,描点链接等.以 ...

  2. (一)学习了解OrchardCore笔记——开篇:基于asp.net core的OrchardCore

    想深入了解OrchadCore源码许久了,但是读源码的时候遇到很多问题而网上的参考资料太少了(几乎都是OrchadCms不带OrchardCore的),现在解决得差不多了,做下笔记方便自己查看,有错误 ...

  3. mongodb(二):数据库安装,部署(linux)

    1.下载安装包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz 下载完成后解压缩压缩包 tar zxf mongod ...

  4. 爬虫03 /代理、cookie处理、模拟登录、提升爬虫效率

    爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 目录 爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 1. 代理 2. cookie处理 3. 模拟登录 4. 如何提升爬取数据 ...

  5. selenium 下拉到页面最底端

    selenium操控浏览器下拉到页面最底端: https://www.cnblogs.com/TTyb/p/7662430.html #!/usr/bin/env python # -*- codin ...

  6. bzoj2016[Usaco2010]Chocolate Eating*

    bzoj2016[Usaco2010]Chocolate Eating 题意: n块巧克力,每次吃可以增加ai点快乐,每天早晨睡觉起来快乐值会减半,求如何使d天睡觉前的最小快乐值最大.n,d≤5000 ...

  7. js 自定义阻止事件冒泡函数

    // 以下改方法全兼容Chrome function stopBubble(event){ if(event.stopPropagation){   // 兼容火狐(firebox) event.st ...

  8. Serverless的概念&定义-无服务计算详解

    过去几年间,Serverless 发展迅猛,与其相伴的还有从小程序.移动端等到前后端一体化的演进与实践,也正因如此,从云计算到前端,众多开发者都极为关注 Serverless到底是什么? 在国内,Se ...

  9. vscode安装rainbow-fart(彩虹屁)插件,程序员只能自我鼓励了!!!

    2020-7-10更新 Rainbow Fart 插件现以发布到 VSCode 商店,安装过 VSIX 版本的用户请卸载之前的版本,从商店安装. 从 VSCode 扩展商店 下载并安装.(更新vsco ...

  10. .NET 开源项目 StreamJsonRpc 介绍[下篇]

    阅读本文大概需要 9 分钟. 大家好,这是 .NET 开源项目 StreamJsonRpc 介绍的最后一篇.上篇介绍了一些预备知识,包括 JSON-RPC 协议介绍,StreamJsonRpc 是一个 ...