AtCoder ABC 140E Second Sum

2023-05-16

题目链接:https://atcoder.jp/contests/abc140/tasks/abc140_e

题目大意

  给定一个 1~N 的排列 P.

  定义$X_{L, R}$的值为$P_L, P_{L+1}, \ldots, P_R$中第二大的数的值.

  求$\displaystyle \sum_{L=1}^{N-1} \sum_{R=L+1}^{N} X_{L,R}$.

分析

  这是一道求贡献的题, 也就是要算出每个数 x 作为第二大的时候对答案的贡献.
  为了计算 x 对答案的贡献, 我们需要知道 x 左边第一大的数的位置 Lpos1,  x 左边第二大的数的位置 Lpos2,  x 右边第一大的数的位置 Rpos1 和 x 右边第二大的数的位置 Rpos2.
  知道了这四个位置以后 x 对答案的贡献马上就能求出来了.
  怎么求就要用到静态链表了, 详细写在代码里了.

代码如下


  1 #include <bits/stdc++.h>
  2 using namespace std;
  3  
  4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  5 #define Rep(i,n) for (int i = 0; i < (n); ++i)
  6 #define For(i,s,t) for (int i = (s); i <= (t); ++i)
  7 #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
  8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
  9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
 12  
 13 #define pr(x) cout << #x << " = " << x << "  "
 14 #define prln(x) cout << #x << " = " << x << endl
 15  
 16 #define LOWBIT(x) ((x)&(-x))
 17  
 18 #define ALL(x) x.begin(),x.end()
 19 #define INS(x) inserter(x,x.begin())
 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end())
 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // ?? x ?????? c 
 22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower);
 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper);
 24  
 25 #define ms0(a) memset(a,0,sizeof(a))
 26 #define msI(a) memset(a,inf,sizeof(a))
 27 #define msM(a) memset(a,-1,sizeof(a))
 28 
 29 #define MP make_pair
 30 #define PB push_back
 31 #define ft first
 32 #define sd second
 33  
 34 template<typename T1, typename T2>
 35 istream &operator>>(istream &in, pair<T1, T2> &p) {
 36     in >> p.first >> p.second;
 37     return in;
 38 }
 39  
 40 template<typename T>
 41 istream &operator>>(istream &in, vector<T> &v) {
 42     for (auto &x: v)
 43         in >> x;
 44     return in;
 45 }
 46 
 47 template<typename T>
 48 ostream &operator<<(ostream &out, vector<T> &v) {
 49     Rep(i, v.size()) out << v[i] << " \n"[i == v.size()];
 50     return out;
 51 }
 52 
 53 template<typename T1, typename T2>
 54 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
 55     out << "[" << p.first << ", " << p.second << "]" << "\n";
 56     return out;
 57 }
 58 
 59 inline int gc(){
 60     static const int BUF = 1e7;
 61     static char buf[BUF], *bg = buf + BUF, *ed = bg;
 62     
 63     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
 64     return *bg++;
 65 } 
 66 
 67 inline int ri(){
 68     int x = 0, f = 1, c = gc();
 69     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
 70     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
 71     return x*f;
 72 }
 73 
 74 template<class T>
 75 inline string toString(T x) {
 76     ostringstream sout;
 77     sout << x;
 78     return sout.str();
 79 }
 80 
 81 inline int toInt(string s) {
 82     int v;
 83     istringstream sin(s);
 84     sin >> v;
 85     return v;
 86 }
 87 
 88 //min <= aim <= max
 89 template<typename T>
 90 inline bool BETWEEN(const T aim, const T min, const T max) {
 91     return min <= aim && aim <= max;
 92 }
 93  
 94 typedef long long LL;
 95 typedef unsigned long long uLL;
 96 typedef pair< double, double > PDD;
 97 typedef pair< int, int > PII;
 98 typedef pair< int, PII > PIPII;
 99 typedef pair< string, int > PSI;
