[HAOI2006]数字序列

题目链接
题意:给一个长度为n的序列A,通过改变其中的一些位置上的值来使得序列单调严格上升 n ≤ 35000 n \le 35000 n35000
求最小的修改位置个数 和 最小修改个数前提下的最小修改绝对值之和

据说这种做法叫补集转化?
最少修改个数 -> n - 最大不修改个数
而对于一个位置pos 他可以不修改
那么对于它前面的所有点 一定有 a i + p o s − i ≤ a p o s a_i + pos - i \le a_{pos} ai+posiapos
所以就有了DP方程
f p o s = max ⁡ i = 1 p o s − 1 f i + 1 ( a i + p o s − i ≤ a p o s ) f_{pos} = \max_{i = 1}^{pos - 1} f_i + 1 (a_i + pos - i \le a_{pos}) fpos=i=1maxpos1fi+1(ai+posiapos)
那么答案就是 max ⁡ i = 1 n f i \max_{i = 1}^{n} f_i i=1maxnfi
然鹅这是 O ( n 2 ) O(n^2) O(n2)的复杂度啊?!
可以看到 限制我们一个一个判的就是那个 a i + p o s − i ≤ a p o s a_i + pos - i \le a_{pos} ai+posiapos
来推一下这个式子
a i + p o s − i ≤ a p o s a_i + pos - i \le a_{pos} ai+posiapos
= a i − i ≤ a p o s − p o s a_i - i \le a_{pos} - pos aiiapospos
那如果构造一个新的序列使得 B i = A i − i B_i = A_i - i Bi=Aii
再加上这个转移方程。。。这分明是最长不下降子序列鸭

第一问完成了来看第二问
我太菜了不是很能说明白。。
这里要参考一下这位大佬的题解
传送门

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 35005;
const int inf = 0x3f3f3f3f;
struct Edge{
 int u, v, next;
}edge[N << 1];
int head[N], esize;
inline void addedge(int x, int y){
 edge[++esize] = (Edge){x, y, head[x]};
 head[x] = esize;
}
int n;
int a[N], b[N], lis[N], lislen, len[N];
long long sl[N], sr[N], f[N];
int main() {
 memset(head, -1, sizeof(head));
 scanf("%d", &n);
 for(int i = 1; i <= n; ++i){
  scanf("%d", &a[i]); b[i] = a[i] - i;
 }
 for(int i = 1, l, r, mid; i <= n; ++i){
     l = 0, r = lislen;
     while(l < r){
      mid = l + ((r - l + 1) >> 1);
      if(lis[mid] <= b[i]) l = mid;
      else r = mid - 1;
     }
     
     if(l == lislen) ++lislen;
     lis[l + 1] = b[i];
     len[i] = l + 1;
     addedge(l + 1, i);
 }
 addedge(0, 0);//!
 printf("%d\n", n - lislen);
 memset(f, 0x3f, sizeof(f));
 len[n + 1] = lislen + 1;
 b[0] = -inf; b[n + 1] = inf;
 f[0] = 0;
 for(int i = 1; i <= n + 1; ++i){
     //printf("%d %d\n", len[i] - 1, head[len[i] - 1]);
  for(int j = head[len[i] - 1], vv; ~j; j = edge[j].next){
   vv = edge[j].v;
   if(vv > i || b[vv] > b[i]) continue;
      sl[vv] = sr[i] = 0;
      for(int k = vv + 1; k <= i; ++k) sl[k] = sl[k - 1] + abs(b[k] - b[vv]);
      for(int k = i - 1; k >= vv; --k) sr[k] = sr[k + 1] + abs(b[k] - b[i]);
      for(int k = vv; k <= i - 1; ++k){
       //printf("update i%d vv%d sl%lld sr%lld f%lld\n", i, vv, sl[k], sr[k + 1], f[vv]);
    f[i] = min(f[i], f[vv] + sl[k] + sr[k + 1]);
      }
  }
 }
 printf("%lld", f[n + 1]);
 return 0;
}
```









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值