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]作业的更多相关文章

  1. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  2. BZOJ 3236: [Ahoi2013]作业

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1393  Solved: 562[Submit][Status ...

  3. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  4. Bzoj 3236: [Ahoi2013]作业 莫队,分块

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1113  Solved: 428[Submit][Status ...

  5. BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )

    莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...

  6. BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块

    BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了 ...

  7. 【Luogu4396】[AHOI2013]作业(莫队)

    [Luogu4396][AHOI2013]作业(莫队) 题面 洛谷 题解 模板题 #include<iostream> #include<cstdio> #include< ...

  8. [AHOI2013]作业

    [AHOI2013]作业 题目大意: 给定一个长度为\(n(n\le10^5)\)的数列\(A(1\le A_i\le n)\).\(m(m\le10^6)\)次询问,每次询问区间\([l,r]\)内 ...

  9. 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块

    [BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...

随机推荐

  1. Kill占用指定端口的进程的方法

    (1)查询占用指定端口进程的PID 打开cmd命令行,输入netstat -ano|findstr 8080(指定端口号) 最后一列即为占用该端口的进程的PID (2)KILL指定PID的进程 紧接着 ...

  2. 关于notify() 和notifyAll() 一个需要注意的地方

    notify() 和 notifyAll()都是唤醒其他正在等待同一个对象锁的线程. 下面是我遇到的一个问题,记下来,免得忘了. 直接上代码,有错误的代码: 代码描述:有一个Caculate类,类中又 ...

  3. 「LG4782 模板 2-SAT 问题」

    题目 来学\(2\)-\(sat\)了 这个东西确实不难 这个算法就是给你一堆\(bool\)变量\(x_1,x_2...x_n\),之后给你一些限制 限制的形式就是给你一对\((u,o1,v,o2) ...

  4. Redis配置文件(2)SNAPSHOTTING快照/APPEND ONLY MODE追加

    redis.conf文件 1.Save a. save 秒钟 写操作次数 RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件, 默认 是1分钟内改了1万次, 或5 ...

  5. leetcode 78. Subsets 、90. Subsets II

    第一题是输入数组的数值不相同,第二题是输入数组的数值有相同的值,第二题在第一题的基础上需要过滤掉那些相同的数值. level代表的是需要进行选择的数值的位置. 78. Subsets 错误解法: cl ...

  6. Telnet配置

    一.环境 路由 IP:192.168.56.2 本地云 IP:192.168.56.1 二.认证模式 AAA模式 认证 授权 计费的安全技术 当配置用户界面的认证方式为AAA时, 用户登录设备时需要首 ...

  7. vue.js 组件监听

    一.在通过点击事件触发的子组件中: addCart(event) { if (!event._constructed) { return; } if (!this.food.count) { Vue. ...

  8. phpstorm下TODO注释

    TODO注释 什么是TODO注释? 标记的注释,表示你代办的任务. 作用 标记你需要编写的任务位置 使用方法 TODO: + 说明: 如果代码中有该标识,说明在标识处有功能代码待编写,待实现的功能在说 ...

  9. 二十三、详述 IntelliJ IDEA 中恢复代码的方法「进阶篇」

    咱们已经了解了如何将代码恢复至某一版本,但是通过Local History恢复代码有的时候并不方便,例如咱们将项目中的代码进行了多处修改,这时通过Local History恢复代码就显得很麻烦,因为它 ...

  10. Kindeditor图片上传Controller

    asp.net MVC Kindeditor 图片.文件上传所用的Controller [HttpPost, AllowAnonymous] public ActionResult UploadIma ...