codevs 1217 借教室

1217 借教室

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 1000000
 4 #define inf 1<<30
 5
 6 int n,m,tot,num[maxn],q[maxn];
 7 int sta[maxn],d[maxn],end[maxn];
 8
 9 bool check(int now)
10 {
11     tot=0;
12     for(int i=1;i<=n;i++) q[i]=0;
13     for(int i=1;i<=now;i++) q[sta[i]]+=d[i],q[end[i]+1]-=d[i];
14     for(int i=1;i<=n;i++)
15     {
16         tot+=q[i];
17         if(tot>num[i]) return false;
18     }
19     return true;
20 }
21
22 int main()
23 {
24     scanf("%d%d",&n,&m);
25     for(int i=1;i<=n;i++) scanf("%d",&num[i]);
26     for(int i=1;i<=m;i++) scanf("%d%d%d",&d[i],&sta[i],&end[i]);
27     int l=1,r=m;
28     while(l<=r)
29     {
30         int mid=(l+r)/2;
31         if(check(mid)) l=mid+1;
32         else r=mid-1;
33     }
34     if(l>m) printf("0\n");
35     else printf("-1\n%d\n",l);
36     return 0;
37 }

二分

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1000005;
 4 int n,m,x,y,num,i;
 5
 6 struct Edge{
 7     int l,r,w,f,mn;
 8 }tree[maxn<<2];
 9
10 char Cget;
11 inline void read(int &now)
12 {
13     now=0; Cget=getchar();
14     while(Cget>‘9‘||Cget<‘0‘) Cget=getchar();
15     while(Cget>=‘0‘&&Cget<=‘9‘) now=now*10+Cget-‘0‘,Cget=getchar();
16 }
17
18 inline int min(int a,int b) { return a<b?a:b;}
19
20 inline void tree_down(int k)
21 {
22     tree[k<<1].f+=tree[k].f,tree[k<<1|1].f+=tree[k].f;
23     tree[k<<1].mn-=tree[k].f,tree[k<<1|1].mn-=tree[k].f;
24     tree[k].f=0;
25 }
26
27 void tree_build(int l,int r,int k)
28 {
29     tree[k].l=l,tree[k].r=r;
30     if(l==r)
31     {
32         read(tree[k].mn);
33         return ;
34     }
35     int mid=(l+r)>>1;
36     tree_build(l,mid,k<<1);
37     tree_build(mid+1,r,k<<1|1);
38     tree[k].mn=min(tree[k<<1].mn,tree[k<<1|1].mn);
39 }
40
41 void tree_change(int l,int r,int k,int to)
42 {
43     if(tree[k].l>=l&&tree[k].r<=r)
44     {
45         if(tree[k].mn<to)
46         {
47             printf("-1\n%d\n",i);
48             exit(0);
49         }
50         tree[k].mn-=to,tree[k].f+=to;
51         return ;
52     }
53     if(tree[k].f) tree_down(k);
54     int mid=(tree[k].l+tree[k].r)>>1;
55     if(r<=mid) tree_change(l,r,k<<1,to);
56     else if(l>mid) tree_change(l,r,k<<1|1,to);
57     else{
58         tree_change(l,mid,k<<1,to);
59         tree_change(mid+1,r,k<<1|1,to);
60     }
61     tree[k].mn=min(tree[k<<1].mn,tree[k<<1|1].mn);
62 }
63
64 int main()
65 {
66     read(n),read(m);
67     tree_build(1,n,1);
68     for(i=1;i<=m;i++)
69     {
70         read(num),read(x),read(y);
71         tree_change(x,y,1,num);
72     }
73     puts("0");
74     return 0;
75 }

线段树

时间: 2024-10-13 12:19:44

codevs 1217 借教室的相关文章

【题解】CODEVS 1217 借教室 zkw线段树(区间最值)

捣鼓了好长时间才终于把zkw线段树的区间最值修改给A掉了 = =zkw神犇的课件里竟然有错! (╯▽╰)下面的伪代码里被注释的是我修改的>< Func Add_x(s,t,x) for (s=s+M-1,t=t+M+1;s^t^1;s>>=1,t>>=1) { if (~s&1) T[s^1]+=x; if ( t&1) T[t^1]+=x; A=min(T[s],T[s^1]),T[s]-=A,T[s^1]-=A, T[s>>1]+=A;

1217 借教室

1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每

借教室(codevs 1217)

1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每

luogu P1083 借教室

题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求

不用二分的借教室

在网上一直看到用二分做的借教室,说什么线段树会惨遭TLE,然后我就试了一下,并没有什么事情发生(或许是因为optimizi(2)...),但并没有什么关系!!! 我们只需要在每个树的节点上打上mi的标记,表示其子树的最小值,在更新的时候如果mi小于0,就知道不行了,标记一下直接输出就好了... 详见代码: #include<bits/stdc++.h> #pragma GCC optimize(2) #define in1(x) scanf("%d",&x) #de

NOIP2012借教室[线段树|离线 差分 二分答案]

题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没

vijos1782:借教室

描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题.我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即对

【CODEVS1217】借教室

题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj, sj, tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定

【NOIP2012】借教室

在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即