标签:1090. in the army no ural 1090 归并排序树状数组
input | output |
---|---|
3 3 1 2 3 2 1 3 3 2 1 |
3 |
题意:k行n列,求出每一列的逆序对,输出逆序对最少的所在的行数。
思路:采用归并排序或者树状数组,这两天写了好几道了,要练熟悉!
代码:
//归并排序 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define maxn 10005 #define MAXN 2005 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FRE(i,a,b) for(i = a; i <= b; i++) #define FREE(i,a,b) for(i = a; i >= b; i--) #define FRL(i,a,b) for(i = a; i < b; i++) #define FRLL(i,a,b) for(i = a; i > b; i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define DBG pf("Hi\n") typedef long long ll; using namespace std; int n,k,sum; int a[maxn]; int b[maxn]; void Merge(int a[],int l,int mid,int r) { int i,j,k=l; FRE(i,l,r) b[i]=a[i]; i=l;j=mid+1; while (i<=mid&&j<=r) { if (b[i]<=b[j]) a[k++]=b[i++]; else{ sum+=(mid-i+1); a[k++]=b[j++]; } } while (i<=mid) a[k++]=b[i++]; while (j<=r) a[k++]=b[j++]; } void Merge_sort(int a[],int l,int r) { if (l>=r) return ; int mid=(l+r)>>1; Merge_sort(a,l,mid); Merge_sort(a,mid+1,r); Merge(a,l,mid,r); } int main() { int i,j; while (~sff(n,k)) { int maxx=0; int ans=1; FRE(i,1,k) { sum=0; FRE(j,1,n) sf(a[j]); Merge_sort(a,1,n); if (sum>maxx) { maxx=sum; ans=i; } } pf("%d\n",ans); } return 0; }
//树状数组 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define maxn 10005 #define MAXN 2005 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FRE(i,a,b) for(i = a; i <= b; i++) #define FREE(i,a,b) for(i = a; i >= b; i--) #define FRL(i,a,b) for(i = a; i < b; i++) #define FRLL(i,a,b) for(i = a; i > b; i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define DBG pf("Hi\n") typedef long long ll; using namespace std; struct Node { int val,pos; }node[maxn]; int n,k,ans,s; int bit[maxn]; int cmp(Node a,Node b) { return a.val>b.val; } int sum(int i) { int s=0; while (i>0) { s+=bit[i]; i-=i&-i; } return s; } void add(int i,int x) { while (i<=n) { bit[i]+=x; i+=i&-i; } } int main() { int i,j; while (~sff(n,k)) { ans=1; int maxx=-1; FRE(i,1,k) { s=0; mem(bit,0); //一定要记住初始化 FRE(j,1,n) { sf(node[j].val); node[j].pos=j; } sort(node+1,node+n+1,cmp); // DBG; FRE(j,1,n) { // DBG; s+=sum(node[j].pos-1); add(node[j].pos,1); } if (s>maxx) { maxx=s; ans=i; } // DBG; } pf("%d\n",ans); } return 0; }
1090. In the Army Now (Ural 1090 归并排序||树状数组)
标签:1090. in the army no ural 1090 归并排序树状数组
原文地址:http://blog.csdn.net/u014422052/article/details/44805051