当前位置: 首页 > news >正文

Codeforces Round 1047 (Div. 3) F题题解记录

大致题意:令F(x,y)F(x,y)F(x,y):对于任意与xxx的前缀最大值相同的数组zzz,满足zi=yiz_i=y_izi=yiiii的个数。x,y,zx,y,zx,y,z数组大小均相同。给定xxxyyy,求∑i=1n∑j=inF(subarrayx[i,j],subarrayy[i,j])\sum_{i=1}^{n}\sum_{j=i}^{n}F(subarray_x[i,j],subarray_y[i,j])i=1nj=inF(subarrayx[i,j],subarrayy[i,j])
解:
考虑贡献。对于xi=yix_i=y_ixi=yi,包含iii位置的子数组都会贡献+1+1+1。共有i×(n−i+1)i \times (n-i+1)i×(ni+1)。否则:首先由于前缀最大值的要求,对于xxx的子数组,我们随便考虑一个2,4,1,32,4,1,32,4,1,3,首先i=1i=1i=1的时候,ziz_izi必须取222i=2i=2i=2的时候,z2z_2z2必须取444;但是对于i=3,4i=3,4i=3,4ziz_izi均可取小于等于444的任何数,因为此时前缀最大值都相同。也就是说,对于iii,其左边第一个大于等于他的数的位置ppp,左端点从111ppp这段区间内,ziz_izi都可以取[1,xp][1,x_p][1,xp]。如果此时bi∈[1,xp]b_i\in[1,x_p]bi[1,xp],那么就没问题,ziz_izi完全可以变成yiy_iyi;但是如果大于xpx_pxp,那么此时ppp的范围就需要缩小了。我们需要将ppp的位置再往前推,找到第一个大于等于yiy_iyi的数的位置,因为这个位置下ziz_izi的范围可以囊括yiy_iyi。故针对每个位置iii,我们需要记录:离iii最近的大于等于aia_iai的数的位置以及大于等于bib_ibi的数的位置。前者可以通过单调栈实现,后者可以用单调栈+二分实现。

void solve() {int n;cin >> n;vector<int> a(n + 1), b(n + 1);for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++)cin >> b[i];int ans = 0;for (int i = 1; i <= n; i++) {if (a[i] == b[i])ans += (i) * (n - i + 1);}deque<int> q;vector<int> idx1(n + 1);for (int i = 1; i <= n; i++) {if (q.empty())q.push_back(i);else {while (!q.empty() && a[i] > a[q.back()]) q.pop_back();if (!q.empty()) {idx1[i] = q.back();}q.push_back(i);}}vector<int> pp(n + 1);int sz = 0;for (int i = 1; i <= n; i++) {if (sz == 0)pp[++sz] = i;else {while (sz && a[i] > a[pp[sz]])sz--;if (sz) {int l = 1, r = sz;int as = -1;while (l <= r) {int mid = (l + r + 1) >> 1;if (a[pp[mid]] >= b[i]) {as = max(as, mid);l = mid + 1;} else {r = mid - 1;}}if (as != -1 && a[i] != b[i]) {ans += min(pp[as], idx1[i]) * (n - i + 1);}}pp[++sz] = i;}}cout << ans << endl;
}

idx1idx1idx1为前者,pppppp为后者。另外需要注意:如果aia_iai等于bib_ibi,不要重复计算贡献。

http://www.dtcms.com/a/406608.html

相关文章:

  • 基于 Redis 的分布式锁
  • 郑州视频网站建设wordpress登录去不了后台
  • 淮安做网站杨凯企业建站官网运营
  • django 使用绑定多个数据库实现数据的同步
  • 面试复习题---Android技术专家3
  • 云手机与人工智能之间的关系
  • 做网站对电脑要求高吗荆州市住房和城乡建设厅官方网站
  • Python 高效实现 PDF 转 Word:告别手动复制粘贴
  • 9.9元奶茶项目:matlab+FPGA的cordic算法(向量模式)计算相位角
  • 广州越秀公司网站建设电子商务基础网站建设与维护单项选择题
  • 网站技术培训学校世界知名网站
  • 专业做消防工程师的正规网站做网站百度推广多少钱
  • mysql的 启动 与 客户端连接
  • 【星海出品】rabbitMQ队列处理深入研究
  • Mysql常见八股文
  • 社交类网站开发需求怎么做个人网页
  • 解析01背包
  • WitTkChart:基于Python tkinter Canvas的开源图表可视化库
  • NIST公布后量子加密标准的第五种算法HQC
  • NetCore+Web客户端实现gRPC实时推送
  • Bugku-想蹭网先解开密码
  • 房屋管理系统开发流程
  • 新浪云怎么做淘宝客网站科技与狠活是什么意思
  • Vue3 v-slot 详解与示例
  • Agno 架构介绍:高性 Multi-agent 系统框架深度解析
  • 哪里有南宁网站建设天河区建设和水务局网站
  • Cadence Allegro 电子设计 快问快答--03.OrCAD颜色在哪里设置?
  • 自己做的网站怎么上排行榜设计广告专业制作
  • 网站页面下沉的特效代码山西seo推广系统
  • S7-200 SMART GET/PUT 指令深度解析:从参数到故障排查(S7 协议的客户端 - 服务器通信)下