预处理出每个原子最近的不能合并的位置

枚举当前位置和前面断开的位置合并

发现还是不能过

考虑用选段树优化

但是因为每次转移的最优点是在前面可以合并的范围内 dp值加上当前的到该点的最大值

因为每个位置的最大值每次更新不是只更新一个位置

是一次更新一段位置

所以直接维护复杂度爆炸

有种方法(套路) 是把最值的更新改为值的加减

因为每次是更新一段区间

且每个点到当前的位置的最值是单调不减的

所以每次的修改就可以是一段一段的

可以用单调栈来维护每种值的区间

就可以进行区间修改

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define C getchar()-48
inline ll read()
{
ll s=0,r=1;
char c=C;
for(;c<0||c>9;c=C) if(c==-3) r=-1;
for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
return s*r;
}
const int N=1e5+10,inf=1e9;
int n,qm;
int p[N],v[N],q[N];
int vis[N];
int dp[N];
int dv[N],dr[N],top;
struct xin{
int del,mn;
}tr[N<<2];
inline void up(int x)
{
tr[x].mn=min(tr[x<<1].mn,tr[x<<1|1].mn)+tr[x].del;
}
inline void down(int x)
{
tr[x<<1].del=tr[x<<1|1].del=tr[x].del;
tr[x].del=0;
}
inline void add(int x,int l,int r,int ql,int qr, int v)
{
if(ql<=l&&r<=qr){tr[x].del+=v,tr[x].mn+=v;return;}
int mid=(l+r)>>1;
if(ql<=mid) add(x<<1,l,mid,ql,qr,v);
if(mid<qr) add(x<<1|1,mid+1,r,ql,qr,v);
up(x);
}
inline int ask(int x,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr){return tr[x].mn;}
int mid=(l+r)>>1,mn=inf;
if(ql<=mid) mn=min(mn,ask(x<<1,l,mid,ql,qr));
if(mid<qr) mn=min(mn,ask(x<<1|1,mid+1,r,ql,qr));
up(x);
return mn+tr[x].del;
}
int main()
{
freopen("array.in","r",stdin);
freopen("array.out","w",stdout);
n=read();qm=n;vis[0]=1;dv[0]=inf;dr[0]=0;
for(int i=1;i<=n;i++) p[i]=read(),v[i]=read();
for(int i=n;i>=1;i--)
{
while(!vis[p[qm]]){vis[p[qm]]=1;qm--;}
q[i]=qm;
vis[p[i]]=0;
}
for(int i=1;i<=n;i++)
{
add(1,1,n,i,i,v[i]);
while(dv[top]<v[i])
{
add(1,1,n,dr[top-1]+1,dr[top],v[i]-dv[top]);
top--;
}
dv[++top]=v[i],dr[top]=i;
dp[i]=ask(1,1,n,q[i]+1,i);
add(1,1,n,i+1,i+1,dp[i]);
}
cout<<dp[n];
return 0;
}

还有位大佬用multiset维护

#include<bits/stdc++.h>
using namespace std; #define Abigail inline void
typedef long long LL; const int N=100000,INF=(1<<30)-1; multiset<int>t;
int n,a[N+9],b[N+9],data[N+9],last[N+9],l[N+9];
int sum[N+9],wei[N+9],f[N+9],hd,tl; Abigail into(){
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%d%d",&a[i],&b[i]);
} Abigail work(){
for (int i=1;i<=n;++i)
l[i]=max(l[i-1],last[a[i]]+1),last[a[i]]=i;
//预处理每一个位置为结尾可以取的转移的区间左端点
hd=1;
int k;
for (int i=1;i<=n;++i){
k=i-1;
for (;hd<tl&&wei[hd+1]<l[i];++hd)
t.erase(t.find(sum[hd]));
//把不在转移区间的位置去掉
for (;hd<=tl&&b[i]>data[tl];--tl)
t.erase(t.find(sum[tl])),k=wei[tl];
//更新阶梯型(max{b[j]..b[i]})
data[++tl]=b[i];
wei[tl]=k;
//加入第i个位置
if (hd^tl){
sum[tl]=f[wei[tl]]+data[tl];
//把位置i所在的阶梯中最优的值sum[tl]计算出来
t.insert(sum[tl]);
//加入set中
t.erase(t.find(sum[hd]));
//开头的那一段阶梯中会有一部分不可取,一部分可取
}
sum[hd]=f[l[i]-1]+data[hd];
//采取开头最优的那段
t.insert(sum[hd]);
//加入set中
f[i]=*t.begin();
}
} Abigail outo(){
printf("%d\n",f[n]);
} int main(){
freopen("array.in","r",stdin);
freopen("array.out","w",stdout);
into();
work();
outo();
return 0;
}

