洛谷2448 无尽的生命
来源:互联网 发布:甲骨文java认证 编辑:程序博客网 时间:2024/06/09 15:46
题目:http://www.luogu.org/problem/show?pid=2448
分析:首先离散化,然后树状数组求所有操作过的数产生的逆序对,再求每个操作过的数与没操作过的数产生的逆序对,因为原始序列有序,所以很方便。
代码:
#include <cstdio>#include <iostream>#include <algorithm>#include <map>using namespace std;const int Tmax=200005;struct node{ int x,p,lisan;};node G[Tmax]; int k,last,C1[Tmax],C2[Tmax];long long int ans;map<int,int> F,fx;bool cmp(node lhs,node rhs){ return lhs.x<rhs.x;}bool cmp2(node lhs,node rhs){ return lhs.p<rhs.p;}void init(){ int i; sort(G+1,G+1+last,cmp); for(i=1;i<=last;i++) { G[i].lisan=i; fx[G[i].x]=i; } sort(G+1,G+1+last,cmp2); return;}int lowbit(int x){ return x&-x;}int sum(int x){ int sum=0; for(;x>0;x-=lowbit(x)) sum+=C1[x]; return sum;}void add(int x){ for(;x<=Tmax-1;x+=lowbit(x)) C1[x]++; return;}void work(){ int i,num; for(i=1;i<=last;i++) { num=sum(Tmax-1)-sum(G[i].lisan); add(G[i].lisan); ans+=num; if(G[i].p>G[i].x) { num=fx[G[i].p]-fx[G[i].x]-1; ans+=max(0,G[i].p-G[i].x-1-num); } else { num=fx[G[i].x]-fx[G[i].p]-1; ans+=max(0,G[i].x-G[i].p-1-num); } } cout<<ans; return;}int main(){ int i,a,b,pa,pb; scanf("%d",&k); for(i=1;i<=k;i++) { scanf("%d%d",&a,&b); if(!F.count(a)){ pa=++last; G[pa].x=G[pa].p=a; F[a]=pa; } else pa=F[a]; if(!F.count(b)){ pb=++last; G[pb].x=G[pb].p=b; F[b]=pb; } else pb=F[b]; swap(G[pa].x,G[pb].x); } init(); work(); return 0;}
0 0
- 洛谷2448 无尽的生命
- 洛谷2448 无尽的生命(树状数组)
- 无尽无望的忙乱
- 无尽的爱 歌词
- 无尽的任务
- 无尽的任务
- 无尽的思念
- 无尽的悲伤 无感无感
- 无尽的回忆
- 无尽
- 无尽的哀伤的精魂.
- 史上最无尽的游戏制作方法
- 爱是无尽的等待
- 第三天,无尽的细雨
- acm 2045 无尽的机智
- 美丽的孤独,无尽的思念
- 索尼与黑客的无尽战役
- 第5题 寻找,无尽的房间
- 输入三个数求由小到大顺序的另一种写法
- 进程和线程
- Java 实时论坛 - Sym 1.3.0 发布
- Linux系统的头文件和库文件搜索路径
- Android AsyncTask类的使用(二),加载ListView的Item的图片
- 洛谷2448 无尽的生命
- 解决输入vi不等于vim的问题
- UVA165连续邮资问题
- 原串翻转
- HDOJ 2036 求多边形面积
- 1001. A+B Format (20)
- Hibernate getCurrentSession() 方法的细节
- 金融系统中PBOC/EMV的TLV的算法实现(含C++/C#)
- 一些索引的限制