bzoj 2724: [Violet 6]蒲公英

2724: [Violet 6]蒲公英

Time Limit: 40 Sec   Memory Limit: 512 MB
Submit: 1278   Solved: 425
[ Submit][ Status][ Discuss]

Description

bzoj 2724: [Violet 6]蒲公英_第1张图片

Input

bzoj 2724: [Violet 6]蒲公英_第2张图片

修正一下

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 5

Sample Output

1
2
1

HINT

bzoj 2724: [Violet 6]蒲公英_第3张图片


修正下:


n <= 40000, m <= 50000

Source

Vani原创



#include
#include
#include
#include
#include
#define N 40003
using namespace std;
int n,m,f[210][210],h[210][210],cnt,sum,t;
int a[N],p[N],b[N],tr[N],num[N],pos[N],q[N];
int head[N],tail[N];
int cmp(int x,int y)
{
  return b[x]f[i][pos[j]])
   	    {
   	      f[i][pos[j]]=num[a[j]];
   	      h[i][pos[j]]=b[j];
   	    }
   	   if (num[a[j]]==f[i][pos[j]])
   	    h[i][pos[j]]=min(h[i][pos[j]],b[j]);
   	 }
   }
}
int cmp1(int x,int y)
{
  return p[x]ans)
        {
          ans=num[a[i]];
          ansx=b[i];
        }
       else
        if (num[a[i]]==ans)
         ansx=min(ansx,b[i]);
     }
    for (int i=(pos[y]-1)*cnt+1;i<=y;i++)
     {
       if (!num[a[i]])
        num[a[i]]=query(pos[x]+1,pos[y]-1,a[i]);
       num[a[i]]++;
       if (num[a[i]]>ans)
        {
          ans=num[a[i]];
          ansx=b[i];
        }
       else
        if (num[a[i]]==ans)
         ansx=min(ansx,b[i]);
     }
  }
  return ansx;
}
int main()
{
 scanf("%d%d",&n,&m);
 cnt=sqrt(n);
 for (int i=1;i<=n;i++)
  scanf("%d",&b[i]),p[i]=i,pos[i]=(i-1)/cnt+1;
 sort(p+1,p+n+1,cmp);
 for (int i=1;i<=n;i++)
  if (b[p[i]]!=b[p[i-1]])
   sum++,a[p[i]]=sum;
  else  a[p[i]]=sum;
 if (n%cnt) t=n/cnt+1;
 else t=n/cnt;
 work();
 work1();
 int k=0;
 for (int i=1;i<=m;i++)
 {
  int x,y; scanf("%d%d",&x,&y);
  x=(x+k-1)%n+1; y=(y+k-1)%n+1;
  if (x>y) swap(x,y);
  k=ask(x,y);
  printf("%d\n",k);
 }
}
数据生成器:

#include
#include
#include
#include
using namespace std;
int main()
{
	freopen("input.txt","w",stdout);
	int n,m;
	n=40000;m=50000;
	srand(time(0));
	printf("%d %d\n",n,m);
	for (int i=1;i<=n;i++){
		int x=rand()*rand()%1000000000+1;
		cout<





你可能感兴趣的:(分块)