Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我用JAVA写居然用了5秒多,居然不超时啊!In Reply To:Java代码看过来——关于输入输出避免TLE Posted by:goalboy at 2010-07-24 17:53:09 import java.util.*; class Node { int left; int right; int num; int count; public Node() { } public Node(int left,int right,int num,int count) { this.left=left; this.right=right; this.count=count; this.num=num; } } public class Main { static Scanner scan=new Scanner(System.in); static final int MAX=100010; static int leng,query,kind; static int array[]=new int[MAX]; static int hash[]=new int[MAX]; static Node point[]=new Node[MAX]; static Node tree[]=new Node[MAX*4]; public static void init() { int i; for(i=1;i<=leng;i++) { array[i]=scan.nextInt(); } point[1]=new Node(1,1,array[1],1); hash[1]=1; for(kind=1,i=2;i<=leng;i++) { if(array[i]==array[i-1]) { point[kind].count++; point[kind].right=i; } else { kind++; point[kind]=new Node(i,i,array[i],1); } hash[i]=kind; } } public static void build(int pos,int left,int right) { if(left==right) { tree[pos].count=point[left].count; tree[pos].left=left; tree[pos].right=right; return ; } int mid=(left+right)>>1; build(pos*2,left,mid); build(pos*2+1,mid+1,right); tree[pos].right=right; tree[pos].left=left; if(tree[pos*2].count>tree[pos*2+1].count) { tree[pos].count=tree[pos*2].count; } else { tree[pos].count=tree[pos*2+1].count; } } public static int getsum(int pos,int left,int right) { if(tree[pos].left>=left&&tree[pos].right<=right&&tree[pos].count!=0) { return tree[pos].count; } int mid=(tree[pos].left+tree[pos].right)>>1; if(mid>=right) return getsum(pos*2,left,right); else if(mid<left) return getsum(pos*2+1,left,right); else { int l=getsum(pos*2,left,right); int r=getsum(pos*2+1,left,right); return l>r?l:r; } } public static int slove(int start,int end) { if(hash[start]==hash[end]) return hash[end]-hash[start]+1; else if(hash[start]==hash[end]-1) { int fre1=point[hash[start]].right-start+1; int fre2=end-point[hash[end]].left+1; return fre1>fre2?fre1:fre2; } else { int fre1=point[hash[start]].right-start+1; int fre2=end-point[hash[end]].left+1; fre1=fre1>fre2?fre1:fre2; int ans=getsum(1,hash[start]+1,hash[end]-1); return ans>fre1?ans:fre1; } } public static void main(String[] args) { for(int i=1;i<MAX*4;i++) tree[i]=new Node(); while(true) { int i,start,end; leng=scan.nextInt(); if(leng==0) break; query=scan.nextInt(); init(); build(1,1,kind); for(i=1;i<=query;i++) { start=scan.nextInt(); end=scan.nextInt(); System.out.println(slove(start,end)); } } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator