[CSP-S模拟测试]:统计(树状数组+乱搞)
题目传送门(内部题120)
输入格式
第一行,两个正整数$n,m$。
第二行,$n$个正整数$a_1,a_2,...,a_n$,保证$1\leqslant a_i\leqslant n$,可能存在相同值。
第三行,$m$个正整数$j_1,j_2,...,j_m$,保证$1\leqslant j_k\leqslant n$。
输出格式
第一行,第一个整数表示操作前的逆序对数量,接下来$m$个整数表示每次操作后的逆序对数量。
样例
样例输入:
6 2
1 3 4 2 6 1
2 3
样例输出:
6 3 1
数据范围与提示
样例解释:
第一次操作:由$1\ 3\ 4\ 2\ 6\ 1$变为$1\ 1\ 4\ 2\ 6\ 3$。
第二次操作:由$1\ 1\ 4\ 2\ 6\ 3$变为$1\ 1\ 2\ 3\ 6\ 4$。
加粗标记的是这次操作影响到的数。
数据范围:
对于$40\%$的数据,$1\leqslant n,m\leqslant 200$。
对于$60\%$的数据,$1\leqslant n,m\leqslant 2,000$。
对于$80\%$的数据,$1\leqslant n,m\leqslant 20,000$。
对于$100\%$的数据,$1\leqslant n,m\leqslant 200,000,1\leqslant a_i\leqslant n,1\leqslant j_k\leqslant n$。
题解
$\Theta(n\log n)$求逆序对在此不再赘述。
打开大样例,发现很多都是一样的,于是考虑乱搞……
发现,如果在前面某一次操作时动了某个位置,如果现在还动这个位置则对逆序对个数是没有影响的(相当与没动),直接输出上一次的结果即可。
时间复杂度:$\Theta(n^2\log n)$。
期望得分:$60$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[200001],top;
int e[200001],b[200001];
int tr[200010];
bool vis[200001];
long long ans;
int lowbit(int x){return x&-x;}
void add(int x){for(int i=x;i;i-=lowbit(i))tr[i]++;}
int ask(int x){int res=0;for(int i=x;i<=n+1;i+=lowbit(i))res+=tr[i];return res;}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){ans+=ask(a[i]+1);add(a[i]);}
printf("%lld ",ans);
while(m--)
{
int k;
scanf("%d",&k);
if(vis[k]){printf("%lld ",ans);continue;}
if(!ans){puts("0");continue;}
ans=top=0;
for(int i=1;i<=n;i++)tr[i]=0;
for(int i=k;i<=n;i++)
if(a[i]<=a[k])
{
vis[i]=1;
e[++top]=a[i];
b[top]=i;
}
sort(e+1,e+top+1);
for(int i=1;i<=top;i++)a[b[i]]=e[i];
for(int i=1;i<=n;i++){ans+=ask(a[i]+1);add(a[i]);}
printf("%lld ",ans);
}
return 0;
}
rp++
[CSP-S模拟测试]:统计(树状数组+乱搞)的更多相关文章
- BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 4750 Solved: 2145[Submi ...
- NOIP模拟 Work - 二分 + 树状数组 / ???
题目分析 如果没有最后的注意事项,此题就是二分裸题.有了注意事项,会有两种思路: 在线:二分天数t,并在主席树上求1~t天中大于d(浪费的时间)的时间之和以及数量,答案即为:sum - d * cnt ...
- GZOI 2017配对统计 树状数组
题目 https://www.luogu.com.cn/problem/P5677 分析 最开始读题的时候没有读的太懂,以为i是在选定区间内给的,实际上不是,这道题的意思应该是在l和r的区间内找出有多 ...
- 2018.10.08 NOIP模拟 栅栏(树状数组+rand)
传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...
- [CSP-S模拟测试]:军训队列(DP+乱搞)
题目描述 有$n$名学生参加军训,军训的一大重要内容就是走队列,而一个队列的不规整程度是该队中最高的学生的身高与最矮的学生的身高差值的平方.现在要将$n$名参加军训的学生重新分成$k$个队列,每个队列 ...
- HDU 2689 Sort it【树状数组】
Sort it Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- 【BZOJ2141】排队 树状数组+分块
[BZOJ2141]排队 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备 ...
- gym 100589A queries on the Tree 树状数组 + 分块
题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...
随机推荐
- JAVA文件类工具
FileUtil package cn.jiangzeyin.util.file; import org.springframework.util.Assert; import java.io.*; ...
- MyBatis的foreach查询(List、Array、Map)
mybatis 中 foreach collection的三种用法 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index ...
- Hadoop大数据平台入门——HDFS和MapReduce
随着硬件水平的不断提高,需要处理数据的大小也越来越大.大家都知道,现在大数据有多火爆,都认为21世纪是大数据的世纪.当然我也想打上时代的便车.所以今天来学习一下大数据存储和处理. 随着数据的不断变大, ...
- TP-Link 路由器 如何在现有的环境中改善无线信号传输质量
http://service.tp-link.com.cn/detail_article_346.html
- Nginx请求限制配置
Nginx请求限制配置 请求限制可以通过两种方式来配置,分别是 连接频率限制和请求频率限制 首先我们要知道什么是http请求和连接,浏览器和服务端首先通过三次握手完成连接,然后发起请求,传输请求参数 ...
- 使用Ant打包工具
由于使用java,javac,jar等工具进行编译打包,即繁琐低效又容易出错,因此Ant出现了.Ant的出现就是专门为了打包编译java代码的,使用之前得稍微学一下.Ant的运行起来主要是依靠配置文件 ...
- centos 7 安装 Oracle 12c
#!/bin/bash #!/usr/bin/expect -f #/etc/sysctl.conf --bash-srcipts-- echo 'net.ipv6.conf.all.disable_ ...
- python分别获取虚拟网卡和真实网卡ip
#!/usr/bin/python # -*- coding: utf-8 -*- import commands import socket import fcntl import struct C ...
- PAT Basic 1016 部分A+B (15 分)
正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA.例如:给定 8,DA=6,则 A 的“6 部分”PA 是 66,因为 A 中有 ...
- 生产者消费者问题--synchronized
# 代码 public class App { public static void main(String[] args) { Depot depot = new Depot(100); Produ ...