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这个不是一般的水,用了库里的LinkedList就RE,TLE一个一个来了,自己写个就没事了。Source Code Problem: 2374 User: yzhw Memory: 45284K Time: 5907MS Language: Java Result: Accepted Source Code import java.io.*; import java.util.*; class stnode { int s,e; boolean cover=false; int covernum=-2; } class st { stnode data[]=new stnode[1000000]; st() { for(int i=0;i<1000000;i++) data[i]=new stnode(); make(0,200001,1); } void make(int s,int e,int pos) { data[pos].s=s; data[pos].e=e; if(e!=s+1) { make(s,(s+e)/2,pos*2); make((s+e)/2,e,pos*2+1); } } int get(int pos) { return get(pos+100000,pos+100001,1); } int get(int s,int e,int pos) { if(data[pos].covernum>=0) return data[pos].covernum; int mid=(data[pos].s+data[pos].e)/2; if(e<=mid) return get(s,e,pos*2); else return get(s,e,pos*2+1); } void insert(int s,int e,int num) { insert(s+100000,e+100001,num,1); } void insert(int s,int e,int num,int pos) { if(data[pos].s==s&&data[pos].e==e) { data[pos].cover=true; data[pos].covernum=num; } else { if(data[pos].cover) { data[pos*2].cover=data[pos*2+1].cover=true; data[pos*2].covernum=data[pos*2+1].covernum=data[pos].covernum; data[pos].cover=false; } int mid=(data[pos].s+data[pos].e)/2; if(e<=mid) insert(s,e,num,pos*2); else if(s>=mid) insert(s,e,num,pos*2+1); else { insert(s,mid,num,pos*2); insert(mid,e,num,pos*2+1); } if(data[pos*2].covernum==data[pos*2+1].covernum) data[pos].covernum=data[pos*2].covernum; else data[pos].covernum=-1; } } } class node { int next,val; node(int a,int b) { next=a; val=b; } } public class Main { static ArrayList <node>g[]; //static LinkedList<Integer> q=new LinkedList<Integer>(); static int data[][]; static int len[]; static int q[]=new int[150000],s=-1,e=-1; static boolean used[]=new boolean[150000]; static boolean empty() { return s==e&&s!=-1; } static void push(int pos) { e=(e+1)%150000; q[e]=pos; } static int pull() { s=(s+1)%150000; return q[s]; } public static void main(String[] args) throws IOException{ StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); int s,n; st set=new st(); in.nextToken(); n=(int)in.nval; in.nextToken(); s=(int)in.nval; data=new int[n+1][2]; g=new ArrayList[2*(n+1)]; for(int i=0;i<2*(n+1);i++) g[i]=new ArrayList<node>(); set.insert(-100000, 100000, 0); for(int i=1;i<=n;i++) { in.nextToken(); data[i][0]=(int)in.nval; in.nextToken(); data[i][1]=(int)in.nval; int aa=set.get(data[i][0]),bb=set.get(data[i][1]); // System.out.println(i+" "+aa+" "+bb); if(aa==0) g[i*2-1].add(new node(0,Math.abs(data[i][0]))); else { g[i*2-1].add(new node(2*aa-1,Math.abs(data[i][0]-data[aa][0]))); g[i*2-1].add(new node(2*aa,Math.abs(data[i][0]-data[aa][1]))); } if(bb==0) g[i*2].add(new node(0,Math.abs(data[i][1]))); else { g[i*2].add(new node(2*bb-1,Math.abs(data[i][1]-data[bb][0]))); g[i*2].add(new node(2*bb,Math.abs(data[i][1]-data[bb][1]))); } set.insert(data[i][0],data[i][1],i); } g[2*n+1].add(new node(2*n-1,Math.abs(s-data[n][0]))); g[2*n+1].add(new node(2*n,Math.abs(s-data[n][1]))); len=new int[2*n+2]; Arrays.fill(len, 0xfffffff); len[2*n+1]=0; push(2*n+1); Arrays.fill(used, false); used[2*n+1]=true; while(!empty()) { int top=pull(); used[top]=false; for(int i=0;i<g[top].size();i++) { if(len[g[top].get(i).next]>len[top]+g[top].get(i).val) { len[g[top].get(i).next]=len[top]+g[top].get(i).val; if(!used[g[top].get(i).next]) push(g[top].get(i).next); used[g[top].get(i).next]=true; } } } System.out.println(len[0]); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator