codeforces 1156E Special Segments of Permutation
题目链接:https://codeforc.es/contest/1156/problem/E
题目大意:
在数组p中可以找到多少个不同的l,r满足。
思路:
ST表+并查集。
ST表还是需要的,因为nlongn的预处理就可以O(1)查询。枚举所有的区间也就O(n^2)。
因为是输入固定1-n,所以我可以设一个y数组表示数组p的值所对应的下标。
(习惯输入为x数组)
我们考虑一个区间[l,r]这个区间最大值为i。(这里用ST表可以找到)
[l,r]对答案的贡献为最大值i左边找一个值a,右边找一个值b,满足a+b==i。有多少个不同的a,b对。
我们可以枚举i左右两边长度小的区间。然后在大区间上找。(小区间就可以少枚举点不是吗?最坏左右区间长度一样总共也就nlongn次)。
然后的问题是怎样找快速查找。
我们用并查集。
把大区间的所有值加入在大区间的最大值上。
你一定疑惑这样做还是会超时的啊。
如果在我们得到这个区间对答案的贡献后,把i左右两区间的最大值加在i上就可以完美的解决这个问题了。
我们直接从区间[1,n]开始,向下遍历,稍微注意一下边缘条件就OK啦。
整个就像一个线段树呢。
人太垃圾,ST表直接复制的板子,如有抄袭希望可以交个朋友哈~~
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);
#define int long long
#define N 200100
#define mod 1000000007 int x[N];
int y[N]; int pre[N];
int find(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];
int i=x,j;
while(i!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void join(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
{
pre[a]=b;
}
}
void into()
{
for(int i=; i<N; i++)
{
pre[i]=i;
}
} int st[N][]; void init(int n)
{
n++;
for (int i = ; i < n; i++)
st[i][] = x[i]; for (int j = ; ( << j) <= n; j++)
{
for (int i = ; i + ( << j) - < n; i++)
st[i][j] = max(st[i][j - ],st[i + ( << (j - ))][j - ]);
}
} int search(int l, int r)
{
int k = (int)(log((double)(r - l + )) / log(2.0));
return max(st[l][k],st[r - ( << k) + ][k]);
} int Ans;
void dfs(int i,int l,int r)
{
int a=,b=;
if(y[i]>l)
{
a=search(l,y[i]-);
//cout<<i<<" "<<a<<endl;
dfs(a,l,y[i]-);
}
if(y[i]<r)
{
b=search(y[i]+,r);
//cout<<i<<" "<<b<<endl;
dfs(b,y[i]+,r);
} if(r-y[i]<y[i]-l)
{
for(int j=y[i]+; j<=r; j++)
{
if(find(i-x[j])==a)
{
Ans++;
}
}
}
else
{
for(int j=l; j<=y[i]-; j++)
{
if(find(i-x[j])==b)
{
Ans++;
}
}
}
if(a)
join(a,i);
if(b)
join(b,i);
} signed main()
{
IOS;
into(); int n,a;
cin>>n; for(int i=; i<=n; i++)
{
cin>>x[i];
y[x[i]]=i;
} init(n); dfs(n,,n); cout<<Ans; return ;
}
codeforces 1156E Special Segments of Permutation的更多相关文章
- Codeforces 1156E Special Segments of Permutation(单调栈)
可以用单调栈直接维护出ai所能覆盖到的最大的左右范围是什么,然后我们可以用这个范围暴力的去查询这个区间的是否有满足的点对,一个小坑点,要对左右区间的大小进行判断,只需要去枚举距离i最近的一段区间去枚举 ...
- Codeforces 1156E Special Segments of Permutation(启发式合并)
题意: 给一个n的排列,求满足a[l]+a[r]=max(l,r)的(l,r)对数,max(l,r)指的是l到r之间的最大a[p] n<=2e5 思路: 先用单调栈处理出每个点能扩展的l[i], ...
- Special Segments of Permutation - CodeForces - 1156E (笛卡尔树上的启发式合并)
题意 给定一个全排列\(a\). 定义子区间\([l,r]\),当且仅当\(a_l + a_r = Max[l,r]\). 求\(a\)序列中子区间的个数. 题解 笛卡尔树上的启发式合并. \(200 ...
- CF1156E Special Segments of Permutation
思路:笛卡尔树?(好像并不一定要建出来,但是可以更好理解) 提交:2次 错因:没有判左右儿子是否为空来回溯导致它T了 题解: 建出笛卡尔树,考虑如何计算答案: 先预处理每一个值出现的位置 \(pos[ ...
- codeforces 895B XK Segments 二分 思维
codeforces 895B XK Segments 题目大意: 寻找符合要求的\((i,j)\)对,有:\[a_i \le a_j \] 同时存在\(k\),且\(k\)能够被\(x\)整除,\( ...
- Codeforces 785 E. Anton and Permutation(分块,树状数组)
Codeforces 785 E. Anton and Permutation 题目大意:给出n,q.n代表有一个元素从1到n的数组(对应索引1~n),q表示有q个查询.每次查询给出两个数l,r,要求 ...
- CodeForces 219B Special Offer! Super Price 999 Bourles!
Special Offer! Super Price 999 Bourles! Time Limit:1000MS Memory Limit:262144KB 64bit IO For ...
- CodeForces 691D:Swaps in Permutation(并查集)
http://codeforces.com/contest/691/problem/D D. Swaps in Permutation You are given a permutation of ...
- codeforces 676A A. Nicholas and Permutation(水题)
题目链接: A. Nicholas and Permutation time limit per test 1 second memory limit per test 256 megabytes i ...
随机推荐
- CodeForces - 841D Leha and another game about graph
给出一个连通图,并给每个点赋一个d值0或1或-1,要求选出一个边的集合,使得所有的点i要么d[i] == -1,要么 dgree[i] % 2 == d[i],dgree[i]代表i结点的度数. 考虑 ...
- 生成不带版本的jar包 不影响deploy
1 How to build maven project without version? 工程pom中增加 <project> ... <build> ... <fin ...
- VCL界面控件DevExpress VCL Controls发布v19.1.2|附下载
DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...
- 转:ThreadLocal剖析
转自http://www.cnblogs.com/dolphin0520/p/3920407.html 一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方 ...
- curl检查访问网页返回的状态码
urls=('www.baidu.com' 'mm.yellowurl.cn' 'm.yellowurl.cn' 'http://m.yellowurl.cn/product/a.html'); fo ...
- 【转】h5页面audio不自动播放问题
1.audio:html5音频标签 <audio loop src="/photo/aa.mp3" id="audio" autoplay preload ...
- 【NOIP2016提高A组模拟9.17】序列
题目 分析 首先用\(a_i\)表示达到目标的步数\(B_i-A_i(mod 4)\) 根据粉刷栅栏,先不管mod 4的情况,答案就是\(\sum\max(a_i-a_{i+1},0)\) 那我们刚才 ...
- null转为数字的坑
在项目中,需要用到某个字段等于0时来处理逻辑 if (+item.ext === 0) {} // 前面的+号是转为数字 // 如果item.ext 为 null时, +item.ext 就等于 0 ...
- 24.二叉树中和为某一值的路径(python)
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- MySQL5.7数据转移至SQL Server详解
本文链接:https://blog.csdn.net/qq_37308779/article/details/80679358一.安装MySQL ODBC驱动为MySQL安装Connector/ODB ...