689D - Friends and Subsequences

题意:

  • 大致跟之前题目一样,用ST表维护a[]区间max,b[]区间min,找出多少对(l,r)使得maxa(l,r) == minb(l,r)
  • 切题的感觉很爽唉
  • 同样而二分查找,找最小和最大下标满足条件
  • cf中%I64d, 一般是%lld

代码:

#include<bits/stdc++.h>
#define ll long long
const int maxn=200010;
int sta[maxn][18];
int stb[maxn][18];
int a[maxn];
int b[maxn];
ll res;
int n;
void build(){
int maxl=floor(log2(n));
for(int i=1;i<=n;i++){
sta[i][0]=a[i];
stb[i][0]=b[i];
}
int mul=1;
for(int j=1;j<=maxl;j++){
for(int i=1;i<=n&&(i+mul)<=n;i++){
sta[i][j]=std::max(sta[i][j-1],sta[i+mul][j-1]);
stb[i][j]=std::min(stb[i][j-1],stb[i+mul][j-1]);
}
mul=mul*2;
}
}
int check(int x,int y){
int len=floor(log2(y-x+1));
int maxa=std::max(sta[x][len],sta[y-(1<<len)+1][len]);
int minb=std::min(stb[x][len],stb[y-(1<<len)+1][len]);
//printf("db x:%d y:%d maxa: %d minb %d\n",x,y,maxa,minb);
return maxa-minb;
}
// find min() key=0
//find max() key=0
int b1(int begin,int end){
int l=begin,r=end,m;
while(l<r){
m=l+((r-l)>>1);
if(check(begin,m)<0) l=m+1;
else r=m;
}
if(check(begin,l)==0) return l;
return -1;
}
int b2(int begin,int end){
int l=begin,r=end,m;
while(l<r){
m=l+((r-l+1)>>1);
if(check(begin,m)<=0) l=m;
else r=m-1;
}
if(check(begin,l)==0) return l;
return -1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
}
build(); res=0;
for(int i=1;i<=n;i++){
if(b1(i,n)==-1) continue;
int r1=b1(i,n);
int r2=b2(i,n);
res+=(r2-r1+1);
}
printf("%I64d\n",res);
}

CF 689D - Friends and Subsequences的更多相关文章

  1. CodeForces 689D Friends and Subsequences (RMQ+二分)

    Friends and Subsequences 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/H Description Mi ...

  2. CF 314C Sereja and Subsequences(树状数组)

    题目链接:http://codeforces.com/problemset/problem/314/C 题意:给定一个数列a.(1)写出a的不同的所有非下降子列:(2)定义某个子列的f值为数列中各个数 ...

  3. CodeForces 689D Friends and Subsequences

    枚举,二分,$RMQ$. 对于一个序列来说,如果固定区间左端点,随着右端点的增大,最大值肯定是非递减的,最小值肯定是非递增的. 因此,根据这种单调性,我们可以枚举区间左端点$L$,二分找到第一个位置$ ...

  4. 689D Friends and Subsequences RMQ+二分

    题目大意:给出两个数组,求第一个数组区间内的最大值和第二个区间内的最小值相同的区间有多少种. 题目思路:通过预处理(O(n*Logn))后,每次查询的时间复杂度为O(1),但是如果暴力查询O(n*n) ...

  5. Solution -「CF 1132G」Greedy Subsequences

    \(\mathcal{Description}\)   Link.   定义 \(\{a\}\) 最长贪心严格上升子序列(LGIS) \(\{b\}\) 为满足以下两点的最长序列: \(\{b\}\) ...

  6. Magolor的数据结构作业

    \(CodeForces 706E ~Working routine\) 给出一个矩阵,每次操作交换两个子矩阵,求最后状态. 使用链表存储,每次交换后,影响到的之后矩阵边缘的指针,暴力修改. \(~~ ...

  7. codeforces 689D D. Friends and Subsequences(RMQ+二分)

    题目链接: D. Friends and Subsequences time limit per test 2 seconds memory limit per test 512 megabytes ...

  8. CF 843 A. Sorting by Subsequences

    A. Sorting by Subsequences You are given a sequence a1, a2, ..., an consisting of different integers ...

  9. cf 843 A Sorting by Subsequences [建图]

    题面: 传送门 思路: 这道题乍一看有点难 但是实际上研究一番以后会发现,对于每一个位置只会有一个数要去那里,还有一个数要离开 那么只要把每个数和他将要去的那个位置连起来,构成了一个每个点只有一个入边 ...

随机推荐

  1. 序列模型(4)----门控循环单元(GRU)

    一.GRU 其中, rt表示重置门,zt表示更新门. 重置门决定是否将之前的状态忘记.(作用相当于合并了 LSTM 中的遗忘门和传入门) 当rt趋于0的时候,前一个时刻的状态信息ht−1会被忘掉,隐藏 ...

  2. P1422 小玉家的电费

    ... 题目描述 夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了.小玉家今天收到了一份电费通知单.小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千 ...

  3. [网络流24题] 最长k可重区间集问题 (费用流)

    洛谷传送门 LOJ传送门 很巧妙的建图啊...刚了$1h$也没想出来,最后看的题解 发现这道题并不类似于我们平时做的网络流题,它是在序列上的,且很难建出来二分图的形. 那就让它在序列上待着吧= = 对 ...

  4. CSS3 创建简单的网页动画 – 实现弹跳球动

    基础准备对于这个实现,我们需要一个简单的 div ,并且样式类名为 ball : HTML 代码: <div class="ball"></div> 我们将 ...

  5. 猫狗分类--Tensorflow实现

    贴一张自己画的思维导图  数据集准备 kaggle猫狗大战数据集(训练),微软的不需要FQ 12500张cat 12500张dog 生成图片路径和标签的List step1:获取D:/Study/Py ...

  6. 数据库-mongodb-索引

    1.索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建立索引 2.在mongodb中,索引可以按字段升序.降序来创建,便于排序 3.默认是使用btree 来组织索引文件,2.4版以后 ...

  7. T4系列文章之1:认识T4

    一.导读 MSDN:Code Generation and T4 Text Templates 博客园:编写T4模板进行代码生成 Oleg Sych系列文章:http://www.olegsych.c ...

  8. 压力工具代码及epoll使用

    服务器编程 P347的压力工具代码不错,对于epoll用的好,可以看.

  9. android优化 清除无效代码 UCDetector

    android下优化 清除无效 未被使用的 代码 UCDetector 官方下载地址:http://www.ucdetector.org/index.html UCDetector  是 eclips ...

  10. R语言基础-数组和列表

    数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, dim),当中data必须 ...