洛谷 P1083 借教室 题解

这是考试的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 }

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

posted @ 2019-08-03 22:25  handsome_zyc  阅读(277)  评论(1编辑  收藏  举报