BZOJ4422 : [Cerc2015]Cow Confinement
从右往左扫描线,用线段树维护扫描线上每一个点能达到的花的数量,并支持最近篱笆的查询。
对于一朵花,找到它上方最近的篱笆,那么它对这中间的每头牛的贡献都是$1$。
当扫到一个篱笆的右边界时,这中间的答案都要清零。
当扫到一个篱笆的左边界时,这中间的答案同理都要清零,但是要向上直到最近的篱笆为止都加上下面的答案。
这中间对这个篱笆右下角的贡献会重复计数,因此需要减掉。
时间复杂度$O(n\log n)$。
#include<cstdio>
#include<algorithm>
const int N=1000005,M=2100000,U=200010;
int n,m,cnt,i,v[M],ta[M],tc[M],f[U],ans[U];
struct E{
int x,l,r,t,i;
E(){}
E(int _x,int _l,int _r,int _t,int _i){x=_x,l=_l,r=_r,t=_t,i=_i;}
}e[U*5];
inline bool cmp(const E&a,const E&b){
if(a.x!=b.x)return a.x>b.x;
if(a.t!=b.t)return a.t<b.t;
return a.l<b.l;
}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void taga1(int x,int p){if(~tc[x])tc[x]+=p;else ta[x]+=p;}
inline void tagc1(int x,int p){ta[x]=0;tc[x]=p;}
inline void pb(int x){
if(ta[x])taga1(x<<1,ta[x]),taga1(x<<1|1,ta[x]),ta[x]=0;
if(~tc[x])tagc1(x<<1,tc[x]),tagc1(x<<1|1,tc[x]),tc[x]=-1;
}
void change(int x,int a,int b,int c,int p){
if(a==b){v[x]=p?a:0;return;}
int mid=(a+b)>>1;
c<=mid?change(x<<1,a,mid,c,p):change(x<<1|1,mid+1,b,c,p);
v[x]=v[x<<1|1]?v[x<<1|1]:v[x<<1];
}
int get(int x,int a,int b,int d){
if(b<=d)return v[x];
int mid=(a+b)>>1,t=0;
if(d>mid)t=get(x<<1|1,mid+1,b,d);
if(t)return t;
return get(x<<1,a,mid,d);
}
void add(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){taga1(x,p);return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)add(x<<1,a,mid,c,d,p);
if(d>mid)add(x<<1|1,mid+1,b,c,d,p);
}
void clear(int x,int a,int b,int c,int d){
if(c<=a&&b<=d){tagc1(x,0);return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)clear(x<<1,a,mid,c,d);
if(d>mid)clear(x<<1|1,mid+1,b,c,d);
}
int ask(int x,int a,int b,int c){
if(a==b)return ta[x]+tc[x];
pb(x);
int mid=(a+b)>>1;
return c<=mid?ask(x<<1,a,mid,c):ask(x<<1|1,mid+1,b,c);
}
int main(){
read(m);
for(i=1;i<=m;i++){
int xl,xr,yl,yr;
read(xl),read(yl),read(xr),read(yr);
e[++cnt]=E(yr,xl,xr,-2,0);
e[++cnt]=E(yl-1,xl,xr,-1,i);
e[++cnt]=E(yr+1,xr+1,0,1,-i);
}
read(m);
while(m--){
int x,y;
read(x),read(y);
e[++cnt]=E(y,x,0,0,0);
}
read(n);
for(i=1;i<=n;i++){
int x,y;
read(x),read(y);
e[++cnt]=E(y,x,0,1,i);
}
std::sort(e+1,e+cnt+1,cmp);
for(i=1;i<=cnt;i++){
int l=e[i].l,r=e[i].r;
if(e[i].t==-1){
change(1,0,N,l-1,0);
change(1,0,N,r,0);
int o=get(1,0,N,l-1);
clear(1,0,N,l,r);
add(1,0,N,o+1,r,ask(1,0,N,r+1));
if(o+1<=l-1&&f[e[i].i])add(1,0,N,o+1,l-1,-f[e[i].i]);
}else if(e[i].t==-2){
change(1,0,N,l-1,1);
change(1,0,N,r,1);
clear(1,0,N,l,r);
}else if(!e[i].t)add(1,0,N,get(1,0,N,l-1)+1,l,1);
else{
if(e[i].i>0)ans[e[i].i]=ask(1,0,N,l);
else f[-e[i].i]=ask(1,0,N,l);
}
}
for(i=1;i<=n;i++)printf("%d\n",ans[i]);
return 0;
}
BZOJ4422 : [Cerc2015]Cow Confinement的更多相关文章
- BZOJ4422[Cerc2015]Cow Confinement(扫描线+线段树)
很容易发现一个O(n2)DP,f[i][j]=f[i][j+1]+f[i+1][j]-f[i+1][j+1].然后由于有栅栏,一些位置没办法走,然后就可以用类似差分的方法,f[i]表示当前行f[i+1 ...
- 【BZOJ-4422】Cow Confinement 线段树 + 扫描线 + 差分 (优化DP)
4422: [Cerc2015]Cow Confinement Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 61 Solved: 26[Submi ...
- BZOJ 4422 Cow Confinement (线段树、DP、扫描线、差分)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4422 我真服了..这题我能调一天半,最后还是对拍拍出来的...脑子还是有病啊 题解: ...
- Codeforces Gym 101480C - Cow Confinement(扫描线+线段树)
题面传送门 题意: 有一个 \(10^6\times 10^6\) 的地图.其中 \(m\) 个位置上有花,\(f\) 个矩形外围用栅栏围了起来.保证 \(f\) 个矩形两两之间没有公共点. \(q\ ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- POJ 3278 Catch That Cow(bfs)
传送门 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 80273 Accepted: 25 ...
- 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心
SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...
- HDU Cow Sorting (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1 ...
- [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
[BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 试题描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发 ...
随机推荐
- 论文阅读笔记十四:Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation(CVPR2015)
论文链接:https://arxiv.org/abs/1506.04924 摘要 该文提出了基于混合标签的半监督分割网络.与当前基于区域分类的单任务的分割方法不同,Decoupled 网络将分割与分类 ...
- 牛客寒假算法基础训练集中营4 E题 Applese 涂颜色
链接:https://ac.nowcoder.com/acm/contest/330/E 来源:牛客网 题目描述 精通程序设计的 Applese 叕写了一个游戏. 在这个游戏中,有一个 n 行 m 列 ...
- 关于使用summernote编辑器提示内容无法汉化临时解决办法
原因:使用汉化summernote-zh-CN.js文件无法汉化 $('#summernote').summernote({ lang: 'zh-CN' }); 解决方法: 打开summernote. ...
- Caused by: java.lang.ClassNotFoundException: Didn't find class "io.grpc.helloworldexample.HelloworldActivity" on path: DexPathList
FAQ: Android app 编译好后安装到手机,运行时闪退,报如下错误: java.lang.RuntimeException: Unable to instantiate activity ...
- linux操作系统中的netstat命令查看端口状态的使用和window操作系统查看端口号
1:linux操作系统 netstat 命令用于显示各种网络相关信息,即网络状态.而我主要使用netstat查看端口号是否启动: 参数详情: 1 -a (all)显示所有选项,默认不显示LISTEN相 ...
- CentOS6 安装gnutls
所有用的的包:https://pan.baidu.com/s/1EQYf3gsK_xT6kCAjrVs2aQ wget http://download.savannah.gnu.org/release ...
- C#操作windows服务
本文主要说明了Windows服务的安装.卸载.启动.停止.获取服务安装路径.获取服务状态.检查服务是否存在.获取服务版本. 我们需要引用命名空间using System.Configuration.I ...
- WebApi接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ...
- 基于AspNet Core2.0 开发框架,包含简单的个人博客Demo
大家好,最近离职了,利用闲暇时间就捣鼓了一个基于AspNet Core开发框架,分享出来希望能给AspNet Core学者带来一些帮助,同时也能跟大家一起学习.当然了,由于我的个人技术及经验的有限,框 ...
- ng2tree在ios中无法触发click
问题描述: 从其他页面跳转回ng2tree的页面时,无法触发节点的click事件 解决方案: 1. 在node_modules中搜索onNodeSeclected方法,修改click为touchend ...