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

十大网站app软件下载门户网站后台

十大网站app软件下载,门户网站后台,企业网站设计合同,万方网官网入口题目链接&#xff1a;Problem - F - Codeforces 题目大意&#xff1a; n (n < 1e5) 本书&#xff0c;一类是数学书一类是经济书&#xff0c;每本书上都有若干道题目 (ai < 1e9)。 q (q < 1e5) 次查询&#xff0c;每次查询一段区间 [l,r] &#xff0c;求 [l,r] 内所…

题目链接:Problem - F - Codeforces

题目大意:

n (n <= 1e5) 本书,一类是数学书一类是经济书,每本书上都有若干道题目 (ai <= 1e9)。

q (q <= 1e5) 次查询,每次查询一段区间 [l,r] ,求 [l,r] 内所有满足 " 数学书的题目数量之和 - 经济书的题目数量之和 = k " (每个询问的 k 都是同一个固定值)的所有子区间的数量

Solution:

无修改,区间查询,k 值固定,可以离线,又想到莫队了。

首先肯定预处理经济书的数目为负值,这样我们就可以简化问题为:一段连续区间的和 = k

于是可以前缀和快速计算,下面记作 pre 数组。

考虑移动区间时如何计算答案的变化,先考虑 add 操作,sub 操作就是逆过程

1. 当前区间 [l,r] ,添加 r+1 (下面记作 x)这个位置的值,计算对答案增加的贡献:

    增加的贡献就是 "后缀和 = k" 的子区间的数目。

    即:pre[x] - pre[i-1] == k  ->  pre[i-1] == pre[x] - k  ( i-1 \in  [l-1,r] )

2. 当前区间 [l,r] ,添加 l-1 (下面记作 x)这个位置的值,计算对答案增加的贡献:   

    增加的贡献就是 "缀和 = k" 的子区间的数目。

    即:pre[i] - pre[x-1] == k  ->  pre[i] == pre[x-1] + k  ( i \in  [l-1,r] )

于是问题就转化为了:维护区间内 pre[i] 等于 "pre[x] - k" 和 "pre[x-1] + k" 的 i 的个数,我们可以维护 [l,r] 范围内的,至于 l-1 这样边界的地方特判就好了。sub 就是逆过程。

还有个问题是,用 map 直接维护会多带一个 log ,而开一个 int 类型的桶又会超空间。

注意到无修改且 k 固定的情况下,每个位置 i 要维护的就只是 pre[i] + k 和 pre[i] - k,因此所有要维护的值不会很多,因此用离散化预处理后就可以开个 int 类型的桶维护了。

还有个细节是我们在 第二种情况 里,有一项是 "pre[x-1] + k" ,当x = 1的时候 x-1 = 0,也就是说我们还需要维护 0 这个位置的贡献,要把 -k,0,k 这三个数都放进去一起离散化

Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;#define N 100005int n,m,p,B,bel[N];
long long k,w[N],b[N],c[N * 3],pre[N],ans[N],res,cnt[N * 3];struct Node
{int id0,id1,id2;
}a[N * 3];struct Query
{int l,r,id;
}q[N];int get(long long x) { return lower_bound(c + 1,c + m + 1,x) - c ;}int cmp(Query x,Query y)
{if(bel[x.l] == bel[y.l]) return x.r < y.r ;return x.l < y.l ;
}void add(int x,int op)
{if(!op) res += cnt[a[x - 1].id2];else res += cnt[a[x].id0];++ cnt[a[x].id1];return;
}void sub(int x,int op)
{-- cnt[a[x].id1];if(!op) res -= cnt[a[x - 1].id2];else res -= cnt[a[x].id0];return;
}int main()
{memset(cnt,0,sizeof cnt);scanf("%d%lld",&n,&k),pre[0] = res = 0ll,m = 0;for (int i = 1;i <= n;++ i) scanf("%lld",&b[i]);for (int i = 1;i <= n;++ i){scanf("%lld",&w[i]);if(b[i] == 2) w[i] = -1ll * w[i];pre[i] = pre[i - 1] + w[i];c[++ m] = pre[i] - k;c[++ m] = pre[i];c[++ m] = pre[i] + k;}c[++ m] = -k;c[++ m] = 0ll;c[++ m] = k;sort(c + 1,c + m + 1);m = unique(c + 1,c + m + 1) - c - 1;for (int i = 0;i <= n;++ i)a[i].id0 = get(pre[i] - k),a[i].id1 = get(pre[i]),a[i].id2 = get(pre[i] + k);scanf("%d",&p);B = (int)sqrt(n);for (int i = 1;i <= p;++ i){scanf("%d%d",&q[i].l,&q[i].r);q[i].id = i;bel[i] = (i - 1) / B + 1;}sort(q + 1,q + p + 1,cmp);int l,r;l = 1,r = 0;for (int i = 1;i <= n;++ i){while (l > q[i].l) add(-- l,0),res += (w[l] == k);while (l < q[i].l) res -= (w[l] == k),sub(l ++,0);while (r < q[i].r) add(++ r,1),res += (pre[l - 1] == pre[r] - k);while (r > q[i].r) res -= (pre[l - 1] == pre[r] - k),sub(r --,1);ans[q[i].id] = res;}for (int i = 1;i <= p;++ i) printf("%lld\n",ans[i]);return 0;
}

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

相关文章:

  • 网站建设与维护前景特价服务器
  • 怎样看网站是什么语言做的wordpress微信 群发
  • 建筑规范网站九度互联网站推广公司
  • 网站如何做超链接怎么做网站的自然排名
  • 建设广告联盟网站idc网站模板源码下载
  • 制作网站要花多少钱网站后台权限管理怎么做的
  • 番禺做网站费用wordpress的按装方法
  • 做网站北京网站建设的广告投入
  • 中高端社交网站建设服务商注册小公司要交税吗
  • 网站开发一个人可以完成吗关于网站规划建设方案书
  • seo网络贸易网站推广博客网站开发
  • 许昌建设局网站郑州seo外包收费标准
  • 云南网站设计哪家好网络营销推广引流方式
  • 课程商城网站模板ios wordpress使用
  • 曲周网站建设网站seo的方法
  • 南京网站建设服务公司字体设计在线生成
  • 建设网站入什么科目巩义网站
  • 怎样在阿里做网站温州最牛叉的seo
  • 做网站犯法了 程序员有责任吗家居设计网站模板
  • 十大中国网站制作网络营销师报名入口
  • 做我的世界背景图的网站信息公开暨网站建设管理办法
  • 网站运行速度优化网站开发 男生
  • 新邵县住房和城乡建设局网站做网站能接到模具单吗
  • 网站建设可视化autohome汽车之家官网
  • 贵州省铁路建设办公室网站内部优惠券网站怎么做
  • 网站免费维护建立网站企业咨询方案
  • 上海有哪些网站设计公司做网站运营的要求
  • 廊坊外贸网站建设2021跨境电商最火的产品
  • 哪里有网站建设定制网站建设分为哪些方面
  • 字体图标制作网站建设证书查询官方网站