http://acm.fzu.edu.cn/problem.php?pid=1608
题目的意思很简单,就是问在所给的时间段内的最大的工作量,考察的是线段树,下面是偶写的不怎么样的Pascal代码
跑了3S+...无语,C++ 1S内..寒~
插入的时候完全覆盖才插入,最后来次dfs更新,统计元区间的值就OK
- type Segment=record
- L,R,tLen:longint;
- end;
- var
- ans:longint;
- flag:array [0..1000001] of boolean;
- seg:array [0..1000001] of Segment;
- procedure mkseg(L,r,node:longint);
- var
- mid:longint;
- begin
- Mid:=(L+R) div 2;
- flag[node]:=true;
- seg[node].L:=L;
- seg[node].R:=R;
- seg[node].tLen:=0;
- if(Mid-L>=1)then mkseg(L,Mid,2*node);
- if((R-Mid>=1)and(Mid<>L))then mkseg(Mid,R,2*node+1);
- end;
- procedure ins(node,L,R,val:longint);
- var
- tm:longint;
- begin
- if((flag[node]=false)or(seg[node].tLen>=val))then exit;
- if((L<=seg[node].L)and(seg[node].R<=R)) then begin
- if(val>seg[node].tLen)then seg[node].tLen:=val;
- exit;
- end;
- tM:=(seg[node].L+seg[node].R) div 2;
- if(R<=tM) then
- ins(2*node,L,R,val)
- else
- if(L>=tM) then
- ins(2*node+1,L,R,val)
- else
- begin
- ins(2*node,L,tM,val);ins(2*node+1,tM,R,val);
- end;
- end;
- procedure update(node:longint);
- begin
- if(seg[node].R=seg[node].L+1)then
- inc(ans,seg[node].tLen)
- else
- begin
- if(flag[2*node]=true)then begin
- if(seg[node].tLen>seg[2*node].tLen)then
- seg[2*node].tLen:=seg[node].tLen;
- update(2*node);
- end;
- if(flag[2*node+1]=true)then begin
- if(seg[node].tLen>seg[2*node+1].tLen)then
- seg[2*node+1].tLen:=seg[node].tLen;
- update(2*node+1);
- end;
- end;
- end;
- var
- n,k,l,r,val,i:longint;
- begin
- while not eof do begin
- readln(n,k);
- fillchar(flag,sizeof(flag),false);
- mkseg(0,n,1);
- for i:=1 to k do begin
- readln(l,r,val);
- ins(1,l,r,val);
- end;
- ans:=0;
- update(1);
- writeln(ans);
- end;
- end.
如果上面的代码看的还是很别扭那下面是C++的
囧
- #include <iostream>
- using namespace std;
- int ans;
- bool flag[1000001];
- struct Segment
- {
- int L,R,tLen;
- }seg[1000001];
- inline void make(int L,int R,int node)
- {
- int Mid=(L+R)/2;
- flag[node]=true;
- seg[node].L=L;
- seg[node].R=R;
- seg[node].tLen=0;
- if(Mid-L>=1)make(L,Mid,2*node);
- if(R-Mid>=1&&Mid!=L)make(Mid,R,2*node+1);
- }
- inline void insert(int node,int L,int R,int val)
- {
- if(!flag[node]||seg[node].tLen>=val)return;
- if(L<=seg[node].L&&seg[node].R<=R)//完全覆盖
- {
- if(val>seg[node].tLen)seg[node].tLen=val;
- return;
- }
- int tM=(seg[node].L+seg[node].R)/2;
- if(R<=tM)
- insert(2*node,L,R,val);
- else
- if(L>=tM)
- insert(2*node+1,L,R,val);
- else
- insert(2*node,L,tM,val),insert(2*node+1,tM,R,val);
- }
- inline void update(int node)
- {
- if(seg[node].R==seg[node].L+1)
- ans+=seg[node].tLen;
- else
- {
- if(flag[2*node])
- {
- if(seg[node].tLen>seg[2*node].tLen)
- seg[2*node].tLen=seg[node].tLen;
- }
- if(flag[2*node+1])
- {
- if(seg[node].tLen>seg[2*node+1].tLen)
- seg[2*node+1].tLen=seg[node].tLen;
- }
- if(flag[2*node])update(2*node);
- if(flag[2*node+1])update(2*node+1);
- }
- }
- int main()
- {
- int n,k,l,r,val;
- //OPEN
- while(scanf("%d%d",&n,&k)!=EOF)
- {
- memset(flag,false,sizeof(flag));
- make(0,n,1);
- while(k--)
- {
- scanf("%d%d%d",&l,&r,&val);
- insert(1,l,r,val);//insert datas;
- }
- ans=0;
- update(1);
- printf("%d/n",ans);
- }
- return 0;
- }