CF1400-D. Zigzags

题意:

给出一个由\(n\)个数字构成的数组\(a\),让你在这个数组中找出有多少个符合以下要求的元组\((i,j,k,l)\):

1. \(i<j<k<l\);

2. \(a_i==a_k,a_j=a_l\).

思路:

维护两个前缀和\(pre,suf\)。\(pre\)维护前\(i\)个数字中数字\(j\)的数量,\(suf\)维护后\(i\)个数字中数字\(j\)的数量。

那么只需要枚举每一个\(j\)和\(k\),用前缀和找出前\(j-1\)个数字中\(a[k]\)的数量\(pre[j-1][a[k]]\)和后\(k+1\)个数字中\(a[j]\)的数量\(suf[k+1][a[j]]\),两个数字相乘就是对于当前\(j,k\)符合要求的元组的数量。最后累加起来就是答案。

\(ans=\sum_{2<=j<k<=n-1}pre[j-1][a[k]]*suf[k+1][a[j]]\)


AC代码:

代码中的下标都是从\(0\)开始的,思路中提到的下标都是从\(1\)开始的。

#include <cstdio>
#include <cstring>
#include <iostream> typedef long long ll; const int Maxn = 3005; int pre[Maxn][Maxn], suf[Maxn][Maxn], a[Maxn]; void solve() {
memset(pre, 0, sizeof pre);
memset(suf, 0, sizeof suf);
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", a + i);
}
pre[0][a[0]]++;
for (int i = 1; i < n; i++) {
for (int j = 0; j <= n; j++) {
pre[i][j] = pre[i - 1][j];
}
pre[i][a[i]]++;
}
suf[n - 1][a[n - 1]]++;
for (int i = n - 2; i >= 0; i--) {
for (int j = 0; j <= n; j++) {
suf[i][j] = suf[i + 1][j];
}
suf[i][a[i]]++;
}
ll ans = 0;
for (int j = 1; j <= n - 3; j++) {
for (int k = j + 1; k <= n - 2; k++) {
ans += 1LL * pre[j - 1][a[k]] * suf[k + 1][a[j]];
}
}
printf("%lld\n", ans);
} int main() {
int T;
scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}

CF1400-D. Zigzags的更多相关文章

  1. Educational Codeforces Round 94 (Rated for Div. 2) String Similarity、RPG Protagonist、Binary String Reconstruction、Zigzags 思维

    题目链接:String Similarity 题意: 首先题目定义了两个串的相似(串的构成是0.1),如果两个串存在对于一个下标k,它们的值一样,那么这两个串就相似 然后题目给你一个长度为2n-1的串 ...

  2. Zigzags CodeForces - 1400D

    给出一组数: 寻找四元组的个数 (i,j,k,l)其中a[i]=a[k],并且a[j]=a[l] 刚看到这个题的时候想到了记录每个数的个数,然后求前缀和以及后缀和.先枚举i和k,当a[i]和a[k]相 ...

  3. Educational Codeforces Round 94 (Rated for Div. 2) D. Zigzags (枚举,前缀和)

    题意:有一长度为\(n(4\le n\le 3000)\)的数组,选择四个位置\((i,j,k,l)\ (1\le i<j<k\le n)\),使得\(a_i=a_k\)并且\(a_j=a ...

  4. Deep Learning in a Nutshell: History and Training

    Deep Learning in a Nutshell: History and Training This series of blog posts aims to provide an intui ...

  5. CodeForces 228D. Zigzag(线段树暴力)

    D. Zigzag time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...

  6. hbot固件配置

    又入了一台打印机,171到手,本来之前有更好的,无奈别人下手太快,只剩这台了. 175x135x180的样子. 创客的板,还带16g的闪迪内存卡,看到那会儿感觉赚大了! 拿到的时候不少螺丝松的,有的打 ...

  7. varints

    Protocol Buffer技术详解(数据编码) - Stephen_Liu - 博客园 https://www.cnblogs.com/stephen-liu74/archive/2013/01/ ...

  8. L117

    Hoover has become a household word for a vacuum cleaner through the world.Economics are slowly killi ...

  9. 实时流处理Storm、Spark Streaming、Samza、Flink孰优孰劣

    对于一个成熟的消息中间件而言,消息格式不仅关系到功能维度的扩展,还牵涉到性能维度的优化.随着Kafka的迅猛发展,其消息格式也在不断的升级改进,从0.8.x版本开始到现在的1.1.x版本,Kafka的 ...

随机推荐

  1. node爬虫 -- 网页图片

    相信大家都听说过爬虫,我们也听说过Python是可以很方便地爬取网络上的图片,但是奈何本人不会Python,就只有通过 Node 来实践一下了.   接下来看我如何 板砖 ! !!   

  2. 【IMP】导出的时候显示ddl建表语句

    导出数据后,在导入的时候想要显示出建表语句,可以用show=y这个选项来实现 imp test/test file=test.dmp ignore=y show=y fromuser=test1 to ...

  3. kubernets之Deployment资源

    一  声明式的升级应用 1.1  回顾一下kubernets集群里面部署一个应用的形态应该是什么样子的,通过一副简单的图来描述一下 通过RC或者RS里面的模板创建了三个pod,之后通过一个servci ...

  4. 删除开发账号的ACCESS KEY

    大家都知道,当申请一个开发账号来开发程序的时候需要一个ACCESS key,这个key我们可以通过系统管理员在OSS上注册, 也可以通过一些软件来计算,比如zapgui.EXE,但是当用软件注册完,不 ...

  5. Angular学习资料大全和常用语法汇总(让后端程序员轻松上手)

    前言: 首先为什么要写这样的一篇文章呢?主要是因为前段时间写过一些关于Angualr的相关实战文章,有些爱学习的小伙伴对这方面比较感兴趣,但是又不知道该怎么入手(因为认识我的大多数小伙伴都是后端的同学 ...

  6. 4、剑指offer——从尾到头打印链表java实现

    **题目描述** **输入一个链表,按链表从尾到头的顺序返回一个ArrayList.** 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 思路:   1.如果链 ...

  7. SVN 常见问题及解决方法

    1.已跳过 'XXX' -- 节点处于冲突状态 解决方法:cd 进入到出错文件夹或文件所在目录,执行: svn resolved ./文件名(文件夹名)

  8. URI与URL傻傻分不清楚?

    前言 总所周知,缓存是解决Http1.1协议传输性能的问题中最主要的手段. 缓存既可以存在于浏览器上,也可以存在于服务器中. 而影响缓存的Http头部有很多,其中Cache-Control是比较重要的 ...

  9. luogu p2622

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  10. Centos7 安装RabbitMQ 3.6.1

    如果你看过前两章对RabbitMQ已经有了一定了解,现在已经摩拳擦掌,来吧动手吧! 用什么系统 本文使用的是Centos7,为了保证对linux不太熟悉的伙伴也能轻松上手(避免折在安装的路上),下面是 ...