影子的宽度&&盒子的个数 |
您所在的位置:网站首页 › 相似影子投到墙上的图片素材 › 影子的宽度&&盒子的个数 |
影子的宽度
问题描述
桌子上零散地放着若干个盒子,盒子都平行于墙。桌子的后方是一堵墙。如图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少? 输入格式 第1行:3个整数L,R,N。-100000 ≤L≤R≤ 100000,表示墙所在的区间;1≤N≤100000,表示盒子的个数 接下来N行,每行2个整数BL, BR,-100000 ≤BL≤BR≤ 100000,表示一个盒子的左、右端点 输出格式 第1行:1个整数W,表示影子的总宽度。 样例输入 Sample Input 1 0 7 2 1 2 4 5 Sample Input 2 -10 10 2 -5 2 -2 2 Sample Input 3 -10 10 3 -7 0 -4 9 -4 2 Sample Input 4 -100 100 3 -7 2 5 9 2 5 Sample Input 5 -50 50 4 -2 4 0 6 9 10 -5 30 样例输出 Sample Output 1 2 Sample Output 2 7 Sample Output 3 16 Sample Output 4 16 Sample Output 5 35 题解 用线段树维护左闭右开的区间 [l,r)影子的总宽度,标记flag表示这段区间是否全被影子覆盖。下传标记的时候,传完后不能置为0。 1 #include 2 const int maxn=100000; 3 struct node{ 4 int num; 5 bool lb,rb,flag; 6 }f[5000005]; 7 int n,L,R,s,t; 8 int max(int x,int y) 9 { 10 return x>y?x:y; 11 } 12 void pushdown(int l,int r,int id) 13 { 14 if (!f[id].flag) return; 15 int ls=id1; 16 f[ls].num=mid-l; 17 f[rs].num=r-mid; 18 f[ls].flag=f[rs].flag=1; 19 f[ls].lb=f[ls].rb=f[rs].lb=f[rs].rb=1; 20 // f[id].flag=0; // 不知道为什么写了这句会WA 21 return; 22 } 23 void modify(int l,int r,int id) // [ l , r ) 24 { 25 pushdown(l,r,id); 26 if (sd[i]的盒子j不能把盒子i完全挡住,那么盒子i就可以被看到。 回忆前一题,每添加一个盒子,就会把线段树的一些区间完全覆盖,那么我们倒过来,从n到1添加盒子,在添加第i个盒子前,线段树上被覆盖的区间就是被挡住看不到的区间。要判断一个盒子能不能被看到,只要在这个盒子覆盖区间之前,判断一下要被覆盖的区间是不是已经被完全覆盖,如果没有被完全覆盖,这个盒子就可以被看到。 1 #include 2 const int maxn=100000; 3 struct node{ 4 int num; 5 bool lb,rb,flag; 6 }f[5000005]; 7 int n,L,R,s,t,bl[100005],br[100005],ans,p; 8 bool cansee[100005]; 9 int max(int x,int y) 10 { 11 return x>y?x:y; 12 } 13 void pushdown(int l,int r,int id) 14 { 15 if (!f[id].flag) return; 16 int ls=id1; 17 f[ls].num=mid-l; 18 f[rs].num=r-mid; 19 f[ls].flag=f[rs].flag=1; 20 f[ls].lb=f[ls].rb=f[rs].lb=f[rs].rb=1; 21 return; 22 } 23 void modify(int l,int r,int id) // [ l , r ) 24 { 25 pushdown(l,r,id); 26 if (s=1;p--) 52 s=bl[p],t=br[p], 53 modify(L,R,1); 54 for (i=1;i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |