Problem A 中间值

对于$2$个非严格单增序列$\{A_n\} , \{B_n\}$,维护下列两个操作:

1 x y z: (x=0)时将$A_y = z$ , (x=1)时将$B_y = z$

2 l1 r1 l2 r2 : 输出$A[l1] - A[r1]$和$B[l2] - B[r2]$ 这些数中的中位数,保证总数为奇数。

对于$100\%$的数据满足 $1 \leq n \leq 5\times 10^5 ,1 \leq m\leq 10^6$

Solution: 有一种简单实现$O(n log_2 n)$的方法:

  我们有两个非严格单增的数组$a[]$和$b[]$设$|a| < |b|$ ,现在要求第$k$小数。

  我们在$a[]$数组中求出$min(k/2,|a|)$的位置的数$a[i]$ ,同时在$b[]$数组中找出$|b|-i$位置的数$b[j]$

判断$a[i]$ 和$b[j]$的大小,如果$a[i] > b[j]$ 说明$b[1] .. b[j]$都不可能是排名第$k$的数,

  否则,$a[1] ... a[i]$都不可能是排名第$k$的数。

  每一次,k都可以变成一半,所以复杂度就是$log_2 n $ 每次查询。

  总复杂度就是$O(n \ log_2 \ n )$

  1. # include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=5e5+;
  4.  
  5. int query(int a[],int len1,int b[],int len2,int k)
  6. {
  7. if (len1 > len2) return query(b,len2,a,len1,k);
  8. if (len1 == ) return b[k];
  9. if (k==) return min(a[],b[]);
  10. int ka = min(k/,len1) , kb=k-ka;
  11. if (a[ka] < b[kb]) return query(a+ka,len1-ka,b,len2,k-ka);
  12. else return query(a,len1,b+kb,len2-kb,k-kb);
  13. }
  14. int a[N],b[N],n,m;
  15. int main()
  16. {
  17. scanf("%d%d",&n,&m);
  18. for (int i=;i<=n;i++) scanf("%d",&a[i]);
  19. for (int i=;i<=n;i++) scanf("%d",&b[i]);
  20. while (m--) {
  21. int op; scanf("%d",&op);
  22. if (op==) {
  23. int x,y; scanf("%d%d%d",&op,&x,&y);
  24. if (op==) a[x]=y; else b[x]=y;
  25. } else {
  26. int l1,r1,l2,r2; scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
  27. printf("%d\n",query(a+l1-,r1-l1+,b+l2-,r2-l2+,(r2-l2++r1-l1+)/+));
  28. }
  29. }
  30. return ;
  31. }

A.cpp

Problem B 最小值

给出序列$\{a_n\}$,定义区间$l,r$的价值为$f(\min_{i=l} ^ {r} a_i)$

其中$f(x)$是一个给出的$3$次函数,可以通过$f(x) = Ax^3 + Bx^2 + Cx + D$表示。

将序列分成连续的几部分,使得各部分的价值和最大。

对于$100\%$的数据满足$n \leq 2\times 10^5 , |f(a_i)| \leq 10^{13}$

Solution:这种题目不要从函数的性质入手,还是去找dp本身的优化,减少冗余计算。

