数值标记问题 离线+树状数组 HDU 3938 + HDU 3333
HDU 3938
题目大意:给你一个长度为n的数组a,定义区间[l,r]的val为区间内所有不同的数值之和。现在有m个询问,每次询问一个区间,问区间的val是多少。
思路:将所有的询问按照右端点排序。然后暴力枚举右区间,然后对之前出现过的val做一个标记即可,每次都更新这个标记就好了。 具体的和HDU 5869一样,只不过5869还要预处理,比较难
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
const int maxn = + ;
const int maxm = + ;
const int maxval = + ;
LL tree[maxn], a[maxn], ans[maxm];
vector<pair<int, int> > q[maxn];
int n, m;
int pre[maxval];
inline int lowbit(int x) {return x & -x;} void update(int x, int val){
for (int i = x; i <= n; i += lowbit(i))
tree[i] += val;
} LL sum(int x){
LL ans = ;
for (int i = x; i > ; i -= lowbit(i)){
ans += tree[i];
}
return ans;
} int main(){
int t; cin >> t;
while (t--){
memset(pre, , sizeof(pre));
memset(tree, , sizeof(tree));
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%I64d", a + i);
q[i].clear();
}
scanf("%d", &m);
for (int i = ; i <= m; i++){
int l, r; scanf("%d%d", &l ,&r);
q[r].pb(mk(l, i));
}
for (int i = ; i <= n; i++){
if (pre[a[i]]){
update(pre[a[i]], - * a[i]);
}
pre[a[i]] = i;
update(i, a[i]);
int len = q[i].size();
for (int j = ; j < len; j++){
pair<int, int> p = q[i][j];
ans[p.second] = sum(i) - sum(p.first - );
}
}
for (int i = ; i <= m; i++){
printf("%I64d\n", ans[i]);
}
}
return ;
}
HDU 3333
这道题就是a数组的范围大了一点而已,没啥的,只要离散化一下就好了,其他的思路都一样
然后代码只需要多添加一个离散化即可
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
const int maxn = + ;
const int maxm = + ;
LL tree[maxn], a[maxn], b[maxn], ans[maxm];
vector<pair<int, int> > q[maxn];
int n, m;
int pre[maxn];
inline int lowbit(int x) {return x & -x;} void update(int x, int val){
for (int i = x; i <= n; i += lowbit(i))
tree[i] += val;
} LL sum(int x){
LL ans = ;
for (int i = x; i > ; i -= lowbit(i)){
ans += tree[i];
}
return ans;
} int main(){
int t; cin >> t;
while (t--){
memset(pre, , sizeof(pre));
memset(tree, , sizeof(tree));
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%I64d", a + i);
b[i] = a[i];
q[i].clear();
}
sort(b + , b + + n);
scanf("%d", &m);
for (int i = ; i <= m; i++){
int l, r; scanf("%d%d", &l ,&r);
q[r].pb(mk(l, i));
}
for (int i = ; i <= n; i++){
int posa = lower_bound(b + , b + + n, a[i]) - b;
if (pre[posa]){
update(pre[posa], - * a[i]);
}
pre[posa] = i;
update(i, a[i]);
int len = q[i].size();
for (int j = ; j < len; j++){
pair<int, int> p = q[i][j];
ans[p.second] = sum(i) - sum(p.first - );
}
}
for (int i = ; i <= m; i++){
printf("%I64d\n", ans[i]);
}
}
return ;
}
数值标记问题 离线+树状数组 HDU 3938 + HDU 3333的更多相关文章
- 区间的关系的计数 HDU 4638 离线+树状数组
题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...
- hdu 4605 Magic Ball Game (在线主席树/离线树状数组)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...
- HDU 2852 KiKi's K-Number(离线+树状数组)
题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...
- HDU - 4777 离线树状数组
离线树状数组搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...
- HDU 4417 离线+树状数组
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- BZOJ2743 HEOI2012采花(离线+树状数组)
如果能够把所有区间内第二次出现某颜色的位置标记出来,树状数组查询一下就可以了. 考虑离线.按左端点从小到大排序,不断移动左端点并更新第二次出现的位置. #include<iostream> ...
- SPOJ DQUERY - D-query (莫队算法|主席树|离线树状数组)
DQUERY - D-query Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query ...
- 【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组
题目描述 有一张n×m的数表,其第i行第j列(1 <= i <= n ,1 <= j <= m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...
- CodeForces - 220B Little Elephant and Array (莫队+离散化 / 离线树状数组)
题意:N个数,M个查询,求[Li,Ri]区间内出现次数等于其数值大小的数的个数. 分析:用莫队处理离线问题是一种解决方案.但ai的范围可达到1e9,所以需要离散化预处理.每次区间向外扩的更新的过程中, ...
随机推荐
- Alyona and a tree
Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- C语言_cmd_pause
再C语言里面使用system函数调用pause. system("pause"); 会显示 请按任意键继续. . . system("pause ->nul&q ...
- flash检测网络是否通畅
air: 要在 Adobe ® Flash ® Professional(CS4 或更高版本)中使用 air.net 包: 选择“文件”>“发布设置”命令. 在 Flash 面板中,单击 Act ...
- 几种访问其他域swf文件,或本地浏览器运行环境【安全沙箱】冲突解决方法
声明: 几种方法都源自网络,我只负责汇总一下子,因为来自多方转载,也找不到初始出处了,需要的可以随意收藏,物尽其用,蛮好^_^ 对于类似的出错信息:SecurityError: Error #2148 ...
- dns是什么
域名解析服务器,靠它把你要访问的网址找到然后把信息送到你电脑上.DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的.域名服务器是指保存有该网络中所有主 ...
- [科普]DNS相关的攻击介绍
一 什么是DNS DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不 ...
- uCOS-II的信号量及使用
uCOS-II的信号量及使用 信号量的定义: OS_EVENT* Key1_SEM; OS_EVENT* Key2_SEM; OS_EVENT* Key3_SEM; 信号量的创建: Key1_SEM= ...
- Linux 配置tomcat遇见的若干问题
1.提示catalina.sh缺失 原因:未对bin目录下的.sh文件授权 执行:chmod +x bin/*.sh即可 2.正常启动Tomcat 但是外界无法访问 Linux防火墙原因,进入到 et ...
- event小解
首先是一个小例子: <input type="text" onclick="a(event)"/> function a(event){ con ...
- C# tostring()汇总
原文:http://www.cnblogs.com/xiaopin/archive/2010/11/05/1870103.html C 货币 2.5.ToString("C") ¥ ...