(HDU 5792)2016 Multi-University Training Contest 5 World is Exploding (逆序数、顺序数、树状数组)
来源:互联网 发布:双色球历史数据库下载 编辑:程序博客网 时间:2024/05/16 13:45
思路
要求互不相等的a,b,c,d
1. 满足
2. 满足
对于一个升序的序列,其逆序对的个数为
若一个数大于右侧的一个数,则右侧的这个数一定小于左侧的一个数,显然,升序对个数等于降序对
答案可以通过枚举
因为要求四个数两两不同,所以要减去以下四种情况:
1.
2.
3.
4.
可以用树状数组预处理出每个数右侧大于这个数的个数,右侧小于这个数的个数,左侧大于这个数的个数,左侧小于这个数的个数。
Trick:
1. 数据要做离散化处理
2. 可能有重复的数,在计算右边小或左边小(a、c)时不需要算进去,但是在去重时要予以考虑
代码
#include <bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a))#define rep(i,a,b) for(int i=a;i<b;i++)#define debug(a) printf("a =: %d\n",a);const int INF=0x3f3f3f3f;const int maxn=5e4+50;const int Mod=1000000007;const double PI=acos(-1);typedef long long ll;using namespace std;int n;int c[maxn];int lowbit(int x){ return x&(-x);}void add(int pos,int ad){ for(;pos<=n;pos+=lowbit(pos)) c[pos]+=ad;}int query(int pos){ int ret=0; for(;pos>0;pos-=lowbit(pos)) ret+=c[pos]; return ret;}int rg[maxn],rs[maxn],lg[maxn],ls[maxn];int s[maxn],tmp[maxn];void init(){ map<int,int> ma; int cnt=1; sort(tmp,tmp+n); for(int i=0;i<n;i++){ if (!ma[tmp[i]]){ ma[tmp[i]]=cnt++; } } for(int i=0;i<n;i++){ s[i]=ma[s[i]]; } mem(c,0); for(int i=n-1;i>=0;i--){ int t=s[i]; rs[i]=query(s[i]-1); rg[i]=n-i-1-query(s[i]); add(t,1); // cout<<i<<" "<<rs[i]<<" "<<rg[i]<<endl; } mem(c,0); for(int i=0;i<n;i++){ int t=s[i]; ls[i]=query(s[i]-1); lg[i]=i-query(s[i]); add(t,1); // cout<<i<<" "<<ls[i]<<" "<<lg[i]<<endl; }}ll solve(){ ll inc=0,dec=0; ll ret=0; for(int i=0;i<n;i++){ inc+=ls[i]; dec+=rs[i]; ret-=rg[i]*lg[i]+ls[i]*rs[i]+rg[i]*rs[i]+lg[i]*ls[i]; } ret+=inc*dec; return ret;}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif while(scanf("%d",&n)!=EOF){ for(int i=0,t;i<n;i++){ scanf("%d",&t); s[i]=tmp[i]=t; } init(); cout<<solve()<<"\n"; } return 0;}
0 0
- (HDU 5792)2016 Multi-University Training Contest 5 World is Exploding (逆序数、顺序数、树状数组)
- hdu 5792 World is Exploding(2016 Multi-University Training Contest 5——树状数组)
- HDU5792 World is Exploding(树状数组)2016 Multi-University Training Contest 5
- 树状数组 ( 求逆序数 )——Bubble Sort ( HDU 5775 ) ( 2016 Multi-University Training Contest 4 1012 )
- 2016 Multi-University Training Contest 4 - 1012(树状数组求逆序数 )
- 【2014 Multi-University Training Contest 5】 Inversion (离散化,树状数组求逆序数)
- 2016 Multi-University Training Contest 5 1012 World is Exploding (数学+离散化)
- hdu 5792 World is Exploding 2016 Multi-University 5
- HDU 5792 World is Exploding (树状数组逆序对)
- hdu5792 多校5 World is Exploding【树状数组求逆序数】
- hdu 5792 World is Exploding 树状数组
- HDU-5792-World is Exploding-树状数组
- 【substr + 逆序数+ 线段树push_up的位置!!!】2016 Multi-University Training Contest 4
- 【模板】逆序数,java大数,2014 Multi-University Training Contest 5,
- 2016 Multi-University Training Contest 4 hdu 5775 Bubble Sort【树状数组+思维】
- 2016 Multi-University Training Contest 4 1012 hdu 5775(树状数组)
- hdu 5775 Bubble Sort(2016 Multi-University Training Contest 4——树状数组)
- HDU-5792-World is Exploding(树状数组+离散化)
- 关于语言的前期绑定与后期绑定
- Elasticsearch.Net使用(一)【入门篇】
- 跟我一起写Makefile(5)--- 清空目标文件的规则
- html表单控件select的sel.length属性
- 大牛指点绝招
- (HDU 5792)2016 Multi-University Training Contest 5 World is Exploding (逆序数、顺序数、树状数组)
- javaScript实现图片动态轮流展示
- Android的一个BindView工具的实现
- POJ3026——Borg Maze
- 数据结构实验之链表四:有序链表的归并
- Unity学习笔记 2nd —— 摄像机那些事
- Jenkins系统设置
- 瓶颈ing
- UI标签在火狐浏览器中某些问题解决