BestCoder Round #2
TIANKENG’s restaurant http://acm.hdu.edu.cn/showproblem.php?pid=4883
竟然暴力1.44*10^7 还要*T=100 竟然过了
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 const int M=1450; 7 int sum[M]; 8 int main(){ 9 int t,n; 10 while(~scanf("%d",&t)){ 11 while(t--){ 12 scanf("%d",&n); 13 mt(sum,0); 14 while(n--){ 15 int add,sx,sy,ex,ey; 16 scanf("%d %d:%d %d:%d",&add,&sx,&sy,&ex,&ey); 17 sx=sx*60+sy+1; 18 ex=ex*60+ey; 19 for(int i=sx;i<=ex;i++) sum[i]+=add; 20 } 21 int big=0; 22 for(int i=0;i<M;i++){ 23 big=max(big,sum[i]); 24 } 25 printf("%d\n",big); 26 } 27 } 28 return 0; 29 }
线段树RE,因为题目中会出现sx>ex。判了就过。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 #define lrrt int L,int R,int rt 6 #define iall 1,n,1 7 #define imid int mid=(L+R)>>1 8 #define lson L,mid,rt<<1 9 #define rson mid+1,R,rt<<1|1 10 using namespace std; 11 const int M=1450; 12 int tree[M<<2]; 13 void pushdown(int rt){ 14 if(tree[rt]){ 15 tree[rt<<1]+=tree[rt]; 16 tree[rt<<1|1]+=tree[rt]; 17 tree[rt]=0; 18 } 19 } 20 void update(int x,int y,int val,lrrt){ 21 if(x<=L&&R<=y){ 22 tree[rt]+=val; 23 return ; 24 } 25 pushdown(rt); 26 imid; 27 if(mid>=x) update(x,y,val,lson); 28 if(mid<y) update(x,y,val,rson); 29 } 30 int big; 31 void query(lrrt){ 32 if(L==R){ 33 big=max(big,tree[rt]); 34 return ; 35 } 36 imid; 37 pushdown(rt); 38 query(lson); 39 query(rson); 40 } 41 int main(){ 42 int t,n=1439,m; 43 while(~scanf("%d",&t)){ 44 while(t--){ 45 scanf("%d",&m); 46 mt(tree,0); 47 while(m--){ 48 int add,sx,sy,ex,ey; 49 scanf("%d %d:%d %d:%d",&add,&sx,&sy,&ex,&ey); 50 sx=sx*60+sy; 51 ex=ex*60+ey-1; 52 if(sx>ex) continue; 53 update(sx,ex,add,iall); 54 } 55 big=0; 56 query(iall); 57 printf("%d\n",big); 58 } 59 } 60 return 0; 61 }
正解是o(n)算法,标记,左++,右--。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 const int M=1450; 7 int sum[M]; 8 int main(){ 9 int t,n=1439,m; 10 while(~scanf("%d",&t)){ 11 while(t--){ 12 scanf("%d",&m); 13 mt(sum,0); 14 while(m--){ 15 int add,sx,sy,ex,ey; 16 scanf("%d %d:%d %d:%d",&add,&sx,&sy,&ex,&ey); 17 sx=sx*60+sy; 18 ex=ex*60+ey; 19 if(sx>ex) continue; 20 sum[sx]+=add; 21 sum[ex]-=add; 22 } 23 int big=0; 24 int now=0; 25 for(int i=0;i<M;i++){ 26 now+=sum[i]; 27 big=max(big,now); 28 } 29 printf("%d\n",big); 30 } 31 } 32 return 0; 33 }
end