UVALive 6508 Permutation Graphs
2015-07-20 14:04
405 查看
补这一道题,当时题意没有看懂,后来看懂了题意
给你n个点,然后又两个序列,然后把这两个序列中相等数连接起来,每两条连线中间看有几个点,求所有连线中间的点的个数和。
序列{2 , 5 , 4 , 1 ,3}和{1 ,5,3 ,2 ,4}的连接图如下
比如说1-1和4-4中间的点是5,3,2
显而易见这是求逆序对的个数
代入树状数组模板即可
给你n个点,然后又两个序列,然后把这两个序列中相等数连接起来,每两条连线中间看有几个点,求所有连线中间的点的个数和。
序列{2 , 5 , 4 , 1 ,3}和{1 ,5,3 ,2 ,4}的连接图如下
比如说1-1和4-4中间的点是5,3,2
显而易见这是求逆序对的个数
代入树状数组模板即可
[code]#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 111111 int bit ; int a ; int pos ; int n; int sum(int i) { int s=0; while(i>0) { s+=bit[i]; i=i&(i-1); } return s; } void add(int i,int xx) { while(i<=n) { bit[i]+=xx; i+=i&-i; } } int main() { int T; scanf("%d",&T); while(T--) { int ans = 0; memset(bit,0,sizeof(bit)); scanf("%d",&n); int x; for(int i=1; i<=n; i++) { scanf("%d",&x); pos[x] = i; } for(int i=0; i<n; i++) { scanf("%d",&x); ans+=i-sum(pos[x]); add(pos[x],1); } printf("%d\n",ans); } return 0; }
相关文章推荐
- HTML5表单美化
- ctags的简单使用
- 【转】有关Java包装类及其拆箱装箱的小结
- ACM大牛总结的线段树专辑
- GRE写作必备句型
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
- ETL技术入门之ETL初认识
- Web 通信 之 长连接、长轮询(long polling)
- JavaScript 代码风格指南
- Integer比较
- 解决android sdk manage打开闪退的解决方法
- 如何让Linux下非root用户程序使用小于1024端口
- 【转载】Java编程思想重点笔记(Java开发必看)
- Ext.apply 详解
- 树
- SGU 101 Domino 题解
- AndroidJNI.SetObjectField 设置对象域
- 用FPGA驱动DA芯片TLV5618
- GCD 延时执行
- ubuntu系统从中文环境改成英文环境