博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HDOJ3333]Turing Tree(离线,树状数组)
阅读量:4923 次
发布时间:2019-06-11

本文共 2890 字,大约阅读时间需要 9 分钟。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333

题意:求区间[l,r]内不重复的数字的和。

思路:存下所有的查询后排序,扫描原数组的时候记录当前数字的下标并且查看是否出现过,未出现过则更新a[i]到bit的[1,i]位置上;否则更新[上次位置,i]。一边更新一边查询,这样求和不会重复。

相当于一边更新一边查,把唯一的结果都尽可能地往右堆,因为保证了查询左边界一定是在移动的。

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 using namespace std; 20 #define fr first 21 #define sc second 22 #define cl clear 23 #define BUG puts("here!!!") 24 #define W(a) while(a--) 25 #define pb(a) push_back(a) 26 #define Rint(a) scanf("%d", &a) 27 #define Rll(a) scanf("%I64d", &a) 28 #define Rs(a) scanf("%s", a) 29 #define Cin(a) cin >> a 30 #define FRead() freopen("in", "r", stdin) 31 #define FWrite() freopen("out", "w", stdout) 32 #define Rep(i, len) for(int i = 0; i < (len); i++) 33 #define For(i, a, len) for(int i = (a); i < (len); i++) 34 #define Cls(a) memset((a), 0, sizeof(a)) 35 #define Clr(a, x) memset((a), (x), sizeof(a)) 36 #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) 37 #define lrt rt << 1 38 #define rrt rt << 1 | 1 39 #define pi 3.14159265359 40 #define RT return 41 #define lowbit(x) x & (-x) 42 #define onecnt(x) __builtin_popcount(x) 43 typedef long long LL; 44 typedef long double LD; 45 typedef unsigned long long ULL; 46 typedef pair
pii; 47 typedef pair
psi; 48 typedef pair
pll; 49 typedef map
msi; 50 typedef vector
vi; 51 typedef vector
vl; 52 typedef vector
vvl; 53 typedef vector
vb; 54 55 typedef struct Query { 56 int l, r; 57 int id; 58 Query() {} 59 Query(int ll, int rr, int ii) : l(ll), r(rr), id(ii) {} 60 }Query; 61 const int maxn = 30100; 62 const int maxq = 100100; 63 int n, q, cur; 64 int a[maxn]; 65 LL bit[maxn]; 66 map
id; 67 68 Query query[maxq]; 69 LL ret[maxq]; 70 71 LL sum(int i) { 72 LL s = 0; 73 while(i > 0) { 74 s += bit[i]; 75 i -= lowbit(i); 76 } 77 return s; 78 } 79 80 void add(int i, int x) { 81 while(i <= n) { 82 bit[i] += x; 83 i += lowbit(i); 84 } 85 } 86 87 bool cmp(Query a, Query b) { 88 if(a.r == b.r) return a.l < b.l; 89 return a.r < b.r; 90 } 91 92 int main() { 93 // FRead(); 94 int T, l, r; 95 Rint(T); 96 W(T) { 97 Cls(bit); id.clear(); cur = 0; 98 Rint(n); 99 For(i, 1, n+1) Rint(a[i]);100 Rint(q);101 Rep(i, q) {102 Rint(l); Rint(r);103 query[i] = Query(l, r, i);104 }105 sort(query, query+q, cmp);106 For(i, 1, n+1) {107 if(id.find(a[i]) == id.end()) {108 add(i, a[i]);109 id[a[i]] = i;110 }111 else {112 add(i, a[i]);113 add(id[a[i]], -a[i]);114 id[a[i]] = i;115 }116 while(query[cur].r == i) {117 ret[query[cur].id] = sum(query[cur].r) - sum(query[cur].l-1);118 cur++;119 }120 }121 Rep(i, q) printf("%I64d\n", ret[i]);122 }123 RT 0;124 }

 

转载于:https://www.cnblogs.com/kirai/p/5868996.html

你可能感兴趣的文章
react常用语法
查看>>
【json的使用】
查看>>
ural 1519 Formula 1(插头dp)
查看>>
序列化和反序列化
查看>>
Web服务器Nginx多方位优化策略
查看>>
作业六:三层神经网络调参
查看>>
Java中的hashcode方法
查看>>
OpenCV学习 7:图像形态学:腐蚀、膨胀
查看>>
软件需求与分析课堂讨论一
查看>>
js添加var和不加var区别
查看>>
时钟程序
查看>>
无法识别的配置节log4net的(Unrecognized configuration section log4net)
查看>>
个人项目-小学四则运算 “软件”之初版
查看>>
cocos2d-html5学习笔记——创建持续性动作
查看>>
软件工程心得体会
查看>>
typedef typedef struct的使用
查看>>
Log4Net各参数API
查看>>
接收发送给服务器的Post请求
查看>>
asp.net客户端IP跟踪
查看>>
前端jquery validate表单验证框架的使用
查看>>