2 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,Q,B,a[100010],lsh[100010]; struct N{ int l,r,id; }q[100010]; bool cmp(N a,N b){ if(a.l/B!=b.l/B)return a.l<b.l; return a.r<b.r; } int cnt[100010],s; void add(int x){ cnt[a[x]]++; if(cnt[a[x]]>cnt[s])s=a[x]; } int cntl[100010],vis[100010],tsp; void addl(int x){ if(vis[a[x]]<tsp){ vis[a[x]]=tsp;cntl[a[x]]=0; } cntl[a[x]]++; if(cnt[a[x]]+cntl[a[x]]>cnt[s]+cntl[s])s=a[x]; } int cntc[100010]; int calc(int l,int r){ for(int i=l;i<=r;i++)cntc[a[i]]=0; int mx=0; for(int i=l;i<=r;i++){ cntc[a[i]]++; if(cntc[a[i]]>cntc[mx])mx=a[i]; } return mx; } int ans[100010],ans2[100010]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>Q; B=sqrt(n); for(int i=1;i<=n;i++){ cin>>a[i];lsh[i]=a[i]; } sort(lsh+1,lsh+1+n); int ln=unique(lsh+1,lsh+1+n)-lsh-1; for(int i=1;i<=n;i++){ a[i]=lower_bound(lsh+1,lsh+1+ln,a[i])-lsh; } for(int i=1;i<=Q;i++){ cin>>q[i].l>>q[i].r;q[i].id=i;q[i].l++; } sort(q+1,q+1+Q,cmp); for(int i=0,j=1;i<=n/B;i++){ int R=min(n,(i+1)*B-1); int l=R+1,r=R; s=0; memset(cnt,0,sizeof(cnt)); for(;j<=Q&&q[j].l/B==i;j++){ if(q[j].l/B==q[j].r/B){ ans[q[j].id]=calc(q[j].l,q[j].r); ans2[q[j].id]=cntc[ans[q[j].id]]; continue; } while(r<q[j].r)add(++r); int la=s; tsp++; if(vis[s]<tsp){ vis[s]=tsp;cntl[s]=0; } while(l>q[j].l)addl(--l); ans[q[j].id]=s; ans2[q[j].id]=cntl[s]+cnt[s]; s=la; l=R+1; } } for(int i=1;i<=Q;i++){ cout<<lsh[ans[i]]<<" "<<ans2[i]<<'\n'; } return 0; } -
0
石山分块,具体请参考 P4168 [Violet] 蒲公英。
#include<bits/stdc++.h> using namespace std; const int N=1e5+10,M=sqrt(N)+10; int s[M][N],p[M][M],a[N],b[N],c[N],B; signed main() { int n,q;cin>>n>>q;B=sqrt(n);int len=(n-1)/B+1; for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i]; sort(b+1,b+n+1);int K=unique(b+1,b+n+1)-b-1; for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+K+1,a[i])-b; for(int i=1;i<=len;i++) { for(int j=1;j<=K;j++)c[j]=0; int mx=-1e9,id=1e9; for(int j=i;j<=len;j++) { for(int k=(j-1)*B+1;k<=min(n,j*B);k++) { c[a[k]]++; if(c[a[k]]>mx)mx=c[a[k]],id=a[k]; else if(c[a[k]]==mx)id=min(id,a[k]); } p[i][j]=id; } } for(int i=1;i<=len;i++) { for(int j=1;j<=K;j++)s[i][j]=s[i-1][j]; for(int j=(i-1)*B+1;j<=min(n,i*B);j++)s[i][a[j]]++; } while(q--) { int l,r;cin>>l>>r;l++; int bl=(l-1)/B+1,br=(r-1)/B+1; if(br-bl<=1) { for(int i=l;i<=r;i++)c[a[i]]=0; int mx=-1e9,id=1e9; for(int i=l;i<=r;i++) { c[a[i]]++; if(c[a[i]]>mx)mx=c[a[i]],id=a[i]; else if(c[a[i]]==mx)id=min(id,a[i]); } cout<<b[id]<<' '<<mx<<'\n'; } else { for(int i=l;i<=bl*B;i++)c[a[i]]=s[br-1][a[i]]-s[bl][a[i]]; for(int i=(br-1)*B+1;i<=r;i++)c[a[i]]=s[br-1][a[i]]-s[bl][a[i]]; int id=p[bl+1][br-1],mx=s[br-1][id]-s[bl][id];c[id]=mx; for(int i=l;i<=bl*B;i++) { c[a[i]]++; if(c[a[i]]>mx)mx=c[a[i]],id=a[i]; else if(c[a[i]]==mx)id=min(id,a[i]); } for(int i=(br-1)*B+1;i<=r;i++) { c[a[i]]++; if(c[a[i]]>mx)mx=c[a[i]],id=a[i]; else if(c[a[i]]==mx)id=min(id,a[i]); } cout<<b[id]<<' '<<mx<<'\n'; } } return 0; }
- 1
信息
- ID
- 8146
- 时间
- 500ms
- 内存
- 1024MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 19
- 已通过
- 6
- 上传者