100 typedef pair< int, PSI > PIPSI;
101 typedef set< int > SI;
102 typedef set< PII > SPII;
103 typedef vector< int > VI;
104 typedef vector< double > VD;
105 typedef vector< VI > VVI;
106 typedef vector< SI > VSI;
107 typedef vector< PII > VPII;
108 typedef map< int, int > MII;
109 typedef map< int, string > MIS;
110 typedef map< int, PII > MIPII;
111 typedef map< PII, int > MPIII;
112 typedef map< string, int > MSI;
113 typedef map< string, string > MSS;
114 typedef map< PII, string > MPIIS;
115 typedef map< PII, PII > MPIIPII;
116 typedef multimap< int, int > MMII;
117 typedef multimap< string, int > MMSI;
118 //typedef unordered_map< int, int > uMII;
119 typedef pair< LL, LL > PLL;
120 typedef vector< LL > VL;
121 typedef vector< VL > VVL;
122 typedef priority_queue< int > PQIMax;
123 typedef priority_queue< int, VI, greater< int > > PQIMin;
124 const double EPS = 1e-8;
125 const LL inf = 0x7fffffff;
126 const LL infLL = 0x7fffffffffffffffLL;
127 const LL mod = 1e9 + 7;
128 const int maxN = 1e5 + 7;
129 const LL ONE = 1;
130 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
131 const LL oddBits = 0x5555555555555555;
132 
133 int N;
134 int P[maxN];     // P数组为1~N的一组排列 
135 int pos[maxN];     // pos[i]为i在P数组中的位置 
136 int leftFirstMaxPos[maxN];     // leftFirstMaxPos[i]为i位置的数左边第一个比i大的数的位置,没有则为0
137 int rightFirstMaxPos[maxN]; // rightFirstMaxPos[i]为i位置的数右边第一个比i大的数的位置,没有则为N+1 
138 LL ans = 0; 
139 
140 int main(){
141     //freopen("MyOutput.txt","w",stdout);
142     //freopen("input.txt","r",stdin);
143     //INIT();
144     scanf("%d", &N);
145     For(i, 1, N) {
146         scanf("%d", &P[i]);
147         pos[P[i]] = i; 
148         // 后面是从1开始枚举,而1是最小的,所以1的左右最近大正好是相邻的两个数 
149         leftFirstMaxPos[i] = i - 1;
150         rightFirstMaxPos[i] = i + 1;
151     }
152     
153     // 计算每个数i为第二大的时候对答案的贡献 
154     For(i, 1, N) {
155         int Lpos1 = leftFirstMaxPos[pos[i]];     // i左边第一个比他大的数的位置 
156         int Lpos2 = leftFirstMaxPos[Lpos1];        // i左边第二个比他大的数的位置 
157         int Rpos1 = rightFirstMaxPos[pos[i]];    // i右边第一个比他大的数的位置 
158         int Rpos2 = rightFirstMaxPos[Rpos1];        // i右边第二个比他大的数的位置 
159         
160         if(Lpos1 != 0) ans += ONE * i * (Lpos1 - Lpos2) * (Rpos1 - pos[i]);
161         if(Rpos1 != N + 1) ans += ONE * i * (pos[i] - Lpos1) * (Rpos2 - Rpos1);
162         
163         // 更新 
164         /*
165             例如这个片段:
166                   1 2 3 4 5 6 7 
167                 P 6 3 1 2 5 4 7
168                 此时以i = 1为例
169                 本来leftFirstMaxPos[4] = 3, rightFirstMaxPos[2] = 3的
170                 计算完i = 1的贡献之后, leftFirstMaxPos[4] = 2, rightFirstMaxPos[2] = 4
171                 这一步更新相当于把1给砍掉了,剩下的数中2又是最小的数,于是2的左右最近大又正好是相邻的两个数 
172                 没错,非常像链表删除一个值的操作 
173                 leftFirstMaxPos就相当于静态链表的前驱数组
174                 rightFirstMaxPos就相当于静态链表的后继数组 
175         */ 
176         leftFirstMaxPos[Rpos1] = Lpos1;
177         rightFirstMaxPos[Lpos1] = Rpos1;
178     }
179     
180     printf("%lld", ans);
181     return 0;
182 }  
View Code

 

