【JZOJ 3893】 画矩形
Description
Time Limits: 2000 ms Memory Limits:262144 KB
Analysis
比赛时打了树状数组套线段树,巨大常数卡空间卡时间40分(可是理论复杂度是nlog^2的啊),看这数据范围就是要卡树套树的
然而这是一个经典模型,之前某篇题解写过:传送门
这题的区别是有动态加点操作,所以不能像那题一样直接快排
按时间分治
我们将操作按时间分治(不知道是不是CDQ分治)
那么对于一段操作区间[L,R]
将[L,mid]中的插入点操作来更新[mid+1,R]中的询问操作
这就是套路,参见链接中的题解,树状数组nlogn
总复杂度nlog^2
正确性显然
summary
什么情况下可以将操作按时间分治?
- 可以离线
- 修改操作互相独立
- 各个修改对答案的贡献互不影响
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=200005;
int n,m,num,lim,BIT[N],ans[N];
struct op
{int tp,x1,y1,x2,y2;
}b[N];
struct lyd
{int x,y,z,id;
}a[N*4],c[N*4];
bool cmp(lyd a,lyd b)
{return a.y>b.y;
}
int lowbit(int x)
{return x&-x;
}
int get(int x)
{int t=0;for(int i=x;i;i-=lowbit(i)) t+=BIT[i];return t;
}
void add(int x,int z)
{for(int i=x;i<=lim;i+=lowbit(i)) BIT[i]+=z;
}
void divide(int l,int r)
{if(l==r) return;int mid=(l+r)>>1;n=0;fo(i,l,mid)if(b[i].tp==0){a[++n].x=b[i].x2,a[n].y=b[i].y2,a[n].z=1;a[++n].x=b[i].x2,a[n].y=b[i].y1-1,a[n].z=-1;a[++n].x=b[i].x1-1,a[n].y=b[i].y2,a[n].z=-1;a[++n].x=b[i].x1-1,a[n].y=b[i].y1-1,a[n].z=1;}sort(a+1,a+n+1,cmp);m=0;fo(i,mid+1,r)if(b[i].tp==1) c[++m].x=b[i].x1,c[m].y=b[i].y1,c[m].id=i;sort(c+1,c+m+1,cmp);int j=1;fo(i,1,m){while(j<=n && a[j].y>=c[i].y) add(a[j].x,a[j].z),j++;ans[c[i].id]+=get(lim)-get(c[i].x-1);}while(--j) add(a[j].x,-a[j].z);divide(l,mid);divide(mid+1,r);
}
int main()
{scanf("%d",&num);fo(i,1,num){scanf("%d %d %d",&b[i].tp,&b[i].x1,&b[i].y1),b[i].x1+=2,b[i].y1+=2;if(b[i].tp==0) scanf("%d %d",&b[i].x2,&b[i].y2),b[i].x2+=2,b[i].y2+=2;lim=max(lim,max(b[i].x1,b[i].y1));lim=max(lim,max(b[i].x2,b[i].y2));}lim++;divide(1,num);fo(i,1,num)if(b[i].tp) printf("%d\n",ans[i]);return 0;
}
【JZOJ 3893】 画矩形相关推荐
- python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框
最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...
- JZOJ 5461 购物 —— 贪心
题目:https://jzoj.net/senior/#main/show/5461 贪心,原来想了个思路,优先选优惠价最小的 K 个,然后其他按原价排序遍历: 如果当前物品没选过,原价选上,如果选过 ...
- python opencv 画矩形框 外接矩形
画矩形 import cv2 image = cv2.imread('1.jpg') cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 0, 2 ...
- OpenGL画矩形函数:glRectf,四个参数分别表示了位于对角线(左下到右上)上的两个点的横纵坐标
OpenGL画矩形函数:glRectf glRectf:画一个矩形,四个参数分别表示了位于对角线(左下到右上)上的两个点的横纵坐标(并且以窗口的中心点为原点,相当于以它为原点建立了一个二维坐标系) 例 ...
- opencv鼠标操作,画矩形
opencv鼠标操作,画矩形 效果图 主要两个函数在作用 //-------------------全局函数声明部分------------------------- //描述:全局函数的声明 //- ...
- 用ANSYS画矩形_用SolidWorks画一个换挡杆防尘罩,此图建了10个基准面,颇为麻烦...
此图是用SolidWorks2015建模,用KeyShot 8渲染.SW文件在2019年11月8日文件夹.这个图新建了10个基准面,画了9个矩形和一个圆,这种画法有点麻烦还有待改进. 建模步骤: 1. ...
- Qt与OpenCV编程:在QLabel加载的图像上画矩形并剪切
前言 1.使用Qt与OpenCV做开发时,时常会用到鼠标与图像交互这块,OpenCV有自己的鼠标事件,但要在Qt搭建的界面上是不能使用OpenCV封装的鼠标事件,Qt有自己的鼠标事件. 2.Qt鼠标事 ...
- JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫
Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...
- opencv画矩形以及在图像上放文字
转自python下的opencv画矩形和文字注释https://blog.csdn.net/alansss/article/details/84978672 1. 画矩形 函数调用:cv2.recta ...
最新文章
- 短序列拼接软件velvet简介
- linux存储--页面置换算法(十一)
- 一篇文章弄懂Java多线程基础和Java内存模型
- 把所有圆圈连接起来的游戏_20个幼儿园体育小游戏教程
- 惠新宸php教程_百度PHP高级顾问惠新宸:PHP在百度的发展历程
- spring-注解实现入门
- 超级硬盘数据恢复软件v2.7.2.6_电脑磁盘上的视频误删如何恢复?误删视频恢复教程...
- 优秀java程序员-利器-eclipse-01 快捷键
- c++通过pybind11制作模型python接口,生成python调用包
- 混日子的老程序员感受结对编程的威力【工作效率狂提高】
- mysql jemalloc_安装 jemalloc for mysql
- 中国平板显示产业运行状况及前景规划建议报告2022-2027年版
- 计算机指法基础知识,电脑打字基础知识及打字指法
- java pdf 套打_itext生成发票套打(操作PDF)
- 4月20日第壹简报,星期四,农历三月初一,谷雨
- 厌学孩子如何进行心理疏导[为本教育]
- 2022-2027年中国共享自行车行业发展监测及投资战略研究报告
- Android Webview完美支持播放各种视频。(解决无法播放优酷视频的问题以及周末无法播放优酷视频的问题)
- 洲思zCloud公有云版发布
- 一周Springboot+Vue入门(1)-- 什么是Springboot