5222. 【GDOI2018模拟7.12】A
Description
Input
Output
Sample Input
3 2 2 3 1 1 1
Sample Output
2 1 1
Data Constraint
Hint
Solution
这道题要用到逆序对和权值线段树的知识。 首先,我们可以发现一个重要的性质:因为一个数的逆序对个数是在它后面且比它要小的数,所以当我们对一个数进行操作时,所有在它后面且比它大的数对逆序对总数的贡献是不变的,而在它后面且比它小的数的逆序对的数量就永远是0了,因为这些数已经被排过序了,而这些数后面的数要么是排过序的(所以比它大)要么是大于被操作的数的(而被排序的这些数一定是小于被操作数)。所以我们就可以找出每个位置最早对答案没有贡献的时刻,就可以统计每个时刻的逆序对数量了。怎么做呢?令t[i]表示第i个位置最早被操作的时间(重复操作对答案没有像影响),一个位置i的逆序对的贡献变为0的最早的时刻就是它或它前面比它大的点中最早被操作的时刻。所以我们可以从左到右扫一遍整个数列,插入当前的点的被操作时间并查找它即比它大的数的最早被操作时间,即当前点的贡献变为0的时刻,time,这个可以用权值线段树来维护。最后设sum[i]表示在所有第i个时刻贡献变为0的数的逆序对个数(即它与它后面的数的逆序对个数),每次sum[time]就加上第i个点的逆序对个数,再统计出逆序对总个数tot,1到m枚举时刻每个时刻i就将tot-sum[i]输出就行了。注意:每个位置的逆序对个数可在归并求整个数列的逆序对总数时一并统计。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100010
#define ll long long
ll n,m,ma,q[N],a[N],b[N],c[N],d[N],t[N],s[N],iq[N],f[N*19],id[N],tm,ans[N],cnt,tot;
using namespace std;
void nxd(int l,int r){if(l>=r) return;int mid=(l+r)>>1;nxd(l,mid);nxd(mid+1,r);int i=l,j=mid+1,k=i;while(i<=mid||j<=r){if(a[i]<=a[j]&&i<=mid||j>r){ans[c[i]]+=j-mid-1;ans[0]+=j-mid-1;b[k]=a[i];d[k]=c[i];k++;i++;}else{b[k]=a[j];d[k]=c[j];k++;j++;}}for(int i=l;i<=r;i++){a[i]=b[i];c[i]=d[i];}
}
void add(int x,int l,int r,int k,ll p){if(l==r){f[x]=min(f[x],p);return;}int mid=(l+r)>>1;if(k<=mid) add(x*2,l,mid,k,p);else add(x*2+1,mid+1,r,k,p);f[x]=min(f[x*2],f[x*2+1]);
}
void find(int x,int l,int r,int l1,int r1){if(l==l1&&r==r1){tm=min(tm,f[x]);return;}int mid=(l+r)>>1;if(r1<=mid) find(x*2,l,mid,l1,r1);else if(l1>mid) find(x*2+1,mid+1,r,l1,r1);else{find(x*2,l,mid,l1,mid);find(x*2+1,mid+1,r,mid+1,r1);}
}
int main(){scanf("%d%d",&n,&m);int i;for(i=1;i<=n;i++){scanf("%lld",&a[c[i]=i]);ma=max(ma,iq[i]=a[i]);} nxd(1,n);for(i=1;i<=n;i++){if(a[i]!=a[i-1]) id[c[i]]=++cnt;else id[c[i]]=cnt;}memset(f,127,sizeof(f));memset(t,127,sizeof(t));for(i=1;i<=m;i++){scanf("%lld",&q[i]);if(t[q[i]]==t[0]) t[q[i]]=i;}for(i=1;i<=n;i++){tm=m+1;add(1,1,n+1,id[i]+1,t[i]);find(1,1,n+1,id[i]+1,n+1);s[tm]+=ans[i];}printf("%lld\n",ans[0]);for(i=1;i<=m;i++){ans[0]-=s[i];printf("%lld\n",ans[0]);}return 0;
}
作者:zsjzliziyang
QQ:1634151125
转载及修改请注明
本文地址: https://blog.csdn.net/zsjzliziyang/article/details/84887133
5222. 【GDOI2018模拟7.12】A相关推荐
- JZOJ 5222. 【GDOI2018模拟7.12】A (Standard IO)
题目链接: Click here Solution 设 v a l i val_i vali表示 i i i与它后面的数形成的逆序对个数. a n s ans ans为原来数列逆序对个数. 每次询问 ...
- 【JZOJ5224】【GDOI2018模拟7.12】C
Description Data Constraint Solution 首先必须讲讲自然数幂求和. 我们设 Sk(n)=∑i=1nik Sk(n)=\sum_{i=1}^ni^k 我们用第一类斯特林 ...
- jzoj5224 [GDOI2018模拟7.12]C 杜教筛+自然数幂和
Description 求 ∑i=1n∑j=1ngcd(i,j)k且n≤1010,k≤5 ∑ i = 1 n ∑ j = 1 n gcd ( i , j ) k 且 n ≤ 10 10 , k ≤ 5 ...
- 【JZOJ5222】【GDOI2018模拟7.12】A
Description 注意:题意有误,IQ小于等于的都会听从指挥 Data Constraint Solution 这道题,有两个坑,首先,IQ小于等于的都会听从指挥,这在做题时居然没讲,居然还有人 ...
- Cisco PT模拟实验(12) 路由器静态路由的配置
Cisco PT模拟实验(12) 路由器静态路由的配置 实验目的: 掌握静态路由的配置方法和应用 掌握路由选择表中的路由描述 熟悉路由选择和分组转发的原理及过程 实验背景: 某公司除总部外,另有一处分 ...
- JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度
Description Input Output Sample Input Sample1: 3 1 2 3 Sample2: 9 1 3 2 4 8 6 9 5 7 Sample Output Sa ...
- JZOJ.5264【NOIP2017模拟8.12】化学
Description Input Output Sample Input 3 10 1 2 10 Sample Output 5 Data Constraint Hint 搜索.考虑到m很大,我们不 ...
- 计算机等级考试数据库三级模拟题12
1在数据库应用系统的需求分析阶段,确定系统吞吐量的工作属于(). 数据处理需求分析 业务规则需求分析 性能需求分析 安全性需求分析 正确答案:C 答疑:数据库应用系统的需求分析包括数据需求分析.功能需 ...
- 【GDOI2018模拟7.6】吃干饭
Description 求区间[l,r]中的数任意互相异或之后有多少种可能的结果 l<=r<=1e18,数据组数<=100 Solution 这种题一眼线性基啦~ 虽然我并不太熟练, ...
最新文章
- 使用sqlite3解决IDEA中SVN更新提示cleanup却无法cleanup的问题
- 使用运行时动态创建属性
- linux shell 统计行数的8种方法
- java调用dueros_DuerOS纯java sdk 支持windows,唤醒(仅linux),技能
- C2679	二进制 没有找到接受 std::string 类型的右操作数的运算符(或没有可接受的转换)
- C#创建Oracle中的几何对象:点、线、面
- c++ 调用system 不显示黑框_Java回调的四种写法:反射+直接调用+接口调用+Lambda表达式...
- Java Map用法
- linux-查看文件类型-看本质-file
- OpenJDK9 Hotspot :Zero 解释器 - BytecodeInterpreter
- 计算机网络网络层之数据报网络
- 还原 idea undo commit
- 带你快速入门计算机网络模型与5G协议!!
- VMware中安装linux系统(可视化界面centOS 7)
- FIT2CLOUD飞致云发布MeterSphere开源持续测试平台
- OSPF 多区域配置实例学习记录
- CentOS 7.4 Tengine安装配置详解(二)
- php游戏实例,php实现的简易扫雷游戏实例_PHP
- C语言Windows命令行编程
- 计算机服务器属无形资产吗,服务器属于固定资产还是无形资产
热门文章
- fget函数读取一行数据,非二进制文件 -- linux
- 上班不迟到如何从快乐变成痛苦
- localStorage.getItem
- 【arduino】米思齐Mixly模块编写修改方法,非常简单的Mixly模块修改方法
- 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)
- uniapp华为手机真机运行方法
- java迭代法求圆周率用梯形_java第二阶段作业总结
- 用AutoHotkey根据Excel表一键填写浙江省资产负债表
- mysql 迁移方案_不同场景下 MySQL 的迁移方案
- netty之微信-群聊消息的收发及 Netty 性能优化(二十)