正题

loj 3264


题目大意

有一个环,环上n个点,权值为a,有m次修改,每次修改一个aia_iai​,然后让你选取一些数,使环上不存在连续四个以上的数被选取,让你求所选数的最大权值和


解题思路

不难想到可以用DP做,一次DP时间为O(n),m次修改就是O(mn)会TLE

可以先把环剖开,那么可以考虑用线段树维护答案

设fi,jf_{i,j}fi,j​为当前区间经过左端点选了i个数,经过右端点选了j个数

那么区间合并可以枚举两个区间的四个端点,然后使中间的点相加不大于4(整段选上的特别处理一下)

这样合并是O(4^4)的,观察下图,不难发现倒着枚举第一个区间右端点选的数,第二个区间中可以匹配的数是一个前缀和,那么可以省掉一维

最后提取出最大的区间,然后在左右端点相加不大于4的点中取最大值即可


代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 40010
using namespace std;
int n, m, x;
ll y, w[N];
struct node
{int num;ll f[4][4];
};
node merge(node a, node b)//合并线段树
{node c;ll sum;memset(c.f, 0, sizeof(c.f));c.num = a.num + b.num;for (int i = 0; i <= min(3, a.num); ++i)for (int j = 0; j <= min(3, b.num); ++j){if (i == a.num && j == b.num)//两端都全选{if (i + j <= 3) c.f[i + j][i + j] = a.f[i][i] + b.f[j][j];continue;}if (i == a.num)//第一段全选{for (int k = 0; k <= min(3 - i, b.num); ++k)c.f[i + k][j] = max(c.f[i + k][j], a.f[i][i] + b.f[k][j]);continue;}if (j == b.num)//第二段全选{for (int k = 0; k <= min(3 - j, a.num); ++k)c.f[i][j + k] = max(c.f[i][j + k], a.f[i][k] + b.f[j][j]);continue;}sum = 0;for (int k = 3; k >= 0; --k){sum = max(sum, b.f[3 - k][j]);//前缀和c.f[i][j] = max(c.f[i][j], sum + a.f[i][k]);}}return c;
}
ll get(node x)
{ll ans = 0;for (int i = 0; i <= 3; ++i)for (int j = 0; j <= 3 - i; ++j)//左右端点之和不大于3ans = max(ans, x.f[i][j]);return ans;
}
struct Tree
{#define ls x*2#define rs x*2+1node v[N<<2];void build(int x, int l, int r){if (l == r){v[x].num = 1;v[x].f[1][1] = w[l];return;}int mid = l + r >> 1;build(ls, l, mid);build(rs, mid + 1, r);v[x] = merge(v[ls], v[rs]);return;}void change(int x, int l, int r, int y){if (l == r){v[x].f[1][1] = w[l];return;}int mid = l + r >> 1;if (y <= mid) change(ls, l, mid, y);else change(rs, mid + 1, r, y);v[x] = merge(v[ls], v[rs]);return;}
}T;
int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++i)scanf("%lld", &w[i]);T.build(1, 1, n);printf("%lld\n", get(T.v[1]));scanf("%d", &m);while(m--){scanf("%d%lld", &x, &y);w[x] = y;T.change(1, 1, n, x);printf("%lld\n", get(T.v[1]));}return 0;
}

【线段树】海报(loj 3264)相关推荐

  1. poj2528贴海报(线段树离散化)

    //poj2528贴海报(线段树离散化) #include<cstring> #include<iostream> #include<cstdio> #includ ...

  2. LOJ 3094 「BJOI2019」删数——角标偏移的线段树

    题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移 ...

  3. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  4. POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53703   Accepted: 25237 ...

  5. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  6. POJ 2528 Mayor's posters 贴海报 线段树 区间更新

    注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...

  7. 贴海报 (线段树染色-离散化

    n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 虽然之前学过离散化,但用的时 ...

  8. LOJ 534 花团(线段树+dfs栈)

    题意 https://loj.ac/problem/534 思路 又是复杂度错误的一题,\(O(n^2\log n)\) 能过 \(15000\) . 虽然看起来强制在线,其实是一道假的在线题.首先按 ...

  9. POJ 3264 线段树

    题意 传送门 POJ 3264 题解 线段树维护区间的最大值和最小值即可. #include <cstdio> #include <cstring> #include < ...

最新文章

  1. ili9341代码移植注意事项
  2. java io读书笔记(2)什么是stream
  3. 初中数学知识遗忘记录(持续更新中)
  4. SAP ABAP Development Tool 提高开发效率的十个小技巧
  5. 在XX公司工作第二天,维护已有代码
  6. ngnix集群产生的问题
  7. Linux container_of用法
  8. 腾讯公司执行董事 董事会主席兼本公司首席执行官 马化腾
  9. Python进行Excel数据处理
  10. Linux安装dos环境,Ubuntu安装dos2unix工具
  11. python 音频文件下载 mp3,保存本地requests
  12. 双麦降噪远场 拾音模块 : AN-93
  13. iOS各大名人的博客
  14. STM32F7以太网HAL库源文件(stm32f7xx_hal_eth.c)笔记
  15. python 黑白棋_python实现翻转棋游戏(othello)
  16. 计算机毕业设计之java+ssm基于协同过滤算法的图书推荐系统
  17. FileExplorer for iPhone
  18. Mac 电脑安装putty
  19. 最小生成树——洛谷并查集、口袋的天空
  20. 神仙趋势,运筹帷幄,通达信公式

热门文章

  1. java转python推荐算法_java和python实现一个加权SlopeOne推荐算法
  2. python standardscaler_教你用python一步步解决“维度灾难”
  3. 算法题目中经典问题(易错点)
  4. 转 android anr 分析示例,[摘]Android ANR日志分析指南之实例解析
  5. Bridge(桥接)--对象结构模式
  6. 算法-计算逆序对个数
  7. 微信小程序点击按钮弹出弹窗_微信小程序实现的点击按钮 弹出底部上拉菜单功能示例...
  8. word List 43
  9. 天梯赛 喊山 bfs
  10. 经典排序算法(11)——计数排序算法详解