【BZOJ 2821】作诗
【题目链接】
https://www.lydsy.com/JudgeOnline/problem.php?id=2821
【算法】
如果不强制在线,显然莫队是可以解决此题的,那么,强制在线怎么办呢? 分块
将这个序列分成sqrt(n)段(sqrt表示开方),预处理每段每个数出现的次数与该段“多少数出现了正偶数次”,就可以在线回答询问了
【代码】
#include<bits/stdc++.h>
using namespace std;
const int MAXN = ;
const int MAXB = ; int i,n,m,c,l,r,x,y,len,block,lastans;
int a[MAXN],belong[MAXN],cnt[MAXN],L[MAXB],R[MAXB];
int sum[MAXB][MAXN],ans[MAXB][MAXB]; inline void init()
{
int i,j,k;
len = (int)sqrt(n);
block = n / len;
for (i = ; i <= block; i++)
{
L[i] = (i - ) * len + ;
R[i] = i * len;
}
if (R[block] < n)
{
block++;
L[block] = R[block-] + ;
R[block] = n;
}
for (i = ; i <= n; i++) belong[i] = (i - ) / len + ;
for (i = ; i <= n; i++) sum[belong[i]][a[i]]++;
for (i = ; i <= block; i++)
{
for (j = ; j <= c; j++)
{
sum[i][j] += sum[i-][j];
}
}
for (i = ; i <= block; i++)
{
for (j = i; j <= block; j++)
{
ans[i][j] = ans[i][j-];
for (k = L[j]; k <= R[j]; k++)
{
cnt[a[k]]++;
if (cnt[a[k]] % == ) ans[i][j]++;
else if (cnt[a[k]] > ) ans[i][j]--;
}
}
for (j = L[i]; j <= n; j++) cnt[a[j]]--;
}
}
inline int query(int l,int r)
{
int i,ret = ,t;
int p = belong[l],
q = belong[r];
if (p == q)
{
for (i = l; i <= r; i++)
{
cnt[a[i]]++;
if (cnt[a[i]] % == ) ret++;
else if (cnt[a[i]] > ) ret--;
}
for (i = l; i <= r; i++) cnt[a[i]]--;
return ret;
} else
{
ret = ans[p+][q-];
for (i = l; i <= R[p]; i++)
{
cnt[a[i]]++;
t = sum[q-][a[i]] - sum[p][a[i]] + cnt[a[i]];
if (t % == ) ret++;
else if (t > ) ret--;
}
for (i = L[q]; i <= r; i++)
{
cnt[a[i]]++;
t = sum[q-][a[i]] - sum[p][a[i]] + cnt[a[i]];
if (t % == ) ret++;
else if (t > ) ret--;
}
for (i = l; i <= R[p]; i++) cnt[a[i]]--;
for (i = L[q]; i <= r; i++) cnt[a[i]]--;
return ret;
}
} int main()
{ scanf("%d%d%d",&n,&c,&m);
for (i = ; i <= n; i++) scanf("%d",&a[i]);
init();
lastans = ;
for (i = ; i <= m; i++)
{
scanf("%d%d",&x,&y);
l = (x + lastans) % n + ;
r = (y + lastans) % n + ;
if (l > r) swap(l,r);
printf("%d\n",lastans = query(l,r));
} return ;
}
【BZOJ 2821】作诗的更多相关文章
- BZOJ 2821: 作诗(Poetize)( 分块 )
分块,分成N^0.5块.O(N^1.5)预处理出sm[i][j]表示前i块中j的出现次数, ans[i][j]表示第i~j块的答案. 然后就可以O(N^0.5)回答询问了.总复杂度O((N+Q)N^0 ...
- [BZOJ 2821] 作诗(Poetize) 【分块】
题目链接:BZOJ - 2821 题目分析 因为强制在线了,所以无法用莫队..可以使用分块来做. 做法是,将 n 个数分成 n/x 个块,每个块大小为 x .先预处理出 f[i][j] ,表示从第 i ...
- [BZOJ 2821] 作诗
Link: BZOJ 2821 传送门 Solution: 一道类似区间众数的经典分块 由于个数为偶数这样的条件不能支持快速合并 因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示 ...
- bzoj 2821 作诗 分块
基本思路和蒲公英一样 还是预处理出每两个块间的答案 询问时暴力跑两边的贡献 #include<cstdio> #include<cstring> #include<ios ...
- BZOJ 2821作诗(Poetize) 分块
Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i] ...
- 2821: 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1078 Solved: 348[Submit][Status] ...
- 【分块】BZOJ2821 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 3265 Solved: 951[Submit][Status][ ...
- 作诗(bzoj 2821)
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次 ...
- BZOJ2821:作诗——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2821 问题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好 ...
- 【BZOJ2821】作诗(Poetize) 分块
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...
随机推荐
- 第九课: - 导出到CSV / EXCEL / TXT
第 9 课 将数据从microdost sql数据库导出到cvs,excel和txt文件. In [1]: # Import libraries import pandas as pd import ...
- Android 自定义控件之圆形扩散View(DiffuseView)
实现效果 使用 属性方法 代码 源码下载 参考链接 实现效果 使用 XML中: <com.airsaid.diffuseview.widget.DiffuseView android:id=&q ...
- vc++创建Win32 Application窗体过程
#include<windows.h>#include<stdio.h>LRESULT CALLBACK WinSunProc( HWND hwnd, UINT uMsg, W ...
- Win7系统无法记住网络访问的凭据怎么办?
访问内网其他IP时已经打勾记住我的凭据了,但是注销或者重启Win7系统之后,又得重新输入用户名跟密码怎么办? 下面就为大家介绍一下如何让Win7系统记住网络访问的凭据. 以上问题还会引发,重启后无法正 ...
- Java Spring 两大特色
0 引言 本文主要描述的是Spring常用的两大特色功能:AOP和IoC容器 1 IoC Spring的IoC:就是常说的“控制反转”,也又叫依赖注入的(DI). 优点:IoC最大的好处就是把对象生成 ...
- 沃通SSL证书、代码签名证书应用于机器人安全防护
近两年,扫地机器人.智能音箱等消费级机器人产品逐渐走入大众生活的中.随着人工智能技术的迅猛发展,预计2023年全球消费级机器人市场规模将达到150亿美元.然而,产业的迅猛发展却伴随着安全防护的缺失,安 ...
- reMarkable安装教程
PS :每次都下一遍安装包挺无奈的...... 系统版本 :Ubuntu 16.04 安装包 :remarkable_1.87_all.deb 链接 Here!-> reMarkable 安装步 ...
- Project Euler 28 Number spiral diagonals
题意:给出一个 1001 × 1001 的矩阵,寻找每一圈四个顶点,并求出所有顶点的和 思路:只需要找到右上顶点数字的规律,然后每一圈四个顶点构成了一个等差数列,求个和即可 /************ ...
- POJ2406A- Power Strings
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
- 搞定PHP面试 - 函数知识点整理
一.函数的定义 1. 函数的命名规则 函数名可以包含字母.数字.下划线,不能以数字开头. function Func_1(){ } //合法 function func1(){ } //合法 func ...