据说是保序回归问题?

业界都在用的算法是将序列分成若干段,然后每段取个平均值生成一个不降的b序列

至于为啥是对的?我也不知道啊

一开始想写个主席树

然后懒癌发作选择了反复二分的咸鱼做法

先考虑50分怎么做的,我们使用一个栈存储所有的段,

然后每次插入一个段的时候保证单调栈中每一段全部是单调递增的就ok了

提取一段的方差可以用平均数的平方减去平方的平均数来算

现在来考虑100分怎么搞

由于每次都是假如这个位置变成了xxx的修改,因此考虑将左侧前缀和右侧后缀的单调栈拼接在一起

将所有询问离线,然后假定更改的元素不会引起右侧单调栈的变化,然后尝试将这个点插入到左侧单调栈当中

使用二分而不是均摊的pop可以做到log的复杂度

此时我们得到了左侧的段,然后假定此时我们得到的左边界就是正确的,然后尝试将这一整段插入到右侧单调栈当中

借助二分法这一步的复杂度自然是log的

然后接着假定右侧的边界就是正确的边界,那么以此为依据去二分左侧

如此反复迭代若干次就可以得到正确的解了

局的这东西和单纯形算法很像,都是随机卡不掉但是构造就跪了的东西

但是事实上出题人为了卡掉仅仅二分一次的算法就竭尽全力的,所以迭代6,7次就能过了

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;const int N=1e5+10;typedef long long ll;
typedef long double ld;const ll mod=998244353;
ll inv[N];ll ansmid[N],ansleft[N],ansright[N];
int cur_round;
inline void pre()
{inv[0]=inv[1]=1;for(int i=2;i<N;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
struct data
{ll cnt0;ll cnt1;ll cnt2;friend data operator +(data a,data b){return (data){a.cnt0+b.cnt0,a.cnt1+b.cnt1,(a.cnt2+b.cnt2)%mod};}friend data operator -(data a,data b){return (data){a.cnt0-b.cnt0,a.cnt1-b.cnt1,(a.cnt2+mod-b.cnt2)%mod};}friend bool operator <(data a,data b){if(cur_round)return (ld)(a.cnt1)/(a.cnt0)<(ld)(b.cnt1)/(b.cnt0);else return (ld)(a.cnt1)/(a.cnt0)>(ld)(b.cnt1)/(b.cnt0); }inline ll cval(){ll tval=cnt1%mod;(tval*=tval)%=mod;return (cnt2+tval*(mod-inv[cnt0]))%mod;}
}st[N],sum[N];ll ansst[N];int tp;int n;int m;
struct qry
{int id;data tmp;data ori;
};
vector <qry> vq[N];ll a[N];
inline void ins_ele(data tmp)
{st[++tp]=tmp;while(tp>1&&st[tp]<st[tp-1])st[tp-1]=st[tp-1]+st[tp],tp--;sum[tp]=st[tp]+sum[tp-1];ansst[tp]=(st[tp].cval()+ansst[tp-1])%mod;
}
inline data fastpop(data qry,ll& mans,ll& mans2)
{int l=0;int r=tp;while(l!=r){int mid=(l+r+1)>>1;if(st[mid]<(sum[tp]-sum[mid]+qry))l=mid;else r=mid-1;}mans2=(sum[tp]-sum[l]+qry).cval();mans=ansst[l];//printf("fast pop locte=%d %lld %lld\n",l,mans2,mans);return sum[tp]-sum[l];
}
int main()
{//freopen("mtst.in","r",stdin);pre();scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%lld",&a[i]);cur_round=1;for(int i=1;i<=n;i++)ins_ele((data){1,a[i],(a[i]*a[i])%mod});printf("%lld\n",ansst[tp]);for(int i=1,u,k;i<=m;i++){scanf("%d%d",&u,&k);data nw=(data){1,k,(ll)k*k%mod};vq[u].push_back((qry){i,nw,nw});}   for(int z=1;z<=20;z++){//  printf("z=%d,front:\n",z);cur_round=1;tp=0;for(int i=1;i<=n;i++){for(vector <qry> :: iterator it=vq[i].begin();it!=vq[i].end();++it)it->tmp=it->ori+fastpop(it->tmp,ansleft[it->id],ansmid[it->id]);ins_ele((data){1,a[i],a[i]*a[i]%mod});}cur_round=0;//  printf("z=%d,back:\n",z);tp=0;for(int i=n;i>=1;i--){for(vector <qry> :: iterator it=vq[i].begin();it!=vq[i].end();++it)it->tmp=it->ori+fastpop(it->tmp,ansright[it->id],ansmid[it->id]);ins_ele((data){1,a[i],a[i]*a[i]%mod});}}for(int i=1;i<=m;i++)printf("%lld\n",(ansleft[i]+ansmid[i]+ansright[i])%mod);return 0;
}

转载于:https://www.cnblogs.com/sweetphoenix/p/10814987.html

#loj3059 HNOI2019 序列相关推荐

  1. 学习手记(2021/3/19~?)

    上一篇有点多就开新的了 文章目录 树哈希 wqswqswqs二分 单位根反演 威佐夫博弈 范德蒙德行列式 BEST定理 平面图欧拉定理 FWT转移矩阵的推导 保序回归 一些数学小结论 范德蒙德卷积 乘 ...

  2. 判断某数组是不是二叉树的前序遍历序列 python递归

    code class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) <= 0 ...

  3. pytorch中如何处理RNN输入变长序列padding

    一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练 ...

  4. PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战

    版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢!http://blog.csdn.net/m0_37306360/article/details/79318644 简介 在这个项目中,我们 ...

  5. 支持向量机SVM序列最小优化算法SMO

    支持向量机(Support Vector Machine)由V.N. Vapnik,A.Y. Chervonenkis,C. Cortes 等在1964年提出.序列最小优化算法(Sequential ...

  6. LeetCode简单题之最长特殊序列 Ⅰ

    题目 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 .如果不存在,则返回 -1 . 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的子序列) ...

  7. GStreamer 1.0 series序列示例

    GStreamer 1.0 series序列示例 OpenEmbedded layer for GStreamer 1.0 这layer层为GStreamer 1.0框架提供了非官方的支持,用于Ope ...

  8. 微调BERT:序列级和令牌级应用程序

    微调BERT:序列级和令牌级应用程序 Fine-Tuning BERT for Sequence-Level and Token-Level Applications 为自然语言处理应用程序设计了不同 ...

  9. 【剑指Offer】23、二叉搜索树的后序遍历序列

      题目描述:   输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同.   解题思路:   对于后续遍历序列,序 ...

最新文章

  1. 小代码 细心体会 含3对父子编程
  2. 通过Soul看微内核架构(二)
  3. 中国科学院、东南大学等联合发表最新的视觉 Transformer 综述
  4. x9此计算机上没有hasp_为什么我在别人电脑上好装mastercam9,在自己电脑装不成功,它没有出现什么HASP驱动安装的提示,为什么...
  5. HttpClient的性能隐患
  6. 聊天室程序python_Python聊天室程序(基础版)
  7. 通俗易懂的语言解释下股票、基金、证券、债券、信托、期货、国债、外汇?
  8. SQL Server查询执行计划–基础
  9. dd-wrt 定时重连 pppoe 更换ip地址
  10. [转载] kotlin 字符串_Kotlin基本类型字符串
  11. 百度文库付费文档完整查看_无需付费直接下载百度文库!
  12. [绍棠] SwiftyJSON的使用详解
  13. rs232接口_RS232串口通信:接口定义、标准接法详细说明,一看就懂了
  14. 贪心算法及其经典例题
  15. 哪吒2之大闹东海电影项目亮点怎么样?
  16. H.266/VVC代码学习:MIP技术相关代码之initIntraMip函数
  17. Latex、如何将word中的表格转换为Latex代码
  18. Webpack:Loader学习—— Pitching Loader
  19. Python中break语句和continue语句的用法
  20. 三维重建技术 各种方法简介

热门文章

  1. android翻盖手机双屏显示,使用双屏翻盖手机是一种怎样的体验?
  2. Mybatis引用静态常量或者枚举类型
  3. Vue.js 3.0 学习笔记(七)class与style绑定
  4. Android 内存检测工具
  5. 中国移动手机话费查询号码1008611
  6. trim()函数的含义及使用方法
  7. VScode+Unity3D的配置
  8. 游戏开发者注意了,小心触犯任天堂的这些专利
  9. Java--贪吃蛇日志
  10. 人工智能的创业方向到底怎么选?