https://www.luogu.org/problem/P1309
我觉得我大概已经是个zz了,普及题都不会做还得看题解,难受。
$O(rnlogn)$肯定过不了(过了也没意义)
复杂度能降下来肯定序列是有规律可循的。
于是可以发现,胜者组和败者组他们的s永远都是单调减的。
然后就把两个有序的胜者组和败者组合并就行了,和归并排序差不多。
我的智商已如风中残烛。
#include<map> #include<cmath> #include<queue> #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=2e5+5; inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch=='-';ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X; } struct people{ int s,w,id; }a[N],b[N],c[N]; int n,r,q; bool cmp(people x,people y){ if(x.s==y.s)return x.id<y.id; return x.s>y.s; } void msort(){ for(int i=1,j=1;i<=2*n;i+=2,j++){ if(a[i].w>a[i+1].w){ b[j]=a[i];b[j].s++; c[j]=a[i+1]; }else{ b[j]=a[i+1];b[j].s++; c[j]=a[i]; } } for(int i=1,j=1,k=1;i<=2*n;i++){ if(j<=n&&(k>n||(b[j].s>c[k].s||(b[j].s==c[k].s&&b[j].id<c[k].id))))a[i]=b[j++]; else a[i]=c[k++]; } } int main(){ n=read();r=read();q=read(); for(int i=1;i<=2*n;i++){ a[i].s=read(); a[i].id=i; } for(int i=1;i<=2*n;i++)a[i].w=read(); sort(a+1,a+2*n+1,cmp); for(int i=1;i<=r;i++){ msort(); } printf("%d",a[q].id); return 0; }
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++