[NOIP2015]代码
2015-11-23 19:59
148 查看
今年真是挂惨了。。。。。。
考场:
其中大部分是不该失分的,正常水平应该在100+100+80(看常数,COGS上AC)+100+100+80=560......
考场:
T1 magic AAAAAAAAAAprogram _transport; var n,m:longint; a,b,t:array[1..600000] of longint; u,v:array[1..300000] of longint; w:array[1..300000] of longint; vis:array[1..300000] of boolean; father:array[1..300000] of longint; i,j,k,l,p:longint; ans:int64; function max(x,y:longint):longint; begin if x>y then exit(x) else exit(y); end; function min(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; procedure qsort(l,r:longint); var i,j,x,y:longint; begin i:=l; j:=r; x:=a[(l+r) div 2]; repeat while a[i]<x do inc(i); while a[j]>x do dec(j); if i<=j then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; y:=b[i]; b[i]:=b[j]; b[j]:=y; y:=t[i]; t[i]:=t[j]; t[j]:=y; inc(i); dec(j); end; until i>j; if l<j then qsort(l,j); if i<r then qsort(i,r); end; function checkline:boolean; var i:longint; begin if (a[1]<>1)or(b[1]<>2) then exit(false); if (a[2*n-2]<>n)or(b[2*n-2]<>n-1) then exit(false); for i:=2 to n-2 do if ((a[i*2-2]<>i)or(b[i*2-2]<>i+1))and((a[i*2-1]<>i)or(b[i*2-1]<>i+1)) then exit(false); exit(true); end; function find(data,l,r:longint):longint; var mid:longint; begin mid:=(l+r) div 2; if (a[mid]>=data)and(a[mid-1]>=data) then exit(find(data,l,mid-1)); if (a[mid]<data) then exit(find(data,mid+1,r)); if (a[mid]=data)and((mid=1)or(a[mid-1]<data)) then exit(mid); end; procedure maketree(x:longint); var i,j,k:longint; begin vis[x]:=true; j:=find(x,1,2*n-2); if x=n then k:=2*n-2 else k:=find(x+1,1,2*n-2); for i:=j to k-1 do begin if not(vis[b[i]]) then begin father[b[i]]:=x; maketree(b[i]); end; end; end; function findfather(x,y:longint):longint; var i,lsx,lsy,sum:longint; begin fillchar(vis,sizeof(vis),0); lsx:=x; lsy:=y; while x<>0 do begin vis[x]:=true; x:=father[x]; end; while y<>0 do begin if vis[y] then break; y:=father[y]; end; sum:=0; while lsx<>y do begin inc(sum,w[lsx]); lsx:=father[lsx]; end; while lsy<>y do begin inc(sum,w[lsy]); lsy:=father[lsy]; end; exit(sum); end; begin assign(input,'transport.in'); reset(input); assign(output,'transport.out'); rewrite(output); readln(n,m); for i:=1 to n-1 do begin readln(a[i],b[i],t[i]); t[i+n-1]:=t[i]; a[i+n-1]:=b[i]; b[i+n-1]:=a[i]; end; for i:=1 to m do readln(u[i],v[i]); qsort(1,2*n-2); if checkline then begin fillchar(w,sizeof(w),0); w[1]:=t[1]; w[n-1]:=t[2*n-2]; for i:=2 to n-2 do begin if (a[i*2-2]=i)and(b[i*2-2]=i+1) then w[i]:=t[i*2-2] else w[i]:=t[i*2-1]; end; ans:=$3f3f3f3f; for i:=1 to n-1 do begin l:=0; for j:=1 to m do begin p:=0; for k:=u[j] to v[j]-1 do begin if k<>i then p:=p+w[k]; end; if l<p then l:=p; end; if ans>l then ans:=l; end; writeln(ans); end else begin fillchar(vis,sizeof(vis),0); fillchar(father,sizeof(father),0); maketree(1); fillchar(w,sizeof(w),0); for i:=1 to 2*n-2 do if father[a[i]]=b[i] then w[a[i]]:=t[i]; ans:=$3f3f3f3f; for k:=2 to n do begin j:=0; l:=w[k]; w[k]:=0; for i:=1 to m do begin if findfather(u[i],v[i])>j then j:=findfather(u[i],v[i]); end; if ans>j then ans:=j; w[k]:=l; end; writeln(ans); end; close(input); close(output); end. transport.pas |
相关文章推荐
- php之输出缓存ob
- c#多线程__Semaphore
- Java线上排查总结
- iOS求职:C语言面试题
- python后台运行flash跨域服务器
- java持久层框架mybatis如何防止sql注入
- Golang学习笔记:包制作
- 【C#】——文件夹中获取指定特点的文件名
- ByteArrayInputStream 和 ByteArrayOutputStream
- Java JSON(org.json)
- 20本最好的免费的Python书籍
- Java NIO系列教程(九) Java NIO与BIO
- Java NIO系列教程(八) FileChannel
- 如何在VS2013中显示代码行号
- Java NIO系列教程(七) DatagramChannel
- Java NIO系列教程(六) ServerSocketChannel
- Java NIO系列教程(五) SocketChannel
- C语言读取文件
- Java NIO系列教程(四) Selector
- K-近邻算法之Python实现