2821: 作诗(Poetize)

Time Limit: 50 Sec  Memory Limit: 128 MB
Submit: 2835  Solved: 814
[Submit][Status][Discuss]

Description

神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗。由于时间紧迫,SHY作完诗
之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读其中连续的一段[l,r],从这一段中选出一
些汉字构成诗。因为SHY喜欢对偶,所以SHY规定最后选出的每个汉字都必须在[l,r]里出现了正偶数次。而且SHY认
为选出的汉字的种类数(两个一样的汉字称为同一种)越多越好(为了拿到更多的素材!)。于是SHY请LYD安排选
法。LYD这种傻×当然不会了,于是向你请教……问题简述:N个数,M组询问,每次问[l,r]中有多少个数出现正偶
数次。

Input

输入第一行三个整数n、c以及m。表示文章字数、汉字的种类数、要选择M次。第二行有n个整数,每个数Ai在[1, c
]间,代表一个编码为Ai的汉字。接下来m行每行两个整数l和r,设上一个询问的答案为ans(第一个询问时ans=0),
令L=(l+ans)mod n+1, R=(r+ans)mod n+1,若L>R,交换L和R,则本次询问为[L,R]。

Output

输出共m行,每行一个整数,第i个数表示SHY第i次能选出的汉字的最多种类数。

Sample Input

5 3 5
1 2 2 3 1
0 4
1 2
2 2
2 3
3 5

Sample Output

2
0
0
0
1

HINT

对于100%的数据,1<=n,c,m<=10^5

Source

By lydrainbowcat

分块大法好

类似区间众数的做法,预处理F[i][j]表示第i块到第j块的答案

一个询问l-r,那么中间大块x-y的答案已经得到了

只要考虑l-x和y-r对答案的影响,对于这至多2√n个数,对于每个数统计它在x-y出现次数t1,以及l-r出现次数t2,根据t1,t2的奇偶性考虑其对答案的影响

每块大小√(n/logn),复杂度n√n logn

顺便附关于块大小分析

设分块大小为x,分块数n/x,预处理n/x*n

m与n同级,视为n个询问,每次询问二分x次n*x*logn(除非相同的数字很多,否则logn会很小)

