洛谷 P10798 「CZOI-R1」消除威胁

news/2024/12/23 1:28:00/

题目来源于:洛谷

题目本质:贪心,st表,单调栈

解题思路:由于昨天联练习了平衡树,我就用平衡树+STL打了个暴力,超时得了30分

这是暴力代码:

#include<bits/stdc++.h>
using namespace std;
unordered_map<int,int> h;
unordered_map<int,int> last;
const int N=5e5+10; 
struct edge{int l,r;int val;
}tr[N*4];
int n;
int a[N];
struct tree{int p;int next;
}e[N];
int ll(int x){return x<<1;
}
int rr(int x){return x<<1|1;
}
void build(int p,int l,int r){tr[p].l=l;tr[p].r=r;if(l==r){tr[p].val=abs(a[l]);return ;}int mid=l+r>>1;build(ll(p),l,mid);build(rr(p),mid+1,r);tr[p].val=max(tr[ll(p)].val,tr[rr(p)].val);
}
int ask(int p,int x,int y){if(x<=tr[p].l&&y>=tr[p].r){return tr[p].val;}int ans=-1e18;int mid=tr[p].l+tr[p].r>>1;if(x<=mid) ans=max(ask(ll(p),x,y),ans);if(y>mid) ans=max(ask(rr(p),x,y),ans);return ans;
}
signed main(){scanf("%d",&n);bool jude=true;int r=1e9+1;for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(r==1e9+1) r=abs(a[i]);else if(r!=abs(a[i])) jude=false;if(last[abs(a[i])]==0){if(a[i]>0) a[i]=-a[i];last[abs(a[i])]=1;}else{if(a[i]<0) a[i]=-a[i];last[abs(a[i])]=0;}e[i].p=i;e[i].next=h[a[i]];h[a[i]]=i;}if(jude){long long x=n/2;long long y=(n+1)/2;printf("%lld",x*(x-1)/2+y*(y-1)/2);return 0;}build(1,1,n);int sum=0; for(int i=1;i<=n;i++){for(int j=h[a[i]];j!=0;j=e[j].next){if(e[j].p<=i) break;;if(ask(1,i,e[j].p)==abs(a[i])) sum++;}}printf("%lld",sum);return 0;
} 

后来看了洛谷题解才晓得原来用比这个代码短多了的方法就能实现,注意到可以进行任意次取反操作,而对同一个数做两次取反相当于没做,所以问题可以转化成每一个数取不取反。直接使用绝对值就好了。如果当前元素小于栈顶元素,就直接插进去。如果当前元素大于栈顶元素,破坏了单调栈的单调性,就一直弹栈顶元素,弹到栈顶元素小于等于当前元素。如果栈顶元素等于当前元素,那么以栈顶元素为开始的连续威胁区间个数cnt(stop​))加 1。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int n;
int a[500005], cnt[500005];
stack<int> s;
int f[500005];
int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];a[i] = abs(a[i]);}for (int i = 1; i <= n; i++) {while (!s.empty() && a[s.top()] < a[i])s.pop();if (!s.empty() && a[s.top()] == a[i])cnt[s.top()]++;elses.push(i);}long long ans = 0;for (int i = 1; i <= n; i++) {int N = cnt[i] + 1, M = N / 2;if (!a[i])ans += 1ll * N * (N - 1) / 2;elseans += 1ll * M * (M - 1) / 2 + 1ll * (N - M) * (N - M - 1) / 2;}cout << ans;return 0;
}


http://www.ppmy.cn/news/1523237.html

相关文章

Windows环境下 VS2022 编译 LAME 源码

LAME LAME 是一个非常流行的开源 MP3 编码器库&#xff0c;它的全称是 “LAME Ain’t an MP3 Encoder”&#xff0c;这是一个带有讽刺意味的名字&#xff0c;因为 LAME 实际上是一个功能强大的 MP3 编码器。LAME 的开发始于 1998 年&#xff0c;目的是创建一个开放源代码的库&a…

147.最小栈

题目 链接&#xff1a;leetcode链接 思路 这道题目做起来还是比较简单的&#xff0c;使用两个栈就可以实现题目要求。 其中一个栈s实现栈的基本功能&#xff0c;另一个栈mins实现检索最小元素的功能。 来看一下怎么样实现检索最小元素的功能呢&#xff1f; 我们可以这么…

智狐联创平台引入 Midjourney 绘画服务,开启创意新征程

作为人工智能领域创新平台&#xff0c;智狐联创宣布已全面支持 Midjourney 绘画服务&#xff0c;为广大用户带来全新的视觉创作体验。 智狐联创平台一直致力于为用户提供丰富多样且强大的人工智能服务与功能。此次接入 Midjourney 绘画服务&#xff0c;进一步丰富了其创作工具的…

报表生成---JFreeChart

JFreeChart 是一个开源的 Java 图表库&#xff0c;它提供了丰富的图表类型和灵活的定制选项&#xff0c;用于在 Java 应用程序中生成和显示图表。以下是 JFreeChart 的一些关键特点和功能&#xff1a; 多种图表类型&#xff1a;JFreeChart 支持多种图表类型&#xff0c;包括但不…

联众优车持续加大汽车金融服务投入与创新,赋能汽车消费新生态

近年来&#xff0c;中国汽车消费市场呈现出蓬勃发展的态势&#xff0c;而汽车金融服务作为降低购车门槛、优化购车体验的重要手段&#xff0c;正日益受到市场的青睐。《2023中国汽车消费趋势调查报告》显示&#xff0c;相较于前一年&#xff0c;今年选择汽车金融服务的市场消费…

gs_dump和gs_dumpall 迁移数据库

目录 0、源端实例收集AWR1、创建目录2、gs_dump - 业务停机3、gs_dumpall - 业务停机4、拷贝文件5、目标实例导入数据 0、源端实例收集AWR https://blog.csdn.net/hezuijiudexiaobai/article/details/134220949 1、创建目录 mkdir -p /pgdata/data/opengauss-57b399d8/dump/…

python_openCV_计算图片中的区域的黑色比例

希望对原始图片进行处理&#xff0c;然后计算图片上的黑色和白色的占比 上图&#xff0c; 原始图片 import numpy as np import cv2 import matplotlib.pyplot as pltdef cal_black(img_file):#功能&#xff1a; 计算图片中的区域的黑色比例#取图片中不同的位置进行计算&…

Spring中FactoryBean的高级用法实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…