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

  1. 区间的关系的计数 HDU 4638 离线+树状数组

    题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...

  2. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  3. HDU 2852 KiKi's K-Number(离线+树状数组)

    题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...

  4. HDU - 4777 离线树状数组

    离线树状数组搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...

  5. HDU 4417 离线+树状数组

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. BZOJ2743 HEOI2012采花(离线+树状数组)

    如果能够把所有区间内第二次出现某颜色的位置标记出来,树状数组查询一下就可以了. 考虑离线.按左端点从小到大排序,不断移动左端点并更新第二次出现的位置. #include<iostream> ...

  7. 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 ...

  8. 【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组

    题目描述 有一张n×m的数表,其第i行第j列(1 <= i <= n ,1 <= j <= m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...

  9. CodeForces - 220B Little Elephant and Array (莫队+离散化 / 离线树状数组)

    题意:N个数,M个查询,求[Li,Ri]区间内出现次数等于其数值大小的数的个数. 分析:用莫队处理离线问题是一种解决方案.但ai的范围可达到1e9,所以需要离散化预处理.每次区间向外扩的更新的过程中, ...

随机推荐

  1. float的精度,3个小数相加后精度丢失--小数比较使用bccomp()方法

    $a = 1200.00;$b = 1199.80;$c = 0.1;$u = 0.12; $d = $b+$c+$u;var_dump($a);var_dump($d);var_dump(bccom ...

  2. parseSdkContent failed 解决方案

    开Eclipse出现错误“parseSdkContent failed”,Android的模拟器启动不了.尝试了不少方法,终于搞定. 1.删除文件夹 C:\Documents and Settings ...

  3. php---数组序列化

    有两种选择:serialize,json_encode. 需求:对数组进行序列化后保存在文件中,以便爬虫来抓取文件.并且序列化后的字符串只有一行,不希望在该字符串中出现换行,即使数组中某个元素中有换行 ...

  4. Eclipse报错 due to restriction on required library C:/Java/jdk1.7.51/jre/lib/rt.jar 解决方案

    Eclipse报错 due to restriction on required library C:/Java/jdk1.6.0_10/jre/lib/rt.jar 解决方案 Eclipse 编译时 ...

  5. C#在Json反序列化中处理键的特殊字符

    假设有如下Json 数据: 1.{ 2."id" : 1, 3."@value" : "this a @", 4."$p" ...

  6. viewpager处理(一):让viewpager不能滑动

    1.实现原理: 自定义viewpager,重写onTouchEvent方法,什么触摸事件都不响应即可让viewpager不能滑动. 2.代码如下 public class NoScrollViewPa ...

  7. 为PO手写添加配置文件(hbm.xml)

  8. MySQL整理碎片

    1 innodb引擎表 alter table TABLE_NAME engine='innodb'; 还有一种方法 optiize table TABLE_NAME; http://stackove ...

  9. subversion-fundamental concepts

    1.在使用svn 的时候,版本号version的问题一直困恼. 如在目录/app/controller上面右键选择查看该目录的 show log ,弹出的窗口显示的Revision log.单击每一条 ...

  10. EL表达式处理字符串 是否 包含 某字符串 截取 拆分...............

    EL表达式处理字符串 是否 包含 某字符串 截取 拆分............... JSP页面页头添加<%@ taglib uri="/WEB-INF/taglib/c.tld&qu ...