【vijos】1768 顺序对的值(特殊的技巧)

https://vijos.org/p/1768

之前不知道为什么,我yy了一个n^2的做法,但是没能写出来。。sad

然后看了题解才发现这题好神。。

为什么一定要照着题意找两个点然后算呢?这就是问题所在。。。

我们可以观察每一个点,发现他的贡献恰好是左边比他小的数和右边比他大的数组成的顺序对,那么一共有l*r对,所以答案就加上l*r

这种题的思想很好啊。。以后做这些题可以用个体来想整体,orz

(还有这题他们说lgn使用树状数组维护l和r,怎么维护啊QAQ

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << ‘\t‘; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<‘0‘||c>‘9‘; c=getchar()) if(c==‘-‘) k=-1; for(; c>=‘0‘&&c<=‘9‘; c=getchar()) r=r*10+c-‘0‘; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }

const int N=5005;
typedef long long ll;
int a[N], n;
ll ans;
int main() {
	read(n);
	for1(i, 1, n) read(a[i]);
	for1(i, 1, n) {
		ll l=0, r=0;
		for1(j, 1, i-1) if(a[j]<a[i]) ++l;
		for1(j, i+1, n) if(a[j]>a[i]) ++r;
		ans+=l*r;
	}
	printf("%lld\n", ans);
	return 0;
}

描述

给定一个序列a,a中任意两个元素都不等。如果i<j,且 a[i]<a[j],则我们称a[i],a[j]为一个顺序对,这个顺序对的值是指a[i+1],a[i+2]…….a[j-1]中比a[i]大, 且比a[j]小的数的个数。求一个序列中所有顺序对的值的和。

格式

输入格式

第一行一个数n,表示序列a中元素的个数。

第二行n个数,第i个数表示a[i]。

输出格式

输出一个数,序列a中所有顺序对的值的和。

样例1

样例输入1[复制]

5
1 5 3 4 2

样例输出1[复制]

1

限制

每个测试点2s。

提示

对于100%的数据,2<=n<=5000,a[i]<=10^9。

时间: 2024-11-05 18:51:51

【vijos】1768 顺序对的值(特殊的技巧)的相关文章

PHP中数组的foreach遍历顺序跟键值的关系

近两天,在做一个项目,遇到一个该用数据存储ID做键值还是用数据排序SORT_NO做数组键值的问题,考虑到如果使用数据存储ID作为键值放入数组遍历数组时会不会影响排序的问题,经过查询与验证,得到答案:foreach遍历数组的顺序是按照值存入数组的先后顺序进行遍历的,此为线性遍历,不受数组键值的大小顺序影响. 下面写个简单的例子描述一下问题: 数据库存储user:   自增ID 排序号SORT_NO 值VALUE 1 3 张三 2 2 李四 3 1 王五 通过sql语句:“select ID,SOR

WinForm 清空界面控件值的小技巧

原文:WinForm 清空界面控件值的小技巧 在WinForm里面有时候需要清空自己输入内容或是选择的选项,以便重新操作流程,那么一般你是怎么清空界面各个控件值的呢?如果窗体里面控件,尤其是TextBox控件比较多的时候,代码里面是不是要设置每个控件的Text属性值为空呢?下面我用这个例子,来探讨下清空界面控件值的小技巧.而且还能复用.不必每个窗体都做这些枯燥.无聊的工作. 一般的做法是在清除控件的事件里面添加下面这样的代码: 代码 private void btnClear_Click(obj

各种Map的区别,想在Map放入自定义顺序的键值对

今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map.map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map,它根据key的HashCode 值来存储数据,根据key可以直接

顺序统计中值

问题描述:无序找第k小的数? 1.解法一 先排好序,再找第k小个数:返回A[k-1]:此解法的时间复杂度为:O(nlogn): 2.解法二 情况一:k = 1 和 k = n 就是找数组的最小值和最大值: 情况二:找出中位数 3.找中位数(随机选择算法) 利用快速排序的原理,一轮排序,有2种情况: if i = k-1:返回a[i]: if i != k-1:左边/右边递归查找,时间复杂度为:O(n): 具体思想: 分析:在大多数情况下的时间复杂度是:O(n):但是最坏情况,完全顺序下找第k =

顺序表删除值为 x 的元素

思路: 不要去考虑删除的字眼,要考虑如何进行保存非 x 的值 这里提供两种解法,殊途同归: 1.将其中非 x 的元素统计并保存 2.统计为 x 的元素个数,并将非 x 的元素保存 注意事项: 注意这里代码由于使用了引用(&),只能在 C++ 中编译通过 使用指针的时候一定要注意开辟空间,否则之后可能发现无法预知的错误 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MaxSize 50 4 typedef

java后台如何根据表单中input的顺序获取value值

如果java后台准备用Servlet来实现,可以直接在doPost( )或者doGet( )中使用如下语句:request.setCharacterEndoding("UTF-8");//为了保证form有中文时不会出现乱码String name= request.getParameter("name");String value=request.getParameter("value");/***************************

数组值去重-小技巧

把值存为数组的键,利用键的特性来进行对值的去重,然后再用array_keys获取键值保存为新的数组即可达到去重的效果 $tmp_arr = array(); foreach ($key as $val) { $tmp_str = strval($val); $tmp_str !== '' and $tmp_arr[$tmp_str] = 1; } $key = array_keys($tmp_arr);

FreeMarker 对null值的处理技巧

1.判断是否存在,通过exists关键字或者"??"运算符.都将返回一个布尔值 user.name?exists user.name?? <#if user.name?exists> //TO DO </#if> <#if user.age??> //TO DO </#if> 2.忽略null值 假设前提:user.name为null ${user.name},异常 ${user.name!},显示空白 ${user.name!'vaki

冠亚和值对刷技巧

网上赌在哪玩[http://www.yicai6998.com/tz/]Q[836465901]致力打造最专业.最权威的娱乐平台,为玩家提供开奖结果.记录.历史.官网.平台等专业有用的信息,同时发布最新的网赌技巧与心得网上赌在哪玩[http://www.yicai6998.com/tz/]Q[836465901]致力打造最专业.最权威的娱乐平台,为玩家提供开奖结果.记录.历史.官网.平台等专业有用的信息,同时发布最新的网赌技巧与心得网上赌在哪玩[http://www.yicai6998.com/