Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我哭啊,这道题我做了一年了,WAde实在不行了。是不是有什么肮脏的数据阿,携代码求救!

Posted by lin_ at 2006-08-17 20:27:02 on Problem 1193
//java de 

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.TreeSet;


public final class Main{
	final static int nextInt(){
		int v = 0;
		char t = 0;
		boolean neg=false;
		try {
			while (!Character.isDigit(t = (char) System.in.read()) && t!='-')
				;
			if(t=='-'){
				neg=true;
				t='0';
			}
			do {
				v *= 10;
				v += t - '0';
			} while (Character.isDigit(t = (char) System.in.read()));
		} catch (IOException e) {
		}
		return neg?-v:v;
	}
	static final long EMPTY = Long.MIN_VALUE;
	static int N;
	static long TIME;
	static final class Block implements Comparable<Block>{
		Block next,last;
		int start,size;
		long life;
		Block(int start,int size,long life){this.start=start;this.size=size;this.life=life;}
		boolean near(Block b){return start+size==b.start||b.start+b.size==start;}
		boolean expire(){return life==TIME;}
		boolean empty(){return life==EMPTY;}
		public int compareTo(Block o) {return start>o.start?1:(start==o.start?0:-1);}
		@Override
		public boolean equals(Object obj) {	return ((Block)obj).start == start;		}
		@Override
		public int hashCode() { return start; }

		@Override
		public String toString(){
			String c = "";
			if(this.empty())
				c = "   ";
			else if(this.life>0){
				c = "   "+Long.toString(life);
				c = c.substring(c.length()-3);
			}
			String result = "";
			for(int i=0;i<this.size;i++)
				result += c;
			if(next!=Running.end())
				result += next.toString();
			return result;
		}
	}
	static final class Request{
		int size,life;
		long time;
		static final ArrayList<Request> requestList = new ArrayList<Request>();
		Request(long time,int size,int life){this.time=time;this.size=size;this.life=life;}
		static final void append(long time,int size,int life){requestList.add(new Request(time,size,life));}
		static final ArrayList<Request> list(){return requestList;}	
	}
	static final class Waiting{
		static final ArrayList<Request> questList = new ArrayList<Request>();
		static int questIndex = 0;
		static Request top(){return size()>0?questList.get(questIndex):null;}
		static void push(Request r){questList.add(r);}
		static int all(){return questList.size();}
		static Request pop(){return questList.get(questIndex++);}
		static int size(){return questList.size()-questIndex;}
	}
	static final class Running{
		static final Block head=new Block(-1,-1,EMPTY+1);
		static final Block tail=new Block(-1,-1,EMPTY+1);
		
		static final void init(int n){head.next=tail;tail.last=head;insert(new Block(0,n,EMPTY));}
		
		static final void insert(Block b){b.next = head.next;b.last = head;head.next.last = b;head.next = b;}
		static final void append(Block b){b.next=tail;b.last=tail.last;tail.last.next=b;tail.last=b;}
		static final Block begin(){return head.next;}
		static final Block end(){return tail;}
		static final Block find(int size){
			for(Block b=begin();b!=end();b=b.next)
				if(b.size>=size&&b.empty())
					return b;
			return null;
		}
		static final void free(Block b){
			b.life = EMPTY;
			if(b.last.empty()){
				b.size+=b.last.size;
				Block lb=b.last.last;
				lb.next = b;
				b.last = lb;
			}
			
			if(b.next.empty()){
				b.size += b.next.size;
				Block nb=b.next.next;
				b.next = nb;
				nb.last = b;
			}
		}
		static final Block make(Block b,Request r){
			if(b.size<r.size || !b.empty())
				return null;
			Block result = new Block(b.start+r.size,b.size-r.size,EMPTY);
			result.last = b;
			result.next = b.next;
			
			b.life = TIME+r.life;
			b.size = r.size;
			
			if(result.size==0)
				return null;
			b.next.last = result;
			b.next = result;
			return result;
		}
		
	}
	static final class Event{
		final static TreeSet<Long> eventSet = new TreeSet<Long>();
		final static void add(long time){eventSet.add(time);}
		final static long next(){
			ArrayList<Long> toRemove = new ArrayList<Long>();
			Long result = Long.MIN_VALUE;
			for(Long i:eventSet){
				if(i>TIME){
					result = i;
					break;
				}else if(i<TIME)
					toRemove.add(i);
			}
			for(Long i:toRemove)
				eventSet.remove(i);
			eventSet.remove(TIME);
			
			return result;
		}
		
	}
	static final HashSet<Block> Taken=new HashSet<Block>();
	static final boolean process(Request r, boolean alreadyWaiting){
		if(r==null)
			return false;
		Block b=Running.find(r.size);
		if(b==null){
			if(!alreadyWaiting)
				Waiting.push(r);
			return false;
		}
		Block nb = Running.make(b, r);
		if(!b.empty()){
			Taken.add(b);
			Event.add(b.life);
		}
		return true;
	}
	public static final void main(String[] args) throws Exception{
		N=nextInt();
		Running.init(N);
		while(true){
			int t=nextInt(),s=nextInt(),l=nextInt();
			
			if(t==0&&s==0&&l==0)
				break;
			Request.append(t, s, l);
			Event.add(t);
		}
		if(Request.list().size()==0){
			System.out.println(0);
			System.out.println(0);
			return;
		}else{
			TIME=Request.list().get(0).time - 1;
		}
		int requestIndex=0;
		while(true){
			long newTIME = Event.next();
			if(newTIME == Long.MIN_VALUE)
				break;
			TIME = newTIME;
			
			ArrayList<Block> toBeFreed = new ArrayList<Block>();
			for(Block b:Taken)
				if(b.life==TIME){
					Running.free(b);
					toBeFreed.add(b);
				}else if(b.life<TIME){
					//if(Event.eventSet.contains(b.life))
						throw new Exception("cao ");
				}
			for(Block b:toBeFreed)
				Taken.remove(b);
			
			
			
			while(true){
				if(Waiting.size()<=0)
					break;
				if(!process(Waiting.top(), true))
					break;
				Waiting.pop();
			}
			
			for(;requestIndex<Request.list().size();){
				if(Request.list().get(requestIndex).time == TIME){
					process(Request.list().get(requestIndex),false);
					requestIndex++;
				}else if(Request.list().get(requestIndex).time < TIME){
					throw new Exception("cao ");
				}else{
					break;
				}
				
			}
			//System.out.println(Running.begin()+ " "+TIME);
			
		}
		System.out.println(TIME);
		System.out.println(Waiting.all());
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator