由于上下线段是不可能有交点的

可以先看左右线段树,按照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 线段树求交点个数的更多相关文章

  1. 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

    原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...

  2. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  3. BNU 2418 Ultra-QuickSort (线段树求逆序对)

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...

  4. HDU5634 Rikka with Phi 线段树

    // HDU5634 Rikka with Phi 线段树 // 思路:操作1的时候,判断一下当前区间是不是每个数都相等,在每个数相等的区间上操作.相当于lazy,不必更新到底. #include & ...

  5. hdu 1394 (线段树求逆序数)

    <题目链接> 题意描述: 给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找 ...

  6. <Sicily>Inversion Number(线段树求逆序数)

    一.题目描述 There is a permutation P with n integers from 1 to n. You have to calculate its inversion num ...

  7. HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)

    HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意:  给一个序列由 ...

  8. hdu 1754 I Hate It (线段树求区间最值)

    HDU1754 I Hate It Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u D ...

  9. UVA 11983 Weird Advertisement --线段树求矩形问题

    题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...

随机推荐

  1. 通过inputSplit分片size控制map数目

    前言:在具体执行Hadoop程序的时候,我们要根据不同的情况来设置Map的个数.除了设置固定的每个节点上可运行的最大map个数外,我们还需要控制真正执行Map操作的任务个数. 1.如何控制实际运行的m ...

  2. Leetcode599.Minimum Index Sum of Two Lists

    假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一个,则输出所有答 ...

  3. C++多态小结

    C++ 多态 多态 多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态. C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数. 多态 ...

  4. C++ Socket 获取本机可用端口号(QT)

    :加载套接字库,创建套接字(WSAStartup()/socket()): :绑定套接字到一个IP地址和一个端口上(bind()): :将套接字设置为监听模式等待连接请求(listen()): :请求 ...

  5. 全球城市群Megalopolis

    Megalopolis From Wikipedia, the free encyclopedia   (Redirected from Megalopolis (city type))   &quo ...

  6. 【JZOJ4709】【NOIP2016提高A组模拟8.17】Matrix

    题目描述 输入 输出 样例输入 4 3 5 4 1 7 3 4 7 4 8 样例输出 59716 数据范围 解法 40%暴力即可: 60%依然暴力: 100%依次计算第一行和第一列对答案的贡献即可: ...

  7. python ndarray相关操作:转置、翻转

  8. git安装方法

    点击 http://git-scm.com/download 选择你使用的操作系统,如果是linux就可以看到命令行,windows则是下载客户端

  9. JavaScript--自调用函数(小闭包)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 【Mysql的那些事】Django数据库配置

    1:安装与配置 1:pip install PyMySQL(或者直接使用Pycharm的setting,点击添加PyMySQL) 2:在Django的工程同名子目录的__init__.py文件中添加如 ...