2821: 作诗(Poetize)
2821: 作诗(Poetize)
Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 2835 Solved: 814
[Submit][Status][Discuss]
Description
Input
Output
输出共m行,每行一个整数,第i个数表示SHY第i次能选出的汉字的最多种类数。
Sample Input
1 2 2 3 1
0 4
1 2
2 2
2 3
3 5
Sample Output
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)相关推荐
- BZOJ 2821: 作诗(Poetize) [分块]
题意: N个数,Q组询问,每次问[l,r]中有多少个数出现正偶数次. 和上题一样呀呀呀 稍微改一改交上就行了 写错好多地方...要认真啊... #include <iostream> #i ...
- BZOJ2821: 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MB Submit: 3300 Solved: 965 [Submit][Status ...
- [BZOJ2821]作诗(Poetize)
[BZOJ2821]作诗(Poetize) 试题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来 ...
- BZOJ 2821 作诗 分块
BZOJ 2821 作诗 Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一 ...
- bzoj2821 作诗(Poetize)分块+二分
预处理的d[i][j]为第i块到第j点的答案 块外的暴力 #include<iostream> #include<cstdio> #include<cstring> ...
- bzoj 2821:作诗 分块
题目大意: 给定一个长为n的序列,每次询问一个区间内出现了偶数次的数的个数.强制在线. 题解: 据说这道题正解只用了5MB的内存 QAQ... 反正我是120MB + 卡过去的... 我们可以分块! ...
- 腾讯国风AI虚拟人学会作诗书法,背靠开源模型SongNet
5月21日,腾讯AI虚拟人艾灵再秀出新技能,首次展示AI作诗.AI书法等国风才艺,并与青年歌手白举纲跨次元合作,共同演唱国风新歌<百川千仞>. AI"艾灵"诞生于腾讯A ...
- 罗念梓(帮别人名字作诗)
罗念梓(帮别人名字作诗) --代腾飞 2008年8月9日 于成都 罗郎羽扇伴纶巾 念诵诗文唱古今 梓桑莫问今何在 名满天下传乡音
- 月英爱耀承(帮别人名字作诗)
月英爱耀承(帮别人名字作诗) --代腾飞 2008年4月14日 于成都 月色皎皎爱如霜 英光脉脉两凝望 耀燿一生相扶过 承旨幸福万年长
最新文章
- ckeditor 4.2.1_演示 ckeditor 上传插入图片
- 遇到tensorflow has no attribute 问题
- 解决Mac上adb: command not found问题
- android MotionEvent中getX()和getRawX()的区别
- MAVEN集成测试环境搭建
- 所有的面试问题都可以归结为这三类(附回答套路)
- css:before和after中的content属性
- Vue-cli 自定义配置
- 外网访问内网Oracle数据库
- android Gallery实现异步加载网络图片
- Perl爬虫的简单实现
- 软件测试功能测试全套常见面试题【功能测试】面试总结4-2
- 伺服电机驱动器编程用c语言吗,伺服电机如何编程
- html借助JS简单实现图片闪烁功能
- 2023年有哪些值得推荐的蓝牙耳机?小米|南卡|JBL等等高性价比蓝牙耳机推荐
- 修改db_create_online_log_dest_1
- crontab使用实例
- AI System 人工智能系统 TVM深度学习编译器 DSL IR优化 计算图 编译 优化 内存内核调度优化 DAG 图优化 DFS TaiChi 函数注册机 Registry
- 怎么判断Ubuntu有没有无线网卡?
- JavaScript检查数组中是否有重复值