可以写出一个非常暴力的DP,设$f[i]$为设置为$i$点为断点,$1-i$段的最大价值和。

  可以从$f[j]$转移过来,考虑$[j+1,i]$成一段的价值和,$f[i] = \max_{j=0}^{i-1}\{f[j] + calc(\min_{k=j+1} ^ {i} a_k)\}$

  这样子转移是$O(n^3)$的,然后显然可以用st表优化到$O(n^2)$

  考虑进一步优化转移,在$i$点左侧最近的一个严格小于$a[i]$的点位$last[i]$ ,那么显然$\min_{j=last[i]}^{i} \{a_j\} = a_i$

  如果转移的决策点在$j , j\in[up[i] , i-1]$意味着$[j+1,i]$自成一段,而这些转移对$f$的贡献都是一样的,都为$calc(a[i])$,那么就直接线段树优化转移即可。

  如果转移的决策点在$j , j\in[1,up[i]-1]$,意味着$[j+1,i]$自成一段,注意到这时候$f[j] + calc(\min_{k=j+1}^i a_k) = f[last[i]]$ ,

  这是由于$i \in [last[i]+1,i]$的$a_i$是不可能被选定为最小值了,上述转移已经在$f[last[i]]$的时候计算过了,所以不必重新计算。

  这样子对于第$2$类转移,直接从$f[last[i]]$转移过来就行了。

  复杂度是$O(n \ log_2 \ n)$

  1. # include<bits/stdc++.h>
  2. # define int long long
  3. using namespace std;
  4. const int N=2e5+;
  5. int f[N],a[N],st[N][],Log2[N];
  6. int A,B,C,D,n,tr[N<<],last[N];
  7. int fun(int x){return (long long)A*x*x*x+B*x*x+C*x+D;}
  8. int query(int l,int r)
  9. {
  10. int k=Log2[r-l+];
  11. return min(st[l][k],st[r-(<<k)+][k]);
  12. }
  13. void update(int x,int l,int r,int pos,int val)
  14. {
  15. if (l==r) {
  16. tr[x] = val; return;
  17. }
  18. int mid=(l+r)>>;
  19. if (pos <= mid) update(*x,l,mid,pos,val);
  20. else update(*x+,mid+,r,pos,val);
  21. tr[x] = max(tr[*x] , tr[*x+]);
  22. }
  23. int query(int x,int l,int r,int opl,int opr)
  24. {
  25. if (opl <= l && r <= opr) return tr[x];
  26. int mid = (l+r) >> ;
  27. int ret = -0x3f3f3f3f3f3f3f3f;
  28. if (opl <= mid) ret = max(ret , query(*x,l,mid,opl,opr));
  29. if (opr > mid) ret = max(ret , query(*x+,mid+,r,opl,opr));
  30. return ret;
  31. }
  32. signed main()
  33. {
  34. // freopen("1.in","r",stdin);
  35. // freopen("1.out","w",stdout);
  36. scanf("%lld%lld%lld%lld%lld",&n,&A,&B,&C,&D);
  37. for (int i=;i<=n;i++) Log2[i]=log(i)/log();
  38. for (int i=;i<=n;i++) scanf("%lld",&a[i]);
  39. for (int i=;i<=n;i++) st[i][]=a[i];
  40. int t=Log2[n]+;
  41. for (int j=;j<t;j++) for (int i=;i<=n-(<<j)+;i++)
  42. st[i][j]=min(st[i][j-],st[i+(<<j-)][j-]);
  43. for (int i=;i<=n;i++) {
  44. int l=,r=i,ans=;
  45. while (l<=r) {
  46. int mid=(l+r)/;
  47. if (query(mid,i) == a[i]) r=mid-,ans=mid;
  48. else l=mid+;
  49. }
  50. last[i]=ans-;
  51. }
  52. memset(tr,-0x3f,sizeof(tr)); memset(f,-0x3f,sizeof(f));
  53. f[] = ; update(,,n,,);
  54. for (int i=;i<=n;i++) {
  55. if (!last[i]) f[i]=query(,,n,last[i],i-) + fun(a[i]);
  56. else f[i] = max(f[last[i]] , query(,,n,last[i],i-) + fun(a[i]));
  57. update(,,n,i,f[i]);
  58. // printf("f[%lld] = %lld\n",i,f[i]);
  59. }
  60. printf("%lld\n",f[n]);
  61. return ;
  62. }

B.cpp

