UVA12345 Dynamic len

Problem :

给一个序列,每次询问一个区间里面的数字种类数量,或者修改某一个位置的值。

Solution :

第一关键字分块排序左端点,第二关键字分块排序右端点,第三关键字排序询问顺序。

左端点移动总的时间复杂度为 q * block_size + block_num * block_size

右端点移动总的时间复杂度为 q * block_size + block_num * block_num * block_size

询问端点总的时间复杂度为 block_num * block_num * n

故取block_size = n^(2/3)

#include <bits/stdc++.h>
using namespace std; const int N = 50008; int a[N], b[N], cnt[N * 20], vis[N], ans[N];
int sum, n, m, bklen;
int tot1, tot2; struct query1
{
int l, r, x, lb, rb, id;
query1(){}
query1(int l, int r, int x, int id) : l(l), r(r), x(x), id(id)
{
lb = (l - 1) / bklen + 1; rb = (r - 1) / bklen + 1;
}
bool operator < (const query1 &b) const
{
if (lb != b.lb) return lb < b.lb;
if (rb != b.rb) return rb < b.rb;
return x < b.x;
}
}q1[N];
struct query2
{
int pos, x, y;
query2(){}
query2(int pos, int x, int y) : pos(pos), x(x), y(y){}
}q2[N]; void update(int pos)
{
if (vis[pos])
{
if (cnt[a[pos]] == 1) sum--;
cnt[a[pos]]--;
}
else
{
if (cnt[a[pos]] == 0) sum++;
cnt[a[pos]]++;
}
vis[pos] ^= 1;
}
void change(int pos, int x)
{
if (vis[pos])
{
update(pos);
a[pos] = x;
update(pos);
}
else a[pos] = x;
}
int main()
{
cin.sync_with_stdio(0);
cin >> n >> m;
bklen = pow(n, 2.0 / 3);
for (int i = 1; i <= n; ++i) cin >> a[i], b[i] = a[i];
for (int i = 1; i <= m; ++i)
{
string s; int l, r;
cin >> s >> l >> r; l++;
if (s[0] == 'Q')
{
++tot1; //如果写到下面的话,可能会导致后面的tot1没有+1
q1[tot1] = query1(l, r, tot2, tot1);
}
else
{
q2[++tot2] = query2(l, b[l], r);
b[l] = r;
}
}
sort(q1 + 1, q1 + tot1 + 1);
sum = 0;
for (int i = 1, l = 1, r = 0, x = 0; i <= tot1; ++i)
{
while (x < q1[i].x) {++x; change(q2[x].pos, q2[x].y);}
while (x > q1[i].x) {change(q2[x].pos, q2[x].x); --x;}
while (r < q1[i].r) update(++r);
while (r > q1[i].r) update(r--);
while (l < q1[i].l) update(l++);
while (l > q1[i].l) update(--l);
ans[q1[i].id] = sum;
}
for (int i = 1; i <= tot1; ++i) cout << ans[i] << endl;
}

UVA12345 (带修改的莫队)的更多相关文章

  1. BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...

  2. 【BZOJ】2120: 数颜色 带修改的莫队算法

    [题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...

  3. 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块

    题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...

  4. 【bzoj3052】[wc2013]糖果公园 带修改树上莫队

    题目描述 给出一棵n个点的树,每个点有一个点权,点权范围为1~m.支持两种操作:(1)修改一个点的点权 (2)对于一条路径,求$\sum\limits_{i=1}^m\sum\limits_{j=1} ...

  5. P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队

    \(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...

  6. UOJ 58 (树上带修改的莫队)

    UOJ 58 糖果公园 Problem : 给一棵n个点的树,每个点上有一种颜色,对于一条路径上的点,若 i 颜色第 j 次出现对该路径权值的贡献为 w[i] * c[j], 每次询问一条路径的权值, ...

  7. UVA - 12345 带修改的莫队

    题意显然:给出初始序列,单点修改,区间查询元素的种类. 由于时限过宽,暴力可过. 比较优秀的解法应该是莫队. 带修改的莫队题解可以看https://www.luogu.org/blog/user126 ...

  8. codeforces 940F 带修改的莫队

    F. Machine Learning time limit per test 4 seconds memory limit per test 512 megabytes input standard ...

  9. Machine Learning CodeForces - 940F(带修改的莫队)

    题解原文地址:https://www.cnblogs.com/lujiaju6555/p/8468709.html 给数组a,有两种操作,1 l r查询[l,r]中每个数出现次数的mex,注意是出现次 ...

随机推荐

  1. TabLayout.Tab(自定义)点击事件

    TabLayout是官方design包中的一个布局控件,这里不介绍它的基本使用,只是解决Tab(自定义)点击事件. //获取Tab的数量 Int tabCount = tabLayout.getTab ...

  2. 关于php的问题

    $polling_items = db_fetch_assoc("SELECT * FROM poller_item WHERE rrd_next_step<=0 ORDER by h ...

  3. Struts2 前端与后台之间传值问题

    老是被前端与后台之间的传值给弄糊涂了,特此写一篇blog进行总结. 一. 前端向后台传值 (1)属性驱动 属性驱动是指在Action类里,包含表单里对应的字段(字段名称一样),同时设置对应的gette ...

  4. sql查询作业执行时间

    SELECT  j.name                        AS Job_Name        ,        h.step_id                     AS S ...

  5. 开发笔记 - 解决font-awesome等图标在浏览器中的兼容问题

    今天在写前端页面的时候,觉得font-awesome简单实用就上手试了一下,因为font-awesome图标库甚为强大,我就在其css上多做了一些尝试,这一尝试发现了一个致命的问题,当我对i标签进行统 ...

  6. 在云环境上使用SLF4J对Java程序进行日志记录

    我开发了一个Java应用,部署到云环境上之后,用postman测试发现不能按照我期望的工作,但是返回的消息对我没有任何帮助. 因为部署在云端的应用很难像本地Java应用一样调试,所以我打算用SLF4J ...

  7. SEO 第九章

    SEO第九章 本次课目标: 1.  外部优化之平台优化 2.  如何撰写SEO诊断方案 一.外部平台优化——百度系列平台 百度系列的平台都是属于百度自己的产品,排名都是比较高的,所以我们在做外部推广的 ...

  8. Python 中print 和return 的区别

    1.print() print()函数的作用是输出数据到控制台,就是打印在你能看到的界面上. 2.return return语句[表达式]退出函数,选择性地向调用方返回一个表达式.不带参数值的retu ...

  9. 屏幕卫士模式系统APP开发

    利用php的socket编程来直接给接口发送数据来模拟post的操作,(黎灿:I8O..2853..296O 可电可V)线上线下和物流结合在一起,才会产生新零售. 2016年阿里云栖大会上,阿里巴巴马 ...

  10. Android studio Github 断开连接

    http://blog.csdn.net/agoodcoolman/article/details/50562301 使用软件:Android studio svn:Github 从github直接从 ...