洛谷 P4135 作诗
分块大暴力,跟区间众数基本一样
#pragma GCC optimize(3)
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,c,m,sz=,sz1;
int a[];
int be[],st[],ed[];
int nnm[][];
int ttt[],tt2[][];
int main()
{
int i,j,k,l,r,lans=,ans;
scanf("%d%d%d",&n,&c,&m);
//sz=sqrt(n);
sz1=(n-)/sz+;
for(i=;i<=n;i++) scanf("%d",&a[i]),be[i]=(i-)/sz+;
for(i=;i<sz1;i++) st[i]=(i-)*sz+,ed[i]=i*sz;
st[sz1]=(sz1-)*sz+,ed[sz1]=n;
for(i=;i<=sz1;i++)
{
memcpy(nnm[i],nnm[i-],sizeof(nnm[i]));
for(j=st[i];j<=ed[i];j++) nnm[i][a[j]]++;
}
for(i=;i<=sz1;i++)
{
memset(ttt,,sizeof(ttt));ans=;
for(j=i;j<=sz1;j++)
{
for(k=st[j];k<=ed[j];k++)
{
if(ttt[a[k]]&&ttt[a[k]]%==) ans--;
ttt[a[k]]++;
if(ttt[a[k]]&&ttt[a[k]]%==) ans++;
}
tt2[i][j]=ans;
}
}
memset(ttt,,sizeof(ttt));
while(m--)
{
scanf("%d%d",&l,&r);l=(l+lans)%n+;r=(r+lans)%n+;
if(l>r) swap(l,r);
if(be[l]+>=be[r])
{
ans=;
for(i=l;i<=r;i++)
{
if(ttt[a[i]]&&ttt[a[i]]%==) ans--;
ttt[a[i]]++;
if(ttt[a[i]]&&ttt[a[i]]%==) ans++;
}
printf("%d\n",ans);lans=ans;
for(i=l;i<=r;i++) ttt[a[i]]--;
}
else
{
ans=tt2[be[l]+][be[r]-];
for(i=l;i<=ed[be[l]];i++)
{
if(ttt[a[i]]+nnm[be[r]-][a[i]]-nnm[be[l]][a[i]]&&(ttt[a[i]]+nnm[be[r]-][a[i]]-nnm[be[l]][a[i]])%==) ans--;
ttt[a[i]]++;
if(ttt[a[i]]+nnm[be[r]-][a[i]]-nnm[be[l]][a[i]]&&(ttt[a[i]]+nnm[be[r]-][a[i]]-nnm[be[l]][a[i]])%==) ans++;
}
for(i=st[be[r]];i<=r;i++)
{
if(ttt[a[i]]+nnm[be[r]-][a[i]]-nnm[be[l]][a[i]]&&(ttt[a[i]]+nnm[be[r]-][a[i]]-nnm[be[l]][a[i]])%==) ans--;
ttt[a[i]]++;
if(ttt[a[i]]+nnm[be[r]-][a[i]]-nnm[be[l]][a[i]]&&(ttt[a[i]]+nnm[be[r]-][a[i]]-nnm[be[l]][a[i]])%==) ans++;
}
printf("%d\n",ans);lans=ans;
for(i=l;i<=ed[be[l]];i++) ttt[a[i]]--;
for(i=st[be[r]];i<=r;i++) ttt[a[i]]--;
}
}
return ;
}
洛谷 P4135 作诗的更多相关文章
- 洛谷P4135 作诗 (分块)
洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章 ...
- 洛谷 P4135 作诗 题解
题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们 ...
- 洛谷P4135 作诗
题意:[l,r]之间有多少个数出现了正偶数次.强制在线. 解:第一眼想到莫队,然后发现强制在线...分块吧. 有个很朴素的想法就是蒲公英那题的套路,做每块前缀和的桶. 然后发现这题空间128M,数组大 ...
- 洛谷 P4135 作诗(分块)
题目链接 题意:\(n\) 个数,每个数都在 \([1,c]\) 中,\(m\) 次询问,每次问在 \([l,r]\) 中有多少个数出现偶数次.强制在线. \(1 \leq n,m,c \leq 10 ...
- 洛谷P4135 作诗(不一样的分块)
题面 给定一个长度为 n n n 的整数序列 A A A ,序列中每个数在 [ 1 , c ] [1,c] [1,c] 范围内.有 m m m 次询问,每次询问查询一个区间 [ l , r ] [l, ...
- 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解
题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...
- P4135 作诗——分块
题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判 ...
- luogu P4135 作诗
嘟嘟嘟 郑重声明:我的前几到分块题写法上都有点小毛病,以这篇为主! 这道题感觉也是分块的基本套路,只不过卡常,得开氧气. 维护俩:sum[i][j]表示前 i 块中,数字 j 出现了多少次,ans[i ...
- P4135 作诗
传送门 分块 设sum[ i ] [ j ] 存从左边到第 i 块时,数字 j 的出现次数 f [ i ] [ j ] 存从第 i 块,到第 j 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...
随机推荐
- 【bzoj4554】[Tjoi2016&Heoi2016]游戏
现在问题有硬石头和软石头的限制 所以要对地图进行预处理 分行做,把有#隔开的*(x)形成联通块的存储下来. 分列作,把有#隔开的*(x)形成联通块的存储下来. 求出所有的行联通个数和列联通个数 作为二 ...
- map数据的分组,list数据排序 数据筛选
sfit0144 (李四) 2015-01-10 18:00:251Sfit0734 (Sfit0734) 2015-01-10 18:00:38go homesfit0144 (李四) 2015-0 ...
- oracle 错误代码表
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...
- NavigationView更改菜单icon和title颜色变化效果
NavigationView menu默认icon和title会随着菜单状态改变而改变,选择某个菜单后再次打开侧边菜单后会发现该菜单的icon和title会变成应用的主颜色,其他菜单项仍然为黑色. 如 ...
- hdu-2066 一个人的旅行(最短路spfa)
题目链接: 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pr ...
- 「LuoguP2434」 [SDOI2005]区间(贪心
Description 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照 ...
- table中tr或者td的点击事件
直接把时间添加到table或者tbody上,只有下面的tr或者td才能促发事件,通过e.target可以获得当前点击tr或者td,这样就可以进行查询或者删除操作了 如果是删除,直接e.target.r ...
- 压缩&&解压
压缩与解压缩: ############################################################# tar xvf wordpress.tar ## ...
- c++ 头文件 及 sort 和 vector简单介绍
c++ sort :http://www.16kan.com/post/997260.html http://wenku.baidu.com/view/e064166daf1ffc4ffe47ac6 ...
- Codeforces - 773A - Success Rate - 二分 - 简单数论
https://codeforces.com/problemset/problem/773/A 一开始二分枚举d,使得(x+d)/(y+d)>=p/q&&x/(y+d)<= ...