HGOI20190814 省常中互测7的更多相关文章

  1. HGOI 20190816 省常中互测8

    Problem A  有两条以(0,0)为端点,分别经过(a,b),(c,d)的射线,你要求出夹在两条射线中间,且距离(0,0)最近的点(x,y) 对于$100\%$的数据满足$1 \leq T \l ...

  2. HGOI20190813 省常中互测6

    Problem A 蛋糕 将$n \times m $大小的蛋糕切成每块为$1 \times 1$大小的$n\times m$块. 交换任意两块蛋糕的切割顺序的方案算作一种. 对于$100 \%$的数 ...

  3. HGOI20190811 省常中互测4

    Problem A magic 给出一个字符串$S$,和数字$n$,要求构造长度为$n$只含有小写字母的字符串$T$, 使得在$T$中存在删除且仅删除一个子串使得$S=T$成立. 输出$T$的构造方案 ...

  4. HGOI20190810 省常中互测3

    Problem A  夏洛特 若当前处在点$(x,y)$下一时刻可以向该点四周任意方向走动一步, 初始在$(0,0)$是否存在一条合法的路线满足下列$n$个限制: 每一个限制形如$t_i , x_i ...

  5. HGOI20190809 省常中互测2

    Problem A 时之终结 构造一个含有$n$个节点的无重边无自环的有向图, 使得从$1$出发,每一次经过一条$(u,v) (u < v)$的边到达节点$n$的方案恰好有$y$种. 对于$10 ...

  6. HGOI20190808 省常中互测1

    Problem A  sum 给出$n$个元素的序列$\{a_i\}$,求出两个不相交连续子序列的最大元素和. 即对于$1 \leq A \leq B \leq C \leq D \leq n$最大化 ...

  7. HGOI20190812 省常中互测5

    Task 1 辩论 有N 个参加辩论的候选人,每个人对这两个议题都有明确的态度,支持或反对.作为组织者,小D 认真研究了每个候选人,并给每个人评估了一个非负的活跃度,他想让活跃度之和尽可能大.选出的候 ...

  8. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  9. 【CH 弱省互测 Round #1 】OVOO(可持久化可并堆)

    Description 给定一颗 \(n\) 个点的树,带边权. 你可以选出一个包含 \(1\) 顶点的连通块,连通块的权值为连接块内这些点的边权和. 求一种选法,使得这个选法的权值是所有选法中第 \ ...

随机推荐

  1. windows10 AppStore安装 应用商店重新安装

    点击左下角的搜索按钮,如下图所示   输入powershell,在结果中找到widows powershell应用,如下图所示   右键单击widows powershell应用,选择以管理员运行,如 ...

  2. CVE-2018-19985漏洞学习

    简介 4.19.8之前,在Linux内核中,hso_probe()函数中发现了一个缺陷,该函数从USB设备(作为u8)读取if_num值,并且不需要对数组进行长度检查就使用它来索引数组,从而导致在hs ...

  3. 关于Android studio调用高德地图的简单流程和要点

    一,账号与Key的申请 注册成为高德开发者需要分三步: 第一步,注册高德开发者:第二步,去控制台创建应用:第三步,获取Key. 前2步都比较简单,这里说下第三步. 获取Key 1.进入控制台,创建一个 ...

  4. 110、通过案例学习Secret (Swarm17)

    参考https://www.cnblogs.com/CloudMan6/p/8098761.html   在下面的例子中,我们会部署一个 WordPress 应用,WordPress 是流行的开源博客 ...

  5. mysql设计与优化以及数据库表设计与表开发规范

    一.设计问题? 1.主键是用自增还是UUID ? Innodb 中的主键是聚簇索引. 如果主键是自增的,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的 ...

  6. FormData传输文件

    function uploadfile() { var inputThis = $(this); var thisOrderId = inputThis.parent().attr("dat ...

  7. zabbix磁盘的自动发现与磁盘指标监控

    由于最近项目上需要对服务器监控进行规范化监控,再磁盘这块有几种方式 1.如果每台设备的磁盘是一样的 比如都有vda,vdb两块磁盘那么可以采用 1.1 每台客户端写脚本,服务端每台设备去加上监控项(- ...

  8. java并发编程:锁的相关概念介绍

    理解同步,最好先把java中锁相关的概念弄清楚,有助于我们更好的去理解.学习同步.java语言中与锁有关的几个概念主要是:可重入锁.读写锁.可中断锁.公平锁 一.可重入锁 synchronized和R ...

  9. git配置ssh秘钥(公钥以及私钥)linux

    本文默认已经安装git,并有github或者gitlab账号 git在linux下安装参考:https://www.cnblogs.com/lz0925/p/10791147.html 在Linux中 ...

  10. 三,k8s集群的应用入门

    目录 kubernetes集群简单应用 kubectl常用命令: 创建pod service创建 测试其他pod通过series访问nginx 测试手动变更nginx对应的pod的ip pod和ser ...