洛谷 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 }
请各位大佬斧正(反正我不认识斧正是什么意思)