Test instructions: give you n a sequence of unordered numbers that can be repeated, and ask how many pairs of reverse order are at least after the K-second exchange.
The inverse pair can be used in a tree-like array, and for duplicate elements, the number may be exchanged at sort
Pay attention to the weight when summing, there is another way is to stabilize the sort Stable_sort
#include <string.h> #include <stdio.h> #include <algorithm>using namespace std; #define LL __int64# Define N 100000+10struct ln{int id,va;} In[n];int a[n],c[n];int n;int cmp (ln x,ln y) {return x.va<y.va;} int lowbit (int x) {return x& (-X);} void Updata (int t,int value) {for (int i=t;i<=n;i+=lowbit (i)) C[i]+=value;} int getsum (int x) {int temp=0; for (int i=x;i>=1;i-=lowbit (i)) temp+=c[i]; return temp;} int main () {int k; while (scanf ("%d%d", &n,&k)!=eof) {for (int i=1;i<=n;i++) { scanf ("%d", &in[i].va); In[i].id=i; } memset (C,0,sizeof (c)); Sort (in+1,in+n+1,cmp); A[in[1].id]=1; for (int i=2;i<=n;i++) {if (In[i].va!=in[i-1].va) a[in[i].i D]=i; else a[in[i].id]=a[in[i-1].id]; } ll Ans=0; for (int i=1;i<=n;i++) {updata (a[i],1); printf ("%d%d\n", Getsum (A[i]), Getsum (a[i]-1)); int temp=i-getsum (A[I]-1); temp=temp-(Getsum (A[i])-getsum (a[i]-1)); Ans+=temp; } if (ans-k<0) printf ("0\n"); else printf ("%i64d\n", ans-k); } return 0;}
#include <string.h> #include <stdio.h> #include <algorithm>using namespace std; #define LL __int64# Define N 100000+10struct ln{int id,va;} In[n];int a[n],c[n];int n;int cmp (ln x,ln y) {return x.va<y.va;} int lowbit (int x) {return x& (-X);} void Updata (int t,int value) {for (int i=t;i<=n;i+=lowbit (i)) C[i]+=value;} int getsum (int x) {int temp=0; for (int i=x;i>=1;i-=lowbit (i)) temp+=c[i]; return temp;} int main () {int k; while (scanf ("%d%d", &n,&k)!=eof) {for (int i=1;i<=n;i++) { scanf ("%d", &in[i].va); In[i].id=i; } memset (C,0,sizeof (c)); Stable_sort (IN+1,IN+N+1,CMP); for (int i=1;i<=n;i++) a[in[i].id]=i; ll Ans=0; for (int. i=1;i<=n;i++) {UpData (a[i],1); int temp=i-getsum (a[i]); Ans+=temp; } if (ans-k<0) printf ("0\n"); else printf ("%i64d\n", ans-k); } return 0;}
Hdoj 4911 inversion tree-like array + discretization