n*(x*logn+n/x)
分块大小应该是sqrt(n/logn)

            ——引自hzwer

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+5;
const int Z=3005;
int n,c,m,size,ans,cnt[N],q[N],a[N],bl[N],f[Z][Z];
vector<int>list[N];
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void calc(int id){memset(cnt,0,(n+2)<<2);for(int i=(id-1)*size+1,tot=0;i<=n;i++){cnt[a[i]]++;if((cnt[a[i]]&1)&&cnt[a[i]]!=1) tot--;if(cnt[a[i]]&1^1) tot++;f[id][bl[i]]=tot;}
}
int Qsum(int x,int y,int id){return upper_bound(list[id].begin(),list[id].end(),y)-lower_bound(list[id].begin(),list[id].end(),x);
}
int query(int x,int y){int ans=f[bl[x]+1][bl[y]-1];int tot=0;for(int i=x;i<=min(bl[x]*size,y);i++){if(!cnt[a[i]]) q[++tot]=a[i];cnt[a[i]]++;}if(bl[x]!=bl[y]){for(int i=(bl[y]-1)*size+1;i<=y;i++){if(!cnt[a[i]]) q[++tot]=a[i];cnt[a[i]]++;}}for(int i=1;i<=tot;i++){int sum=Qsum(x,y,q[i]);int sum1=sum-cnt[q[i]];int sum2=cnt[q[i]];if(sum1&1){if(sum2&1) ans++;}else if(sum1){if(sum2&1) ans--;}else{if(sum2&1^1) ans++;}}for(int i=x;i<=min(bl[x]*size,y);i++) cnt[a[i]]=0;for(int i=(bl[y]-1)*size+1;i<=y;i++) cnt[a[i]]=0;return ans;
}
int main(){n=read();c=read();m=read();size=sqrt(n);for(int i=1;i<=n;i++){a[i]=read();bl[i]=(i-1)/size+1;list[a[i]].push_back(i);}for(int i=1;i<=size;i++) calc(i);memset(cnt,0,(n+2)<<2);for(int i=1,x,y;i<=m;i++){x=read();y=read();x=(x+ans)%n+1;y=(y+ans)%n+1;if(x>y) swap(x,y);ans=query(x,y);printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/shenben/p/6435576.html

2821: 作诗(Poetize)相关推荐

  1. BZOJ 2821: 作诗(Poetize) [分块]

    题意: N个数,Q组询问,每次问[l,r]中有多少个数出现正偶数次. 和上题一样呀呀呀 稍微改一改交上就行了 写错好多地方...要认真啊... #include <iostream> #i ...

  2. BZOJ2821: 作诗(Poetize)

    2821: 作诗(Poetize) Time Limit: 50 Sec  Memory Limit: 128 MB Submit: 3300  Solved: 965 [Submit][Status ...

  3. [BZOJ2821]作诗(Poetize)

    [BZOJ2821]作诗(Poetize) 试题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来 ...

  4. BZOJ 2821 作诗 分块

    BZOJ 2821 作诗 Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一 ...

  5. bzoj2821 作诗(Poetize)分块+二分

    预处理的d[i][j]为第i块到第j点的答案 块外的暴力 #include<iostream> #include<cstdio> #include<cstring> ...

  6. bzoj 2821:作诗 分块

    题目大意: 给定一个长为n的序列,每次询问一个区间内出现了偶数次的数的个数.强制在线. 题解: 据说这道题正解只用了5MB的内存 QAQ... 反正我是120MB + 卡过去的... 我们可以分块! ...

  7. 腾讯国风AI虚拟人学会作诗书法,背靠开源模型SongNet

    5月21日,腾讯AI虚拟人艾灵再秀出新技能,首次展示AI作诗.AI书法等国风才艺,并与青年歌手白举纲跨次元合作,共同演唱国风新歌<百川千仞>. AI"艾灵"诞生于腾讯A ...

  8. 罗念梓(帮别人名字作诗)

    罗念梓(帮别人名字作诗) --代腾飞   2008年8月9日 于成都 罗郎羽扇伴纶巾 念诵诗文唱古今 梓桑莫问今何在 名满天下传乡音

  9. 月英爱耀承(帮别人名字作诗)

    月英爱耀承(帮别人名字作诗) --代腾飞   2008年4月14日 于成都 月色皎皎爱如霜 英光脉脉两凝望 耀燿一生相扶过 承旨幸福万年长

最新文章

  1. ckeditor 4.2.1_演示 ckeditor 上传插入图片
  2. 遇到tensorflow has no attribute 问题
  3. 解决Mac上adb: command not found问题
  4. android MotionEvent中getX()和getRawX()的区别
  5. MAVEN集成测试环境搭建
  6. 所有的面试问题都可以归结为这三类(附回答套路)
  7. css:before和after中的content属性
  8. Vue-cli 自定义配置
  9. 外网访问内网Oracle数据库
  10. android Gallery实现异步加载网络图片
  11. Perl爬虫的简单实现
  12. 软件测试功能测试全套常见面试题【功能测试】面试总结4-2
  13. 伺服电机驱动器编程用c语言吗,伺服电机如何编程
  14. html借助JS简单实现图片闪烁功能
  15. 2023年有哪些值得推荐的蓝牙耳机?小米|南卡|JBL等等高性价比蓝牙耳机推荐
  16. 修改db_create_online_log_dest_1
  17. crontab使用实例
  18. AI System 人工智能系统 TVM深度学习编译器 DSL IR优化 计算图 编译 优化 内存内核调度优化 DAG 图优化 DFS TaiChi 函数注册机 Registry
  19. 怎么判断Ubuntu有没有无线网卡?
  20. JavaScript检查数组中是否有重复值

热门文章

  1. 6 追前沿,领略SET化架构衍化与设计
  2. java虚拟机之一内存运行时数据区域解释
  3. 判断是否为ajax请求
  4. foreach之引用的使用
  5. linux性能监控sar命令详解
  6. rust中使用cargo expand查看被宏隐藏的代码
  7. 查看Linux版本系统信息方法汇总
  8. java循环 排序 查找
  9. 国家网信办:所有网站应对传播内容承担法律责任
  10. Dolphin Smalltalk 7 遵循 MIT 开源