Zigzags CodeForces - 1400D

给出一组数:
寻找四元组的个数
(i,j,k,l)其中a[i]=a[k],并且a[j]=a[l]
刚看到这个题的时候想到了记录每个数的个数,然后求前缀和以及后缀和。先枚举i和k,当a[i]和a[k]相等时,在枚举i和k之间的数,然后在将前缀和与后缀和相乘,但是这样复杂度是o(n^3),显然过不了。看了大佬的blog,发现有个更好的思路,我们现在枚举了i和k对吧,i-----k,而题目的要求是k---i---k---i,那就直接在i左边找个K并且在k后边找个i然后将他们出现的次数相乘就完了呗!
code:
#include<bits/stdc++.h>
using namespace std;
const int N=3e3+;
long long preious_sum[N][N];//表示sum[i][j]表示前i个数,j出现的次数
long long later_sum[N][N];
int arr[N];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=;i<=n;i++) {
cin>>arr[i];
preious_sum[i][arr[i]]++;
later_sum[i][arr[i]]++;
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
preious_sum[i][j]+=preious_sum[i-][j];
}
}
for(int i=n;i>=;i--){
for(int j=;j<=n;j++){
later_sum[i][j]+=later_sum[i+][j];
}
}
long long ans=;
for(int i=;i<=n;i++){
for(int j=i+;j<n;j++){
ans+=preious_sum[i-][arr[j]]*later_sum[j+][arr[i]];
}
}
cout<<ans<<endl;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
later_sum[i][j]=preious_sum[i][j]=;
}
} return ;
}
另外一种写法。
code:
#include <stdio.h>
#define maxn 3010
#define LL long long
int a[maxn],cnt[maxn];
int main(){
int t,n,i,j,sum;
LL ans;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=;i<=n;i++)scanf("%d",&a[i]);
for(i=;i<=n;i++)cnt[i]=;
ans=;
//i1---j2
//当前循环枚举的是i1和j2,cnt[]记录的是a[i1]出现的次数.
//j1---i1---j2---i2
//当枚举到i1=i,j2=j时,sum记录的是从i到j各个数出现的和,而cnt[k]就是在i1之前元素k出现的次数。sum累加就相当于寻找a[j1]=a[j2]的过程
//当a[i]==a[j]的时候,说明i2找到了,i2=j,然后就可以更新答案了,更新完之后,j继续往后,因为后边可能还会有和a[i]相等的元素,找到再累加。
for(i=;i<=n;i++){
sum=;
for(j=i+;j<=n;j++){
if(a[i]==a[j])ans+=sum;
sum+=cnt[a[j]];
}
cnt[a[i]]++;//第i个数出现的次数
}
printf("%lld\n",ans);
}
return ;
}
Zigzags CodeForces - 1400D的更多相关文章
- Educational Codeforces Round 94 (Rated for Div. 2) String Similarity、RPG Protagonist、Binary String Reconstruction、Zigzags 思维
题目链接:String Similarity 题意: 首先题目定义了两个串的相似(串的构成是0.1),如果两个串存在对于一个下标k,它们的值一样,那么这两个串就相似 然后题目给你一个长度为2n-1的串 ...
- 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 ...
- CodeForces 228D. Zigzag(线段树暴力)
D. Zigzag time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...
- Educational Codeforces Round 94 (Rated for Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1400 A. String Similarity 题意 给出一个长 $2n-1$ 的二进制串 $s$,构造一个长 $n$ 的字 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
随机推荐
- P1429 平面最近点对[加强版] 随机化
LINK:平面最近点对 加强版 有一种分治的做法 因为按照x排序分治再按y排序 可以证明每次一个只会和周边的六个点进行更新. 好像不算很难 这里给出一种随机化的做法. 前置知识是旋转坐标系 即以某个点 ...
- 5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp
LINK:小B的夏令营 这道题是以前从没见过的优化dp的方法 不过也在情理之中. 注意读题 千万不要像我这个sb一样 考完连题意都不知道是啥. 一个长方形 要求从上到下联通的概率. 容易发现 K天只是 ...
- [转]为什么阿里巴巴要禁用Executors创建线程池?
作者:何甜甜在吗 链接:https://juejin.im/post/5dc41c165188257bad4d9e69 来源:掘金 看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executo ...
- 洛谷3月月赛div2 题解(模拟+数学+贪心+数学)
由于本人太蒻了,div1的没有参加,胡乱写了写div2的代码就赶过来了. T1 苏联人 题目背景 题目名称是吸引你点进来的. 这是一道正常的题,和苏联没有任何关系. 题目描述 你在打 EE Round ...
- Android Studio--APK打包
首先在app的build.gradle里面加一下代码 lintOptions { checkReleaseBuilds false abortOnError false } 在上方Build里面找到G ...
- 蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率
识别验证码一直是本人想要做的事情,一直在接触按键精灵,了解到有一个虹鱼图灵识别插件专门做验证码和图像识别,原理就是图片处理和制作字库识别,制作字库我一直觉得很麻烦,工程量太大.不管怎样,它能用能达到我 ...
- 我给这个Python库打101分!
日志在开发过程中是一种被很多程序员 不重视 ,但是却 至关重要 的一项功能. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案 ...
- Linux(Centos 7)下安装Git并配置连接GitHub
1.安装git Centos7 查看git --version 2.配置用户名密码 git config --global user.name "xxx" git config ...
- Springboot日志LOGO改变和设计
每次启动Springboot的时候,SpringBoot都会打印一个LOGO,那么这个LOGO是可以关闭和改变的. 1.关闭Springboot的LOGO 2.改变Springboot的日志LOGO ...
- Java中编写代码出现异常,如何抛出异常,如何捕获异常
异常的产生过程解析 先运行下面的程序,程序会产生一个数组索引越界异常ArrayIndexOfBoundsException.我们通过图解来解析下异常产生的过程. 工具类 class ArrayTool ...