【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)
2724: [Violet 6]蒲公英
Time Limit: 40 Sec Memory Limit: 512 MB
Submit: 1908 Solved: 678Description
Input
修正一下
l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1
Output
Sample Input
6 3
1 2 3 2 1 2
1 5
3 6
1 5Sample Output
1
2
1HINT
修正下:
n <= 40000, m <= 50000
Source
【分析】
区间众数见:http://www.docin.com/p-679227660.html
我这道题的就是打这个做法【实际上是膜hzwer的代码
【关于[l,r]之间有多少个x,是把位置存在数值的vector里面,然后lower_bound(l)~upper_bound(r)有多少个数
然后分块一下就好了。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<cmath> 7 #include<vector> 8 #include<map> 9 using namespace std; 10 #define Maxn 50010 11 #define Maxm 510 12 13 int a[Maxn],f[Maxn],bl[Maxn],mode[Maxm][Maxm]; 14 map<int,int> mp;int id; 15 vector<int > v[Maxn]; 16 17 int blo,n; 18 int cnt[Maxn]; 19 void pre(int x) 20 { 21 memset(cnt,0,sizeof(cnt)); 22 int mx=0,ans=0; 23 for(int i=(x-1)*blo+1;i<=n;i++) 24 { 25 cnt[a[i]]++; 26 int t=bl[i]; 27 if(cnt[a[i]]>mx||(cnt[a[i]]==mx&&f[a[i]]<f[ans])) 28 ans=a[i],mx=cnt[a[i]]; 29 mode[x][t]=ans; 30 } 31 } 32 33 int get_(int l,int r,int x) 34 { 35 return upper_bound(v[x].begin(),v[x].end(),r)-lower_bound(v[x].begin(),v[x].end(),l); 36 } 37 38 int query(int l,int r) 39 { 40 int ans,mx=0; 41 if(bl[l]==bl[r]) 42 { 43 for(int i=l;i<=r;i++) 44 { 45 int t=get_(l,r,a[i]); 46 if(t>mx||(t==mx)&&f[a[i]]<f[ans]) ans=a[i],mx=t; 47 } 48 } 49 else 50 { 51 ans=mode[bl[l]+1][bl[r]-1],mx=get_(l,r,ans); 52 for(int i=l;i<=bl[l]*blo;i++) 53 { 54 int t=get_(l,r,a[i]); 55 if(t>mx||(t==mx)&&f[a[i]]<f[ans]) ans=a[i],mx=t; 56 } 57 for(int i=(bl[r]-1)*blo+1;i<=r;i++) 58 { 59 int t=get_(l,r,a[i]); 60 if(t>mx||(t==mx&&f[a[i]]<f[ans])) ans=a[i],mx=t; 61 } 62 } 63 return ans; 64 } 65 66 int main() 67 { 68 int m; 69 scanf("%d%d",&n,&m); 70 blo=200; 71 int ans=0;id=0; 72 for(int i=1;i<=n;i++) 73 { 74 scanf("%d",&a[i]); 75 if(!mp[a[i]]) mp[a[i]]=++id,f[id]=a[i]; 76 a[i]=mp[a[i]]; 77 v[a[i]].push_back(i); 78 } 79 for(int i=1;i<=n;i++) bl[i]=(i-1)/blo+1; 80 for(int i=1;i<=bl[n];i++) pre(i); 81 for(int i=1;i<=m;i++) 82 { 83 int l,r; 84 scanf("%d%d",&l,&r); 85 l=(l+ans-1)%n+1,r=(r+ans-1)%n+1; 86 if(l>r) swap(l,r); 87 ans=f[query(l,r)]; 88 printf("%d\n",ans); 89 } 90 return 0; 91 }
【不行了 我也用map了。。。。
然后其实有更快的方法,然后我尝试了一下就放弃了。。【感觉是用空间和代码量换时间啊好恶心、、
然后带修改这样【其实我没看。。
2017-04-23 21:21:48