hdu3333区间统计
2015-08-27 16:21
162 查看
题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.NavigableSet; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; import java.util.Set; import java.util.SortedSet; import java.util.Stack; import java.util.StringTokenizer; import java.util.TreeSet; public class Main { public static void main(String[] args) throws IOException{ StreamTokenizer cin = new StreamTokenizer(new BufferedInputStream(System.in)); InputReader in = new InputReader(System.in) ; PrintWriter out = new PrintWriter(System.out) ; int t = in.nextInt() ; for(int i = 1 ; i <= t ; i++){ // out.print("Case " + i + ": "); new Task().solve(in, out); } out.flush() ; } } class Task{ static int N = 30002 ; static long[] sum = new long[N<<2] ; static int[] num = new int ; static long[] answer = new long[100002] ; void update(int i , long val , int l , int r , int t){ if(l == r){ sum[t] += val ; return ; } int m = (l + r) >> 1 ; if(i <= m) update(i, val, l, m, t<<1) ; else update(i, val, m+1, r, t<<1|1) ; sum[t] = sum[t<<1] + sum[t<<1|1] ; } long ask(int L , int R , int l , int r , int t){ if(L <= l && r <= R) return sum[t] ; long s = 0 ; int m = (l + r) >> 1 ; if(L <= m) s += ask(L , R , l, m, t<<1) ; if(R > m) s += ask(L , R , m+1, r, t<<1|1) ; return s ; } static class Query implements Comparable<Query>{ int left ; int right ; int id ; public Query(int left , int right , int id){ this.left = left ; this.right = right ; this.id = id ; } public int compareTo(Query o) { return Integer.compare(right, o.right) ; } } public void solve(InputReader in , PrintWriter out) throws IOException{ HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>() ; int n = in.nextInt() ; for(int i = 1 ; i <= n ; i++) num[i] = in.nextInt() ; int m = in.nextInt() ; Query[] q = new Query[m] ; for(int i = 0 ; i < m ; i++) q[i] = new Query(in.nextInt(), in.nextInt(), i) ; Arrays.sort(q) ; Arrays.fill(sum, 0) ; int pos = 1 ; for(int i = 0 ; i < m ; i++){ for( ; pos <= n && pos <= q[i].right ; pos++){ if(hash.get(num[pos]) != null) update(hash.get(num[pos]), -num[pos], 1, n, 1) ; hash.put(num[pos], pos) ; update(pos, num[pos], 1, n, 1) ; } answer[q[i].id] = ask(q[i].left, q[i].right, 1, n, 1) ; } for(int i = 0 ; i < m ; i++) out.println(answer[i]) ; } } class InputReader{ public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream){ reader = new BufferedReader(new InputStreamReader(stream), 32768) ; tokenizer = null ; } public String next(){ while(tokenizer == null || ! tokenizer.hasMoreTokens()){ try{ tokenizer = new StringTokenizer(reader.readLine()); }catch (IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt(){ return Integer.parseInt(next()); } public long nextLong(){ return Long.parseLong(next()); } public double nextDouble(){ return Double.parseDouble(next()); } }
相关文章推荐
- android studio 多渠道打包,调试正式包,build.gradle解析
- 我喜欢出发
- SQL Server存储过程创建和修改
- lesson3-jvm虚拟机类加载
- 快速的安装程序产生器:INF-Tool
- IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法
- 办公超实用利器系列-批量打印
- js对象
- Android UI 绘制过程浅析(二)onMeasure过程
- [转]CSS遮罩——如何在CSS中使用遮罩
- 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
- C# 窗体中 webbrowser 中 javascript 调用窗体方法 实例
- 对onreadystatechange属性的理解
- EmgnCv进行轮廓寻找和计算物体凸包
- 状态压缩DP专题
- swift 错误处理
- Hadoop2.2.0安装配置手册!完全分布式Hadoop集群搭建过程~(心血之作啊~~)
- c语言运算符号详细说明
- Android NDK开发环境搭建
- 基于MC方法的断层图像可视化