您的位置:首页 > 编程语言 > Java开发

HDU 1166 敌兵布阵 && HDU 1754 I Hate It(JAVA版)

2014-02-25 23:31 357 查看
HDU 1166 敌兵布阵

题目大意:普通的单点更新,区间求和问题。

思路如下:树状数组跟线段树都成,裸题,当然,用java的要快速io。

AC代码:(树状数组)

import java.io.*;

public class Main
{
static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));

public static int nextInt()throws IOException {in.nextToken();return (int)in.nval;}

public static String next()throws IOException {in.nextToken();return in.sval;}

public static int lowbit(int x) {return x&(-x);}

public static int sum(int x, int[] c)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
sum+=c[i];
return sum;
}

public static void main(String[] args)throws IOException
{
int t=nextInt();
int cas=0;
while(t-->0)
{
int n=nextInt();
int c[]=new int[n+1];
for(int i=1;i<n+1;i++)
{
int num=nextInt();
for(int j=i;j<n+1;j+=lowbit(j))
c[j]+=num;
}

String str=next();
out.println("Case "+(++cas)+":");
while(str.charAt(0)!='E')
{
int a=nextInt();
int b=nextInt();
if(str.charAt(0)=='A' || str.charAt(0)=='S')
{
if(str.charAt(0)=='A');
else{b=-b;}
for(int i=a;i<n+1;i+=lowbit(i))
c[i]+=b;
}
if(str.charAt(0)=='Q')
out.println(sum(b, c)-sum(a-1, c));
str=next();
}
}
out.flush();
}
}

AC代码:(线段树)

import java.io.*;

public class Main
{
static int maxn=50000;
static int sum[]=new int[maxn<<2];
static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));;
static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));;

public static int nextInt()throws IOException {in.nextToken();return (int)in.nval;}

public static String next()throws IOException {in.nextToken();return in.sval;}

public static void buildTree(int l, int r, int rt)throws IOException
{
if(l==r) {sum[rt]=nextInt();return;}

int mid=(l+r)>>1;
buildTree(l, mid, rt<<1);
buildTree(mid+1, r, rt<<1|1);
pushUp(rt);
}

public static void upDate(int p, int add, int l, int r, int rt)
{
if(l==r) {sum[rt]+=add; return;}

int mid=(l+r)>>1;
if(p<=mid)
upDate(p, add, l, mid, rt<<1);
if(p>mid)
upDate(p, add, mid+1, r, rt<<1|1);

pushUp(rt);
}

public static void pushUp(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}

public static int query(int L, int R, int l, int r, int rt)
{
if(L<=l && r<=R) return sum[rt];

int mid=(l+r)>>1, total=0;
if(L<=mid) {total+=query(L, R, l, mid, rt<<1);}
if(R>mid) {total+=query(L, R, mid+1, r, rt<<1|1);}

return total;
}

public static void main(String[] args)throws IOException
{
int t=nextInt();
int cas=0;
while(t-->0)
{
out.println("Case "+(++cas)+":");
int n=nextInt();
buildTree(1, n, 1);
String str=next();
while(str.charAt(0)!='E')
{
int a=nextInt();
int b=nextInt();
if(str.charAt(0)=='Q')
out.println(query(a, b, 1, n, 1));
if(str.charAt(0)=='A')
upDate(a, b, 1, n, 1);
if(str.charAt(0)=='S')
upDate(a, -b, 1, n, 1);
str=next();
}
}
out.flush();
}
}


HDU 1754 I Hate It

题目大意:对区间里的某个值进行修改,并且求某个区间的最大值。

思路如下:明显是线段树的裸题,单点更新与区间求最大值。

AC代码:

import java.util.Scanner;

public class Main
{
static int maxn=200000;
static int max[]=new int[maxn<<2];
static Scanner scan=new Scanner(System.in);

public static void buildTree(int l, int r, int rt)
{
if(l==r){max[rt]=scan.nextInt();return;}

int mid=(l+r)>>1;
buildTree(l, mid, rt<<1);
buildTree(mid+1, r, rt<<1|1);
pushUp(rt);
}

public static void upDate(int p, int change, int l, int r, int rt)
{
if(l==r){max[rt]=change;return;}

int mid=(l+r)>>1;
if(p<=mid) upDate(p, change, l, mid, rt<<1);
if(p>mid) upDate(p, change, mid+1, r, rt<<1|1);
pushUp(rt);
}

public static void pushUp(int rt){max[rt]=Math.max(max[rt<<1], max[rt<<1|1]);}

public static int query(int L, int R, int l, int r, int rt)
{
if(L<=l && r<=R){return max[rt];}

int mid=(l+r)>>1, max=0;
if(L<=mid) max=Math.max(max, query(L, R, l, mid, rt<<1));
if(R>mid) max=Math.max(max, query(L, R, mid+1, r, rt<<1|1));
return max;
}

public static void main(String[] args)
{
while(scan.hasNext())
{
int n=scan.nextInt();
int m=scan.nextInt();
buildTree(1, n, 1);
while(m-->0)
{
String key=scan.next();
int a=scan.nextInt();
int b=scan.nextInt();
if(key.charAt(0)=='Q')
System.out.println(query(a, b, 1, n, 1));
if(key.charAt(0)=='U')
upDate(a, b, 1, n, 1);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: