数值标记问题 离线+树状数组 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,所以需要离散化预处理.每次区间向外扩的更新的过程中, ...
随机推荐
- 创建简单动画(一) --- 常规hud
先说下当前我为处理动画的思路: (新手上路, 老司机轻喷,如果有更好的实现方法请大神指教 感恩戴德) #1. 分析动画构成 #2. 如果是位移动画则考虑使用BasicAnimation或者Keyfra ...
- Java静态语句块、语句块、构造方法执行顺序
package com.imooc.practice; class Parent{ public Parent(){ System.out.println("Parent构造方法执行!&qu ...
- getuid和geteuid的区别
getuid() : 函数返回一个调用程序的真实用户ID.表明当前运行位置程序的执行者. geteuid(): 函数返回返回一个有效用户的ID.(EUID)是你最初执行程序时所用的ID,该ID是程序 ...
- PHP数组函数试题
使用Ctrl+A查看答案 1.将数组的键名全部转换成小写和大写的函数是什么?答:array_change_key_case($array [,CASE_LOWER|CASE_UPPER]) 2.创建一 ...
- flex超链接
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- u盘烧写后实际容量变小了
百度了一下 : http://jingyan.baidu.com/article/d45ad148f383ea69552b808a.html 百度下载 USBoot 打开软件 列表中选择你的U盘,点击 ...
- 关于JAVA插入Mysql数据库中文乱码问题解决方案
方案一:在创建client的时候,指定使用的编码方式 具体如下: conn = DriverManager.getConnection("jdbc:mysql://localhost:33 ...
- zf-关于交换工具配置文件,交换的“列名字段”前面加个“0,1,2”的意思。
- 字符串查找 cmd find命令
find /i "ora-" *.log 我对findstr是如此的依赖,以至于当我向各位讲解find命令的时候,我还得老老实实地在cmd窗口中敲下 find /? 这条命令,然后 ...
- properties 配置文件如何换行
在使用properties配置文件的时候我们经常碰到如下两个问题 1:当a=b中的b值内容特别长的时候为了阅读方便我们手动换行,但如果我们直接回车那么后面的数据就会丢失.那如何解决呢? 例如: a=a ...