【简】题解 AWSL090429 【原子】的更多相关文章

  1. 【简】题解 AWSL090429 【市场】

    因为这有个时间的限制 并且  求的时间都是前缀和 那么 我们可以根据时间将排序 因为题中没有修改可以直接用背包预处理出答案 但是因为题目ci mi<=1e9   vi<=300 所以发现不 ...

  2. 【简】题解 AWSL090429 【噪音】

    因为每次加上一头奶牛 是什么不重要 牛棚之间贡献除清空操作外无影响 就只要考虑 每个牛棚清空分x次 的贡献 x之和为k       求贡献和最小 一个牛棚清空x次 显然平均清空贡献最小 再用等差数列的 ...

  3. 【简】题解 AWSL090429 【数塔问题】

    因为每次只ban一个点 而且不是永久性的 预处理出每个点从上往下和从下往上的最大值 每次询问直接暴力 被ban掉点那行去掉那点的最大值 也可以直接预处理出每行的最大值和次大值 还有种做法貌似可以过 预 ...

  4. 【简】题解 AWSL090429 【聚会】

    这题直接换根dp 记录在要转移的点的子树中有多少牛 #include<bits/stdc++.h> using namespace std; #define ll long long #d ...

  5. 【简】题解 AWSL090429 【价值】

    先考虑当要选的物品一定时 显然有个贪心 wi越小的要越先选 所以先按wi从小到大拍序 因为发现正着递推要记录的状态很多 并且wi的贡献与后面选了几个物品有关 考虑正难则反 倒着递推 提前计算wi的贡献 ...

  6. DP笔记

    这是一篇蒟蒻被大佬踩爆后写的笔记 套路 0.贪心(废话)(排序...) 1.dp预处理出要用的东西 2.两头同时dp 3.化简题目中本质相同的东西 转化模型 4.数学计算优化 5.分析题目数据考虑该从 ...

  7. 【简】题解 P5283 [十二省联考2019]异或粽子

    传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...

  8. 【简】题解 P4297 [NOI2006]网络收费

    传送门:P4297 [NOI2006]网络收费 题目大意: 给定一棵满二叉树,每个叶节点有一个状态(0,1),任选两个叶节点,如果这两个叶节点状态相同但他们的LCA所管辖的子树中的与他们状态相同的叶节 ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. Dao、Controller、Service三层的结构划分

     Java Web基础--Controller+Service +Dao三层的功能划分(摘取自网络)1. Controller/Service/DAO简介:      Controller是管理业务( ...

  2. Python爬虫中的URLError\HTTPError异常类,异常的抛出

    # _*_ coding : utf-8 _*_# @Time : 2021/11/2 14:20# @Author : 秋泊酱 import urllib.request import urllib ...

  3. java web 在线编辑Excel -- x-spreadsheet

    --- x-spreadsheet --- 文档 https://hondrytravis.com/x-spreadsheet-doc/ <%@ page language="java ...

  4. [hdu7022]Jsljgame

    先考虑$x=y$的情况,此时即是一个平等博弈,因此考虑$sg$函数 具体的,有$sg(n)=\begin{cases}0&(n=0)\\mex(\{sg(n-i)\mid 1\le i\le ...

  5. dart系列之:在dart中使用生成器

    目录 简介 两种返回类型的generator Stream的操作 总结 简介 ES6中在引入异步编程的同时,也引入了Generators,通过yield关键词来生成对应的数据.同样的dart也有yie ...

  6. C/C++ Qt 基础通用组件应用

    QT 是一个跨平台C++图形界面开发库,利用QT可以快速开发跨平台窗体应用程序,在QT中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率. 目前,QT开发中常用的基础 ...

  7. 面向对象的程序设计之JS创建对象的9种模式及其优缺点

    目录 1.new Object () 2.字面式创建对象 3.工厂模式 4.构造函数模式 4.1.将构造函数当作函数 4.2.构造函数的问题 5.原型模式 5.1.理解原型对象 5.2.原型与in操作 ...

  8. Codeforces 1528F - AmShZ Farm(转化+NTT+推式子+第二类斯特林数)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题,只不过感觉有点强行二合一(?). 首先考虑什么样的数组 \(a\) 符合条件,我们考虑一个贪心的思想,我们从前到后遍历,对于每一个 ...

  9. Python使用print打印时,展示内容不换行

    原理 Python的print()函数中参数end='' 默认为\n,所以会自动换行; 默认的print()函数: print(end='\n') 方案 Python 2: 在print语句的末尾加上 ...

  10. [R] 如何在Linux命令行进行参数传入?

    以前由于R命令行传参不友好,经常嵌套在其他程序语言(如Perl/Python)中来进行传参,但现在也陆续有一些方式来实现R的传参了,这里简单罗列下. 方法一 最传统的方法就是使用系统自带的comman ...