COGS:1822. [AHOI2013]作业
1822. [AHOI 2013] 作业
★★★ 输入文件:ahoi2013_homework.in
输出文件:ahoi2013_homework.out
简单对比
时间限制:20 s 内存限制:512 MB
【题目描述】
【输入格式】
【输出格式】
【样例输入】
3 4
1 2 2
1 2 1 3
1 2 1 1
1 3 1 3
2 3 2 3
【样例输出】
2 2
1 1
3 2
2 1
【提示】
N=100000,M=1000000
数据极弱(和BZOJ相比),请放心A
【来源】
BZOJ 3236
分析
莫队,用树状数组来维护求值,一个求出现不同数的个数,另一个满足的数字个数。复杂度$O(n\sqrt n log_2n)$
另一种做法:由于这些数都是小于等于n的,所以对权值进行分块,修改$O(1)$,查询$O(\sqrt n)$,总复杂度$O(m \sqrt n)$
交了几次,最后一个点老是TLE,然后想尽办法,读入优化,inline内联函数,最后写上了输出优化。。。还是TLE,之后才发现ans数组开小了,直接开了MAXN,QAQ
代码
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std; const int MAXN = ;
struct Que{
int l,r,a,b,block,id;
bool operator < (const Que &a) const
{
if (block==a.block) return r < a.r;
return block < a.block;
}
}q[];
int a[MAXN],cnt[MAXN],tr[][MAXN],pr[];
int ans1[],ans2[];
int n,m,pos,len; inline int read()
{
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&& ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline int lowbit(int x)
{
return x & (-x);
}
inline void change(int x,int c,int t)
{
while (x<=n)
{
tr[t][x] += c;
x += lowbit(x);
}
}
inline int query(int x,int t)
{
int res = ;
while (x)
{
res += tr[t][x];
x -= lowbit(x);
}
return res;
}
inline void update(int x,int c)
{
if (cnt[x]==) change(x,,);
cnt[x] += c;
if (cnt[x]==) change(x,-,);
change(x,c,);
}
inline void solve()
{
int l = , r = ;
for (int i=; i<=m; ++i)
{
for (; l>q[i].l; ) update(a[--l], );
for (; r<q[i].r; ) update(a[++r], );
for (; l<q[i].l; ) update(a[l++], -);
for (; r>q[i].r; ) update(a[r--], -);
ans1[q[i].id] = query(q[i].b, ) - query(q[i].a-, );
ans2[q[i].id] = query(q[i].b, ) - query(q[i].a-, );
}
}
inline void print(int x)
{
while (x)
pr[++len] = x%, x/=;
if (!len) putchar('');
while (len)
putchar(pr[len--]+'');
}
int main()
{
freopen("ahoi2013_homework.in","r",stdin);
freopen("ahoi2013_homework.out","w",stdout);
n = read(); m = read();
pos = (int)sqrt(n);
for (int i=; i<=n; ++i)
a[i] = read();
for (int i=; i<=m; ++i)
{
q[i].l = read(); q[i].r = read();
q[i].a = read(); q[i].b = read();
q[i].block = (q[i].l-)/pos+;
q[i].id = i;
}
sort(q+,q+m+);
solve();
for (int i=; i<=m; ++i)
{
print(ans1[i]),putchar(' ');
print(ans2[i]),putchar('\n');
//printf("%d %d\n",ans1[i],ans2[i]);
}
return ;
}
备注:luogu提交地址
COGS:1822. [AHOI2013]作业的更多相关文章
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- BZOJ 3236: [Ahoi2013]作业
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1393 Solved: 562[Submit][Status ...
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- Bzoj 3236: [Ahoi2013]作业 莫队,分块
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1113 Solved: 428[Submit][Status ...
- BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )
莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...
- BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块
BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了 ...
- 【Luogu4396】[AHOI2013]作业(莫队)
[Luogu4396][AHOI2013]作业(莫队) 题面 洛谷 题解 模板题 #include<iostream> #include<cstdio> #include< ...
- [AHOI2013]作业
[AHOI2013]作业 题目大意: 给定一个长度为\(n(n\le10^5)\)的数列\(A(1\le A_i\le n)\).\(m(m\le10^6)\)次询问,每次询问区间\([l,r]\)内 ...
- 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块
[BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...
随机推荐
- vim使用常看
原网址http://www.runoob.com/linux/linux-vim.html 补充参考https://blog.csdn.net/w178191520/article/details/8 ...
- 如何遍历一个JSON对象的属性值???
当遇到一个JSON格式的对象时,不知道它有多少个属性,也不知道有什么属性,该如何遍历它的属性及其属性值呢??? 还是使用Java语言还是很像的,使用for语句. var obj = data[i]; ...
- 总结一下MVC思想
MVC (Model View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用 ...
- SOJ3266 Birthday
Time Limit: 1000MS Memory Limit: 65536 K Description Today is Windy's birthday. What can I say? Inpu ...
- 区间DP学习总结
这段时间学习了区间DP,所以试着把学到的东西稍作总结,以备不时之需. 学习区间DP首先要弄清区间DP是为了解决什么问题:一般的DP主要是特征是一次往往只操作一个数值或者存储可以不连续的物品的状态(比如 ...
- PHP中__get()和__set()的用法实例详
刚刚看到一个对我有用的文章,我就把它摘抄下来了. php面 ...
- 【转】Spring Boot Profile使用
http://blog.csdn.net/he90227/article/details/52981747 摘要: spring Boot使用@Profile注解可以实现不同环境下配置参数的切换,任何 ...
- CSS:层叠样式表—position
CSS position属性用于指定一个元素在文档中的定位方式.top,right,bottom和left属性则决定了该元素的最终位置. 常见语法 static | relative | absolu ...
- 课时22.br标签(掌握)
br标签,如何在html中换行,可以使用br标签 1.br标签的作用:换行 2.br标签的格式:<br> 3.br标签的注意点: 3.1多个br标签可以连续使用,使用了多个br标签就会换多 ...
- 启动tomcat的时候为啥你启动的是8,启动起来的确实其他的Tomcat
如果发现,是启动tomcat的时候为啥你启动的是8,启动起来的确实其他的Tomcat ,你可以去看看你的环境变量,是不是配了一个tomcat,