转载于:https://www.cnblogs.com/zaq19970105/p/11486861.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AtCoder ABC 140E Second Sum 的相关文章

  • C# 中的 Group By Sum Linq to SQL

    确实坚持使用 Linq to SQL 分组和求和 到处搜索 但我还不够了解 无法将其他解决方案应用到我自己的解决方案中 我的数据库中有一个名为 view ProjectTimeSummary 的视图 它具有以下字段 string UserD
  • 无效的设备符号 cudaMemcpyFromSymbol CUDA

    我想计算 CUDA 中数组所有元素的总和 我想出了这段代码 它编译没有任何错误 但结果始终为零 我收到了无效的设备符号cudaMemcpyFromSymbol 我无法使用 Thrust 或 Cublas 等任何库 define TRIALS
  • Sympy:指数相乘而不是总和指数相乘

    我正在搜索如何告诉 SymPy 使用指数乘法而不是总和的指数 也就是说 它当前给我 exp a b 我想要得到 exp a exp b 一定有一个相当简单的方法 但我似乎找不到 你可以使用expand http docs sympy org
  • 如何输出平均值的小数?

    我在显示平均值的小数时遇到问题 它一直显示 00 或 1 我尝试将其放入 double 中 但仍然得到相同的结果 另外 我想将输入的第一个整数包含在总和中 但我不知道如何操作 请帮助 import java io import java u
  • sum 函数如何在 python 中与 for 循环一起工作[重复]

    这个问题在这里已经有答案了 我在python中使用sum函数 我很清楚它的一般结构sum 可迭代 开始 但我无法理解以下代码背后的逻辑 test sum 5 for i in range 5 print output test 输出 25
  • MYSQL LEFT JOIN 与 GROUP BY

    我有 2 个查询 我需要加入它们 我需要将员工根据活动的工作时间与公司在规定时间段内同一活动的总工作时间进行比较 第一个查询是 SELECT u login a article p p article SUM p p going SUM p
  • 如何求和两个对象的属性?

    我有多个 JavaScript 对象 a 12 b 8 c 17 and a 2 b 4 c 1 我需要通过键对这两个对象求和 Result a 14 b 12 c 18 你有 JavaScript 的解决方案吗 我用Object keys
  • 标准机器学习中的部分总和?

    我是函数式编程的新手 我有一项任务来计算列表的部分和 例如 psum 1 1 1 1 1 val it 1 2 3 4 5 整数列表 这是到目前为止我的代码 然而 在函数 psum2 L 中 我不知道如何遍历每个值并将它们相加 所以我只是打
  • 如何在 SQL 中汇总从子级到父级的树状结构中的数据?

    我有一个查询 要求在树状结构中选择每个部门的金额 我想显示孩子们各自父母的总金额 是否可以在不使用游标的情况下将其存档在查询中 以下是要总结的数据结果集 完整的示例也可以在sqlfiddle http sqlfiddle com 4 ea0
  • C 中数组的递归和[重复]

    这个问题在这里已经有答案了 你好 我正在学习 C 中的递归 我试图找到元素的总和 这是我的主要 int main int arr 1 2 3 4 5 int sum sum arr sum arr 4 printf nsum is d su
  • 矩阵问题Python

    例如 如果我有矩阵 x 1 7 U1 1 5 8 U1 2 5 5 U2 如何获取 x 中除最后一个数据之外的所有数据 然后我需要对这些元素求和 这就是我需要的 sum 1 7 1 5 8 2 5 5 Thanks EDIT2 I try
  • Django 聚合:仅求和返回值?

    我有一个已付价值列表 并想显示已付总额 我已经使用了聚合和Sum一起计算值 问题是 我只想打印出总值 但聚合打印出 amount sum 480 0 480 0 为总增加值 在我看来 我有 from django db models imp
  • Python对二维列表中具有相同第一个值的元素求和

    我正在尝试找到一种有效的方法来执行以下操作 我有这个样本 sample no 2 6 ja 5 7 no 4 9 ja 10 11 ap 7 12 并且需要 res no 6 15 ja 15 18 ap 7 12 即对第一个元素相同的子列
  • Java 中 10,000 以内且 3、5 或 7 的倍数的数字之和

    我知道如何让程序将 3 5 和 7 中每一个的倍数总和相加 但我不确定如何让程序只使用每个数字一次 例如 我可以让程序找出所有数字并将它们相加为 3 然后对 5 执行相同操作 但数字 15 将出现在最终数字中两次 我不确定如何让它只接受一次
  • Google Sheet 产生无穷小数作为整数/整数的余数

    我有这个工作表 我需要在其中创建一个检查器来确定一个数字 两个数字之和除以另一个值 DIVISOR 的结果 是否是整数 没有小数 运行上述检查器后 它大部分工作得很好 但似乎检测到一些项目不是整数 尽管它们是除数的精确倍数 https do
  • 1 到 n 的整数之和

    我正在尝试编写一个程序来将 1 到 n 的数字相加 我已经设法让它多次打印数字 但不能将它们全部相加 它继续将两个数字相加 我的第一次尝试是 def problem1 3 n my sum 0 while my sum lt n my su
  • 当我加入第二个表时总和不正确

    这是我第一次请求你的帮助 实际上我必须创建一个查询 并为其做了一个类似的示例 我有两张桌子 Report ReportID Date headCount Production ProdID ReportID Quantity 我的问题是使用
  • 在 Rails 控制台中将大十进制转换为字符串

    我试图让我的控制台打印出我所有地点价目表定价的总和 我试图通过控制台完成此任务 但得到一个 BigDecimal 作为结果 纠结于如何将此结果转换为清晰的字符串或整数 Results Location pluck rate card sum
  • VB.NET LINQ 查询:获取特定结构成员的所有值的总和

    在 VB NET 中 假设我有以下结构 Public Structure Product Public ItemNo As Int32 Public Description As String Public Cost As Decimal
  • 自定义类上的 List.sum

    我有以下代表 GF2 字段的代码 trait GF2 def unary this def that GF2 GF2 def that GF2 GF2 def that GF2 that match case Zero gt throw n

