[shyのJAVA初探]hdu1166●树状数组

一开始shy是为了大数而走近java,随后情不自禁地就希望能初步了解java的语言特点。

java初学对c++选手而言可谓简单非常。因为java的语法和c++的语法简直一样(虽然这话不太严谨,容易遭到很多反驳,不过,,shy实在是没有见过如此相像的两种语言)。比如,①java开变量的方式是:int x;char c;boolean b;②java的for循环:for(int i=1;i<=n;i++){}③java的条件语句:if(--cas>0&&str!="end"){}④java的位运算:x+=x&(-x)⑤java对大小写敏感。。总之,学起来还是非常快速的。

不过坑点也不是没有,就近几日发现的稍微列一下,①比较正常的java读入方式\输出方式:Scanner read=new Scanner(System.in);\System.out.println("");然而,这样子的效率很低,不论怎么搞都是要超时的。②java不能传递变参、不能用指针等。③大数不能直接赋值,大数、字符串等不能直接比较或取值,也不能直接开必须要new。④java输出优化后,必须要flush()来强制输出缓冲区内的内容,不然不满的情况下java不输出。

hdu1166就是树状数组模板题,单点修改、区间求和。

 1 import java.io.*;
 2
 3 public class Main {
 4
 5     static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
 6     static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
 7
 8     public static int readint()throws IOException{in.nextToken();return (int)in.nval;}
 9     public static String readstring()throws IOException{in.nextToken();return in.sval;}
10
11     public static void ad(int x,int y,int n,int[] f){for(;x<=n;x+=x&(-x))f[x]+=y;}
12     public static int sm(int x,int[] f){int y=0;for(;x>0;x-=x&(-x))y+=f[x];return y;}
13
14     public static void main(String[] args)throws IOException{
15         int t=readint();
16         int cas=0;
17         while(cas<t){
18             int n=readint();
19             int f[]=new int[n+1];
20             for(int i=1;i<=n;i++){
21                 int x=readint();
22                 ad(i,x,n,f);
23             }
24             out.println("Case "+(++cas)+":");
25             String s=readstring();
26             while(s.charAt(0)!=‘E‘){
27                 int x=readint();
28                 int y=readint();
29                 if(s.charAt(0)==‘A‘)ad(x,y,n,f);else
30                 if(s.charAt(0)==‘S‘)ad(x,-y,n,f);else
31                 if(s.charAt(0)==‘Q‘)out.println(sm(y,f)-sm(x-1,f));
32                 s=readstring();
33             }
34         }
35         out.flush();
36     }
37
38 }
时间: 2024-10-05 05:55:26

[shyのJAVA初探]hdu1166●树状数组的相关文章

HDU1166 树状数组入门

/**/ #include <cstdio> #include <cstring> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <map> #include <set> #include <vector> #include <string> #include &l

HDU1166 敌兵布阵(树状数组)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 60510    Accepted Submission(s): 25649 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

树状数组Hdu1166

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #include <cstdio> #include <cstdlib> #inclu

HDU1166 敌兵布阵 树状数组|线段树-构造完全二叉树(理解)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 57787 Accepted Submission(s): 24420 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这

HDU1166 敌兵布阵 树状数组水题

中文题目,很简单的题目,区间求和,当然对于线段树来说也很水,为了练习一下树状数组,多做做水题吧,加深理解,并且打好基础,我算是被没打好基础给吓坏了,宁可多花几个小时 刷刷水题扎实点, 很裸的题目 操作也很裸,了解树状数组的肯定能做 #include<iostream> #include<cstdio> #include<list> #include<algorithm> #include<cstring> #include<string&g

hdu1166 敌兵布阵 树状数组/线段树

数列的单点修改.区间求和 树状数组或线段树入门题 1 #include<stdio.h> 2 #include<string.h> 3 4 int c[50005],N; 5 6 void add(int x,int a){ 7 while(x<=N){ 8 c[x]+=a; 9 x+=(x&-x); 10 } 11 return; 12 } 13 14 int sum(int x){ 15 int t=0; 16 while(x){ 17 t+=c[x]; 18 x

hdu1166:敌兵布阵(树状数组或线段树)

题目描述: 一堆废话不用看...... 输入: 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50).接下来每行有一条命令,命令有4种形式:(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);(3)Query i j ,i和j为正整数

HDU1166 敌兵布阵(树状数组)

C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:"Tidy,马上汇

树状数组_POJ树状数组初探

本文出自:http://blog.csdn.net/svitter 树状数组用于处理求区间内的值和改变单个元素的值,要注意树状数组从数组下标1开始. 基础算法: 获取全部的lowbit值,防止重复计算. void getLowbit() { for(int i = 0; i < 1000; i++) lowbit[i] = i & (-i); } 求区间和1~i: int Sum(int i) { int sum = 0; while(i > 0) { sum += C[i]; i =