TYVJ1432 楼兰图腾
Description
若三个点 (x_1,y_1),(x_2,y_2),(x_3,y_3 ) 满足 x_1<x_2<x_3, y_1>y_2 并且 y_3>y_2,则称这三个点构成"v"字图腾。
若三个点 (x_1,y_1),(x_2,y_2),(x_3,y_3 ) 满足 x_1<x_2<x_3, y_1<y_2 并且 y_3<y_2,则称这三个点构成"^"字图腾。
求平面上"v"和"^"字图腾的个数。
Input
第二行是n个数,分别代表y1,y2……yn
Output
Sample Input
5
1 5 3 2 4
Sample Output
3 4
这题乍一看水题,暴力O(n^2)好像可以过
仔细算就会发现,不行!!!
那我们就需要一种O(nlogn),甚至O(n)的算法
看“v”和“^”的满足条件有一些是不是很像线段树求逆序对呢
逆序对求法(线段树):逆序对
(其实我也不知道为什么,队测时自然想到线段树,没敢敲(吐血),错估了时间复杂度,以为是不如暴力的O(n^2logn))
还有一点,至少乘法原理你得想到吧,不知道的自己去学
先给暴力做法:
#include<cstdio>
int n,m,d[];long long ans1,ans2;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&d[i]);
for(int i=;i<=n;i++)
{
int lx=,rx=,ll=,rr=;
for(int j=;j<i;j++)
if(d[j]<d[i])lx++;
else ll++;
for(int j=i+;j<=n;j++)
if(d[j]<d[i])rx++;
else rr++;
ans1+=ll*rr;
ans2+=lx*rx;
}
printf("%lld %lld",ans1,ans2);
}
这个是最朴实无华的暴力了(TLE大法)
请看这句话(每个点的横、纵坐标的范围都是 1~N)
依据这个,可以小小优化暴力,下面给出暴力优化(并没有什么用,依然是TLE大法):
#include<cstdio>
int n,m,d[];long long ans1,ans2;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&d[i]);
for(int i=;i<=n;i++)
{
int lx=,ll=;
for(int j=;j<i;j++)
if(d[j]<d[i])ll++;
else lx++;
ans1+=ll*(d[i]--ll);
ans2+=lx*(n-d[i]-lx);
}
printf("%lld %lld",ans2,ans1);
}
以上纯属娱乐,相信大家都会写
那个优化可有用,那么让我们来看正解吧
线段树(或树状数组)
#include<cstdio>
#include<algorithm>
using namespace std;
int n,ans1,ans2;long long ans0,ans;
struct oo{int a,b,v;}s[];
void build(int x,int l,int r)
{
s[x].a=l,s[x].b=r;
if(l==r)return ;
build(x<<,l,l+r>>);
build(x<<|,(l+r>>)+,r);
}
void change(int x,int y)
{
s[x].v++;
if(s[x].a==s[x].b)return ;
int mid=s[x].a+s[x].b>>;
if(y<=mid)change(x<<,y);
else change(x<<|,y);
}
void get(int x,int y)
{
if(y>s[x].b){ans1+=s[x].v;return ;}
if(y<s[x].a){ans2+=s[x].v;return ;}
if(s[x].a==s[x].b)return ;
get(x<<,y);get(x<<|,y);
}
int main()
{
scanf("%d",&n);
build(,,);
for(int i=,x;i<=n;i++)
{
ans1=ans2=;
scanf("%d",&x),change(,x);
get(,x);
ans0+=ans1*(x--ans1),ans+=ans2*(n-x-ans2);
}
printf("%lld %lld",ans,ans0);
}
很短吧!!
祝大家早日AC!!!
TYVJ1432 楼兰图腾的更多相关文章
- CH4201 楼兰图腾
题意 4201 楼兰图腾 0x40「数据结构进阶」例题 描述 在完成了分配任务之后,西部314来到了楼兰古城的西部.相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀('V'), ...
- AcWing:241. 楼兰图腾(树状数组逆序对)
在完成了分配任务之后,西部314来到了楼兰古城的西部. 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(‘V’),一个部落崇拜铁锹(‘∧’),他们分别用V和∧的形状来代表各自 ...
- AcWing 241. 楼兰图腾 (树状数组)打卡
题目:https://www.acwing.com/problem/content/description/243/ 题意:给你n个点,问你 V 和 ^的图腾有多少个 思路:比如V 其实就是找当前点 ...
- AcWing 241 楼兰图腾 (树状数组)
在完成了分配任务之后,西部314来到了楼兰古城的西部. 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀('V'),一个部落崇拜铁锹('∧'),他们分别用V和∧的形状来代表各自 ...
- 【CH4201】楼兰图腾
题目大意:给定一个长度为 N 的序列,从序列中任意挑出三个数,求满足中间的数字值最小(最大)有多少种情况. 题解:建立在值域上的树状数组,从左到右扫描一遍序列,统计出每个点左边有多少个数大于(小于)该 ...
- tyvj 1432 楼兰图腾
树状数组 本题数据有误 对于每一个点用权值树状数组维护在这个点之后之前的比他大和比他小的数 #include <iostream> #include <cstdio> #inc ...
- AcWing 241.楼兰图腾 (树状数组,逆序对)
题意:在二维坐标轴上给你一些点,求出所有由三个点构成的v和∧图案的个数. 题解:因为给出的点是按横坐标的顺序给出的,所以我们可以先遍历然后求出某个点左边比它高和低的点的个数(这个过程简直和用树状数组求 ...
- AcWing 241. 楼兰图腾
#include<bits/stdc++.h> using namespace std; const int N=2e5+5; typedef long long ll; ll ans,l ...
- String Reversal
Educational Codeforces Round 96 (Rated for Div. 2) - E. String Reversal 跳转链接 题目描述 定义一个操作为交换字符串中相邻的两个 ...
随机推荐
- 在Visual Studio 2015中引用DLL的3种方法
1.把dll文件复制到可执行文件所在目录 2.将工程属性->配置属性->调试->工作目录更改为dll文件所在目录 3.将工程属性->配置属性->调试->环境设置为P ...
- SQL的分页算法
select top pageSize * from goods where goodsId not in (select top pageSize*(pageNow-1) goodsId from ...
- Codeforces Round #198 (Div. 2) E. Iahub and Permutations —— 容斥原理
题目链接:http://codeforces.com/contest/340/problem/E E. Iahub and Permutations time limit per test 1 sec ...
- Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stoc
今天在使用yum安装文件时,出现了以下问题: root@localhost opt]# yum update Loaded plugins: fastestmirror Could not retri ...
- IPFS - 可快速索引的版本化的点对点文件系统(草稿3)
摘要 星际文件系统是一种点对点的分布式文件系统, 旨在连接所有有相同的文件系统的计算机设备.在某些方面, IPFS类似于web, 但web 是中心化的,而IPFS是一个单一的Bittorrent 群集 ...
- python 基础之第八天--字典相关
zx #####################创建字典###################################### In [11]: dict([('name','bob'),('a ...
- some characters cannot be mapped using iso-8859-1 character encoding
Eclipse中新建一个.properties文件,如果输入中文保存时就会提示错误 Reason:some characters cannot be mapped using "ISO-88 ...
- bzoj 2006 [NOI2010]超级钢琴——ST表+堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 每个右端点的左端点在一个区间内:用堆记录端点位置.可选区间,按价值排序:拿出一个后也许 ...
- Firebug的安装与使用
第一步,点击 Firefox 浏览器上的“工具”选项,然后点击“附加软件”,在弹出的小窗口中,点击右下角的“获取扩展”选项,如图 4 所示. 图 4. 获取扩展 第二步,在点击“获取扩展”选项后,打开 ...
- java 内存管理机制
垃圾收集算法 1.标记清理算法:效率不高(标记和清理过程效率都不高).会形成内存碎片 2.复制算法:把内存分为两部分,当进行回收时,把使用部分的存活对象复制到未使用部分,然后两部分内存角色互换(一个为 ...