首页 > 代码库 > BZOJ2724: [Violet 6]蒲公英

BZOJ2724: [Violet 6]蒲公英

2724: [Violet 6]蒲公英

Time Limit: 40 Sec  Memory Limit: 512 MB
Submit: 795  Solved: 248
[Submit][Status]

Description

 

Input

修正一下

l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1

Output

Sample Input

 

Sample Output

 

HINT

 


修正下:


n <= 40000, m <= 50000

 

Source

Vani原创

题解:
调了两小时发现居然是全局变量和局部变量重了QAQ。。。
先离散化
f[i][j]表示到 i 块结束,j 出现的次数
g[i][j]表示 i 块 到 j块 的众数
询问的时候如果 x和y处在同一或相邻的块内,暴力排序扫一遍
否则把 x到x所在块的最后和y所在块的开始到y的所有元素提取出来,加上他们在中间出现的次数,排序+扫一遍
代码:
  1 #include<cstdio>  2 #include<cstdlib>  3 #include<cmath>  4 #include<cstring>  5 #include<algorithm>  6 #include<iostream>  7 #include<vector>  8 #include<map>  9 #include<set> 10 #include<queue> 11 #include<string> 12 #define inf 1000000000 13 #define maxn 40000+100 14 #define maxm 200+50 15 #define eps 1e-10 16 #define ll long long 17 #define pa pair<int,int> 18 #define for0(i,n) for(int i=0;i<=n;i++) 19 #define for1(i,n) for(int i=1;i<=n;i++) 20 #define for2(i,x,y) for(int i=x;i<=y;i++)   21 using namespace std; 22 inline int read() 23 { 24     int x=0,f=1;char ch=getchar(); 25     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();} 26     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();} 27     return x*f; 28 } 29 int n,m,ans=0,block,a[maxn],c[maxn],d[maxn],pos[maxn],sum[maxn],f[maxm][maxn],g[maxm][maxm]; 30 struct rec{int x,id;}b[maxn]; 31 inline bool cmp(rec a,rec b) 32 { 33     return a.x<b.x; 34 } 35 void ask(int x,int y) 36 { 37     x=(x+ans-1)%n+1;y=(y+ans-1)%n+1; 38     if(x>y)swap(x,y); 39     int bx=pos[x],by=pos[y],cnt=0,tmp=0,xx=0; 40     if(by-bx<=1) 41     { 42         for2(i,x,y)d[++cnt]=a[i]; 43         sort(d+1,d+cnt+1); 44         for1(i,cnt) 45          { 46           tmp++; 47           if(i==cnt||d[i]!=d[i+1]) 48            { 49             if(tmp>xx||(tmp==xx&&d[i]<ans))xx=tmp,ans=d[i]; 50             tmp=0; 51            } 52          } 53     } 54     else 55     { 56         for2(i,x,bx*block)d[++cnt]=a[i]; 57         for2(i,(by-1)*block+1,y)d[++cnt]=a[i]; 58         sort(d+1,d+cnt+1); 59         ans=g[bx+1][by-1];xx=f[by-1][ans]-f[bx][ans]; 60         for1(i,cnt) 61          { 62              tmp++; 63              if(i==cnt||d[i]!=d[i+1]) 64              { 65                  tmp+=f[by-1][d[i]]-f[bx][d[i]]; 66                  if(tmp>xx||(tmp==xx&&d[i]<ans))xx=tmp,ans=d[i]; 67                  tmp=0; 68              } 69          } 70     } 71     ans=c[ans]; 72     printf("%d\n",ans); 73 } 74 int main() 75 { 76     freopen("input.txt","r",stdin); 77     freopen("output.txt","w",stdout); 78     n=read();m=read(); 79     for1(i,n)b[i].x=read(),b[i].id=i; 80     sort(b+1,b+n+1,cmp); 81     int tot=0; 82     for1(i,n) 83     { 84         if(i==1||b[i].x!=b[i-1].x)tot++; 85         a[b[i].id]=tot; 86         c[tot]=b[i].x; 87     } 88     block=floor(sqrt(n)); 89     for1(i,n) 90      { 91          pos[i]=(i-1)/block+1; 92          sum[a[i]]++; 93          if(i==n||i==pos[i]*block)for1(j,tot)f[pos[i]][j]=sum[j]; 94      } 95     for1(i,pos[n]) 96      for2(j,i,pos[n]) 97       { 98           ans=g[i][j-1]; 99           for2(k,(j-1)*block+1,min(j*block,n))100           if(f[j][a[k]]-f[i-1][a[k]]>f[j][ans]-f[i-1][ans]||101             (f[j][a[k]]-f[i-1][a[k]]==f[j][ans]-f[i-1][ans]&&a[k]<ans))ans=a[k];102         g[i][j]=ans;   103       }104     ans=0;  105     while(m--)ask(read(),read());106     return 0;107 }
View Code

 

BZOJ2724: [Violet 6]蒲公英