Rikka with Mista 线段树求交点个数
由于上下线段是不可能有交点的
可以先看左右线段树,按照y递增的顺序,对点进行排序。
升序构造,那么对于从某一点往下的射线,对于L,R进行区间覆盖,线段交点个数就是单点的被覆盖的次数。
降序构造,那么对于从某个点从下往上的射线,所有y坐标比期大的点都进行了区间覆盖,那么单点就是答案。
最近脑子不太好。。。思路一定要清晰啊。。。
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<vector>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define LL long long
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int maxx = 2e5+;
struct node{
int l,r,laze;
int w;
}tree[maxx<<];
vector<int>vx;
vector<int>vy;
struct Point{
int x,y;
char op;
}p[maxx];
int getx(int x){
return lower_bound(vx.begin(),vx.end(),x)-vx.begin()+;
}
int gety(int x){
return lower_bound(vy.begin(),vy.end(),x)-vy.begin()+;
}
void push_donw(int rt){
if (tree[rt].laze){
tree[lson].laze+=tree[rt].laze;
tree[rson].laze+=tree[rt].laze;
tree[lson].w+=tree[rt].laze*(tree[lson].r-tree[lson].l+);
tree[rson].w+=tree[rt].laze*(tree[rson].r-tree[rson].l+);
tree[rt].laze=;
}
}
void buildtree(int rt,int l,int r){
tree[rt].l=l;
tree[rt].r=r;
tree[rt].laze=;
tree[rt].w=;
if (l==r){
return ;
}
int mid=(l+r)>>;
buildtree(lson,l,mid);
buildtree(rson,mid+,r);
}
void update(int rt,int ql,int qr,int w){
int l=tree[rt].l;
int r=tree[rt].r;
if (ql<=l && r<=qr){
tree[rt].laze+=w;
tree[rt].w+=w*(r-l+);
return;
}
int mid=(l+r)>>;
push_donw(rt);
if (qr<=mid){
update(lson,ql,qr,w);
}else if(ql>mid){
update(rson,ql,qr,w);
}else {
update(lson,ql,mid,w);
update(rson,mid+,qr,w);
}
tree[rt].w=tree[lson].w+tree[rson].w;
}
int query(int rt,int pos){
int l=tree[rt].l;
int r=tree[rt].r;
if (l==r){
return tree[rt].w;
}
int mid=(l+r)>>;
push_donw(rt);
if (pos<=mid){
return query(lson,pos);
}else {
return query(rson,pos);
}
tree[rt].w=tree[lson].w+tree[rson].w;
}
bool cmp(Point a,Point b){
return a.y<b.y;
}
int main(){
int t;
int n,m,k;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
vx.clear();
vy.clear();
for (int i=;i<=k;i++){
scanf("%d%d %c",&p[i].x,&p[i].y,&p[i].op);
vx.push_back(p[i].x);
vy.push_back(p[i].y);
}
sort(vx.begin(),vx.end());
sort(vy.begin(),vy.end());
vx.erase(unique(vx.begin(),vx.end()),vx.end());
vy.erase(unique(vy.begin(),vy.end()),vy.end());
sort(p+,p++k,cmp);
int sz=vx.size();
buildtree(,,sz);
LL ans=;
for (int i=;i<=k;i++){
if (p[i].op=='D'){
ans+=query(,getx(p[i].x));
}else if (p[i].op=='L'){
update(,,getx(p[i].x),);
}else if (p[i].op=='R'){
update(,getx(p[i].x),sz,);
}
}
buildtree(,,sz);
for (int i=sz;i>=;i--){
if (p[i].op=='U'){
ans+=query(,getx(p[i].x));
}else if (p[i].op=='L'){
update(,,getx(p[i].x),);
}else if (p[i].op=='R'){
update(,getx(p[i].x),sz,);
}
}
printf("%d\n",ans+);
}
return ;
}
Rikka with Mista 线段树求交点个数的更多相关文章
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- BNU 2418 Ultra-QuickSort (线段树求逆序对)
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...
- HDU5634 Rikka with Phi 线段树
// HDU5634 Rikka with Phi 线段树 // 思路:操作1的时候,判断一下当前区间是不是每个数都相等,在每个数相等的区间上操作.相当于lazy,不必更新到底. #include & ...
- hdu 1394 (线段树求逆序数)
<题目链接> 题意描述: 给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找 ...
- <Sicily>Inversion Number(线段树求逆序数)
一.题目描述 There is a permutation P with n integers from 1 to n. You have to calculate its inversion num ...
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由 ...
- hdu 1754 I Hate It (线段树求区间最值)
HDU1754 I Hate It Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u D ...
- UVA 11983 Weird Advertisement --线段树求矩形问题
题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...
随机推荐
- JAVA Sftp 上传下载
SftpUtils package xxx;import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com ...
- loadrunner11录制为空的解决办法(win7+chrome最新版本)
参考:https://www.cnblogs.com/zhang-zhi/archive/2018/09/10/9622605.html loadrunner11在win7中,使用chrome浏览器的 ...
- Spring_Hibernate
Spring与Hiberante整合 通过hibernate的学习,我们知道,hibernate主要在hibernate.cfg.xml配置文件中 接下来我们看一下hibernate的一个配置文件 h ...
- spring拦截器Interceptor
在Spring Boot中,拦截器可以分为两种类型: 一是WebMVC,负责拦截请求,类似于过滤器,对用户的请求在Controller接收前进行处理,在Controller处理完成后加工结果等.使用时 ...
- [运维]ESXI Web Client 标签: vmware运维服务器 2017-05-28 20:59 597人阅读 评论(9)
ESXI安装完成之后,配置好ip,我们就可以使用了?那么如何使用呢?一般来说有两种方式,一种是安装专门的管理客户端,client端,另一种更加方便,就是使用web client端. 下面来介绍一下es ...
- onethink上传到服务器(或者迁移)后台登录验证码错误问题
修改Application\User下面的配置文件config.php, 改成对应服务器上的参数 define('UC_DB_DSN', 'mysqli://root:root@127.0.0.1:3 ...
- PHP7捕获错误异常方法
这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获.如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_h ...
- POJ3697
/* Memory Time 7096K 2641MS */ #include <iostream> #include <string> using namespace std ...
- IDEA 运行maven项目配置
- scroll 滚动到指定位置触发事件 and 点击一按钮/链接让页面定位在指定的位置
scroll 滚动到指定位置触发事件:$(function(){ $(window).scroll(function() { var s =$(window).scrollTop(); if (s&g ...