首页 > 其他 > 详细

洛谷 P1083 借教室 题解

时间:2019-08-03 22:38:42      阅读:142      评论:0      收藏:0      [点我收藏+]

这是考试的T4。

T2 sb dp不想发了,T3 文化之旅是道错题,暴力20分。

Analysis

用差分数组储存借教室的情况,二分答案求差分数组前缀和判断合不合法。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define maxn 1000010
 6 using namespace std;
 7 inline int read()
 8 {
 9     int x=0;
10     bool f=1;
11     char c=getchar();
12     for(; !isdigit(c); c=getchar()) if(c==-) f=0;
13     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-0;
14     if(f) return x;
15     return 0-x;
16 }
17 inline void write(int x)
18 {
19     if(x<0){putchar(-);x=-x;}
20     if(x>9)write(x/10);
21     putchar(x%10+0);
22 }
23 int n,m;
24 int in[maxn],cha[maxn],d[maxn],s[maxn],t[maxn],sum[maxn];
25 inline bool check(int x)
26 {
27     memset(cha,0,sizeof(cha));
28     for(int i=1;i<=x;i++)
29     {
30         cha[s[i]]+=d[i];
31         cha[t[i]+1]-=d[i];
32     }
33     sum[1]=cha[1];
34     for(int i=2;i<=n;i++)
35     {
36         sum[i]=sum[i-1]+cha[i];
37         if(sum[i]>in[i])return false;
38     }
39     return true;
40 }
41 int main()
42 {
43 //    freopen("classroom.in","r",stdin);
44 //    freopen("classroom.out","w",stdout);
45     n=read();m=read();
46     for(int i=1;i<=n;i++) in[i]=read();
47     for(int i=1;i<=m;i++)
48     {
49         d[i]=read();
50         s[i]=read();
51         t[i]=read();
52     }
53     if(check(m)==true)
54     {
55         write(0);
56         return 0;
57     }
58     int l=1,r=m,mid=0;
59     while(l<r)
60     {
61         mid=(l+r)/2;
62         if(check(mid)==false) r=mid;
63         else l=mid+1;
64     }
65     write(-1);
66     printf("\n");
67     write(l);
68     return 0;
69 }

请各位大佬斧正(反正我不认识斧正是什么意思)

洛谷 P1083 借教室 题解

原文:https://www.cnblogs.com/handsome-zyc/p/11296571.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!