Poj 2299 Ultra-QuickSort
2013-05-16 10:13
393 查看
尼玛=,=
同样的程序
int n就是WA
long long n就是AC
题目is so 坑
说着可怕
其实就是逆序对数
其实我是看到题目分类树状数组才想到这点的=,=
我们看到至少有一组逆序对是相邻的,否则已经单调上升
交换这组逆序对
逆序对数减一
仍至少有一组逆序对是相邻的
反复此操作
由于逆序对数P有限
至少P次使得逆序对数没有<==>单调上升
所以P为所求
同样的程序
int n就是WA
long long n就是AC
题目is so 坑
说着可怕
其实就是逆序对数
其实我是看到题目分类树状数组才想到这点的=,=
我们看到至少有一组逆序对是相邻的,否则已经单调上升
交换这组逆序对
逆序对数减一
仍至少有一组逆序对是相邻的
反复此操作
由于逆序对数P有限
至少P次使得逆序对数没有<==>单调上升
所以P为所求
#include<iostream> #include<vector> #include<algorithm> #define LL long long #define N 500010 using namespace std; vector<LL>L,map; vector<LL>::iterator iter; int tree[N<<1]; int LB(int x){ return x&(-x); } void add(int w,int d){ for(;w<=N+3;w+=LB(w))tree[w]+=d; } int get_sum(int w){ int res=0; for(;w>0;w-=LB(w))res+=tree[w]; return res; } int Bfind(int x){ iter=lower_bound(map.begin(),map.end(),x); return iter+2-map.begin(); } int main(){ LL n; while(cin>>n){ if(!n)break; L.clear(); map.clear(); LL x; int i; for(i=1;i<=n;i++){ cin>>x; L.push_back(x); map.push_back(x); } sort(map.begin(),map.end()); iter=unique(map.begin(),map.end()); map.erase(iter,map.end()); for(i=1;i<=N+3;i++)tree[i]=0; LL res=(n-1)*n/2; for(i=0;i<n;i++){ int w=Bfind(L[i]); res-=get_sum(w); add(w,1); } cout<<res<<"\n"; } return 0; }
相关文章推荐
- poj2299—Ultra-QuickSort
- POJ 2299 Ultra-QuickSort
- poj 2299 c++:Ultra-QuickSort
- Poj 2299 Ultra-QuickSort【逆序数】
- poj 2299 Ultra-QuickSort
- [POJ 2299]Ultra-QuickSort
- poj 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort(树状数组)
- poj2299——Ultra-QuickSort(归并排序)
- POJ 2299 Ultra-QuickSort
- [POJ] 2299 -> Ultra-QuickSort
- POJ2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- POJ 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- poj 2299 Ultra-QuickSort 求逆序数,树状数组解法,详细解析
- POJ 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- POJ 2299 Ultra-QuickSort
- Poj 2299 Ultra-QuickSort
- POJ:2299 Ultra-QuickSort(树状数组+离散化+技巧+求逆序对)