随机推荐

  • 视频教程-C++多线程编程视频教程(C++11多线程并发)-C/C++

    C 43 43 多线程编程视频教程 xff08 C 43 43 11多线程并发 xff09 黄强老师 xff0c 国家软件设计师 xff0c 软件开发工程师 xff0c 项目经理 产品经理 培训讲师 创业合伙人 xff0c 多年C C 43
  • 【Luogu P1661】扩散

    题目 xff1a 一个点每过一个单位时间就会向四个方向扩散一个距离 xff0c 如图 两个点 a b 连通 xff0c 记作 e a b 当且仅当 a b 的扩散区域有公共部分 连通块的定义是块内的任意两个点 u v 都必定存在路径 e u
  • Linux让Apache支持中文URL图片/文件名

    需要用到iconv hook和mod encoding Apache xff08 32位 xff09 xff1a 安装环境 xff1a CentOS 5 6 43 Apache 2 2 15 xff08 Apache2 4同样适用 xff0
  • 解决VS2015安装后stdio.h ucrtd.lib等文件无法识别问题,即include+lib环境变量配置

    转载自 xff1a http blog csdn net carl qi article details 51171280 今天突然想在windows上装个 VS2015 玩玩 xff0c 结果遇到了如下bug xff1a 安装完 VS20
  • 算法基础复习-动态规划

    1 动态规划 xff08 Dynamic Programming xff0c DP xff09 动态规划通常用来求解复杂问题的某个最优解 xff0c 与分治法相似 xff0c 区别在于 分治法应用于子问题互不相交的情况 xff0c 即递归的
  • 数据结构|-常见数据结构整理

    归纳总结了一下数据机构的常用类型 xff0c 个人理解常用的数据机构可以分为线性表 栈 队列 树 xff0c 线性表包括顺序表和链表 xff0c 栈和队列应当属于特殊的线性表 xff0c 有几个概念和误区需要先说一下 顺序表和线性表的关系
  • Xcode5 创建模板和UIView 关联XIB

    来源 xff1a http www cnblogs com china ldw p 3533896 html 在做ios应用开发的过程 xff0c 难免遇到要创建 子view 和 自定义view的时候 xff0c 归根到底 xff0c 我们
  • opencv中矩阵计算的一些函数

    转自 xff1a http blog sina com cn s blog 7908e1290101i97z html 综述 OpenCV有针对矩阵操作的C语言函数 许多其他方法提供了更加方便的C 43 43 接口 xff0c 其效率与Op
  • mysql中对比 JSON_VALUE 与 JSON_QUERY

    1 JSON概述 MySQL里的json分为json array和json object 表示整个json对象 xff0c 在索引数据时用下标 对于json array xff0c 从0开始 或键值 对于json object xff0c
  • Win10系统的Microsoft Edge浏览器打开任一网页均未响应卡死的问题

    Edge浏览器在刚装上WIN10的时候就使用了 xff0c 的确给人耳目一新 xff0c 使用起来也非常顺心的感觉 xff0c 总体上还是很感人的 xff0c 可是今天使用突然出现随便打开一个网页都会卡死 xff0c 未响应的问题 xff0
  • 用二进制方法求两个整数的最大公约数(GCD)

    二进制GCD算法基本原理是 先用移位的方式对两个数除2 xff0c 直到两个数不同时为偶数 然后将剩下的偶数 xff08 如果有的话 xff09 做同样的操作 xff0c 这样做的原因是如果u和v中u为偶数 v为奇数 xff0c 则有gcd
  • SQL SERVER解析Json

    外包的项目 xff0c 有很多信息存储在JSON中 xff0c 无论是查询还是修改信息都十分麻烦 找了一些实用的SQL Function去解析 xff0c 并附修改例子 使用过程 xff1a 1 需要在SQL新建自定义类型 table Hi
  • c++ 头文件循环引用解法

    A h include 34 B h 34 class A public B m b B h include 34 A h 34 class B public A m a 上面这样是编译不过的 xff0c 把A h中的 include 34
  • 搭建ceph集群(单节点)

    https blog csdn net Greenchess article details 77525786 软件环境 xff1a Centos7 x64 CEPH版本 xff1a ceph deploy v1 5 37 ceph ver
  • Java-SpringCloud-基础

    一 服务注册与发现 服务注册 xff1a 服务提供者将服务的信息 xff08 IP 端口 协议等 xff09 登记到注册中心服务发现 xff1a 服务消费者根据一定策略从注册中心的服务列表选取一个服务 1 eureka span class
  • Ubuntu休眠不能唤醒问题之分区惹的祸

    问题描述 xff1a 休眠后进行唤醒时一直黑屏或内核错误 经历如下 xff1a 在笔记本上添加了固态硬盘后直接将机械硬盘上的系统拷贝到固态盘中使用 xff0c 设置了swap分区 xff0c 在唤醒时内核报告ext4文件系统错误 在lily
  • 用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现

    觉得此编文章很详实 xff0c 故转载之 xff0c 来自http www amobbs com thread 5281512 1 1 html 开发板也差不多买了半年了 以前照着教程用的是软件是ADS 在win7下老是崩溃 后来才知道AD
  • 【洛谷 3366】最小生成树_Prim

    题目描述 如题 xff0c 给出一个无向图 xff0c 求出最小生成树 xff0c 如果该图不连通 xff0c 则输出orz 输入格式 第一行包含两个整数N M xff0c 表示该图共有N个结点和M条无向边 xff08 N lt 61 50
  • 远程rdp vnc连接 UBuntu 10.10

    我打算用ubuntu编译Android源码 xff0c 因为编译时间较长需要远程控制一下自己的电脑 xff0c 所以想到了安装远程桌面软件 xff0c 具体方法 xff1a Ubuntu下的操作 1 Win7远程连接上Ubuntu xff0
  • AtCoder ABC 140E Second Sum

    题目链接 xff1a https atcoder jp contests abc140 tasks abc140 e 题目大意 给定一个 1 N 的排列 P 定义 X L R 的值为 P L P L 43 1 ldots P R 中第二大的