Rikka With Cake

HDOJ-6681

  1. 最终的答案为射线的交点数加一。当然,我们也可以证明。证明需要用到欧拉公式 V−E+F=2 V-E+F=2V−E+F=2 。设射线的交点共 c cc 个。则在这个图中,V=K+4+K+c=2K+c+4 V=K+4+K+c=2K+c+4V=K+4+K+c=2K+c+4 , E=2∑(ci+1)+K+4=2K+2c+4 E=2\sum (c_i+1)+K+4=2K+2c+4E=2∑(ci+1)+K+4=2K+2c+4 。因此 F=2−V+E=c+2 F=2-V+E=c+2F=2−V+E=c+2 。减去外面的无穷区域,得出答案为 c+1 c+1c+1 。

    原文链接:https://blog.csdn.net/qq_43549984/article/details/99762559
  2. 首先需要先按y的值进行从小到大排序。
  3. 再对y进行离散化,所谓离散化就是将y排序后的点放在一个数组中,用点在数组中的序号代替y,达到缩小范围的作用。
  4. 其次再根据x从小到大排序,因为要根据x开始遍历。首先从左到右遍历方向指向左的点,计算交点。如果是上下方向的则update线段树记录每个点的y覆盖的线段的长度。再从右到左遍历。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,k;
struct Line{
int x;
int y;
char dir;
Line(int x1,int y1,char dir1):x(x1),y(y1),dir(dir1){}
Line(){}
};
Line line[100005];
long long sumy[100005<<2];//记录每一个纵坐标上有多少条上下方向的线经过
long long lazy[100005<<2];//懒标记
bool cmp1(Line a,Line b){
return a.x<b.x;
}
bool cmp2(Line a,Line b){
return a.y<b.y;
}
void build(int cnt,int l,int r){
sumy[cnt]=0;
lazy[cnt]=0;
if(l!=r){
int mid=(l+r)>>1;
build(cnt<<1,l,mid);
build(cnt<<1|1,mid+1,r);
}
}
void update(int x,int y,int cnt,int l,int r){
if(x<=l&&y>=r){
lazy[cnt]++;
sumy[cnt]+=(r-l+1);
return;
}
int mid=(l+r)>>1;
if(x<=mid)
update(x,y,cnt<<1,l,mid);
if(y>mid)
update(x,y,cnt<<1|1,mid+1,r);
}
void push_down(int cnt,int l,int r){
int lc=cnt<<1;
int rc=cnt<<1|1;
int mid=(l+r)>>1;
lazy[lc]+=lazy[cnt];
sumy[lc]+=1LL*(mid-l+1)*lazy[cnt];//long long 和 int相乘 ?
lazy[rc]+=lazy[cnt];
sumy[rc]+=1ll*(r-mid)*lazy[cnt];
lazy[cnt]=0;
}
long long query(int q,int cnt,int l,int r){
if(l==r&&l==q){
return sumy[cnt];
}
push_down(cnt,l,r);
int mid=(l+r)>>1;
if(l<=q&&r>=q){
if(q<=mid){
return query(q,cnt<<1,l,mid);
}else{
return query(q,cnt<<1|1,mid+1,r);
}
}else return 0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--){
cin>>n>>m>>k;
for(int i=0;i<k;i++){
cin>>line[i].x>>line[i].y>>line[i].dir;
//cout<<line[i].x<<line[i].y<<line[i].dir<<endl;
}
sort(line,line+k,cmp2);
for(int i=0;i<k;i++){
line[i].y=i+1;
}
sort(line,line+k,cmp1);
long long ans=0;
build(1,1,k);
for(int i=0;i<k;i++){//-------------------------left to right
if(line[i].dir=='U')
update(line[i].y,k,1,1,k);
else if(line[i].dir=='D')
update(1,line[i].y,1,1,k);
else if(line[i].dir=='L'){
ans+=query(line[i].y,1,1,k);
}
}
build(1,1,k);
for(int i=k-1;i>=0;i--){//-------------------------right to left
if(line[i].dir=='U')
update(line[i].y,k,1,1,k);
else if(line[i].dir=='D')
update(1,line[i].y,1,1,k);
else if(line[i].dir=='R'){
ans+=query(line[i].y,1,1,k);
}
}
cout<<ans+1<<endl;
}
return 0;
}

HDOJ-6681(离散化+线段树)的更多相关文章

  1. 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers

    题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...

  2. 南阳理工 题目9:posters(离散化+线段树)

    posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 The citizens of Bytetown, AB, could not stand that ...

  3. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

  4. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

  5. hpu校赛--雪人的高度(离散化线段树)

    1721: 感恩节KK专场——雪人的高度 时间限制: 1 Sec  内存限制: 128 MB 提交: 81  解决: 35 [提交][状态][讨论版] 题目描述 大雪过后,KK决定在春秋大道的某些区间 ...

  6. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  7. 【bzoj4636】蒟蒻的数列 离散化+线段树

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...

  8. Mayor's posters (离散化线段树+对lazy的理解)

    题目 题意: n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围 li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 思路: 由于 ...

  9. 干物妹小埋 (离散化 + 线段树 + DP)

    链接:https://ac.nowcoder.com/acm/contest/992/B来源:牛客网 题目描述 在之前很火的一个动漫<干物妹小埋>中,大家对小埋打游戏喝可乐的印象十分的深刻 ...

  10. poj/OpenJ_Bailian - 2528 离散化+线段树

    传送门:http://bailian.openjudge.cn/practice/2528?lang=en_US //http://poj.org/problem?id=2528 题意: 给你n长海报 ...

随机推荐

  1. 【noi 2.6_9272】偶数个数字3(DP)

    题意:问所有的N位数中,有多少个有偶数个数字3的数. 解法:f[i][j]表示i位数中含数字3的个数模2为j的个数.于是分第i位填3还是不填3讨论. 小tip:要模12345:for循环新定义了一个变 ...

  2. Codeforces Round #663 (Div. 2) C. Cyclic Permutations (构造,图?)  

    题意:对于某个序列,若\(1\le i\le n\),\(1\le j\le i\)且\(p_j>p_i\),或者\(1\le i\le n\),\(i<j \le n\)且\(p_j&g ...

  3. 牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 B.牛牛摆放花 (贪心)

    题意;将一组数重新排序,使得相邻两个数之间的最大差值最小. 题解:贪心,现将所有数sort一下,然后正向遍历,将数分配到新数组的两端,然后再遍历一次维护一个最大值即可. 代码: class Solut ...

  4. bitbar 网站攻击实验

    实验环境 https://github.com/TouwaErioH/security/tree/master/web1 Windows10 Oracle VM VirtualBox Ubuntu16 ...

  5. nyoj-2357

    2357: 插塔憋憋乐 时间限制: 1 秒  内存限制: 128 MB提交: 107  解决: 28提交 状态 题目描述 众所不知,LLM是一位红警3大佬,打的非常厉害,但是曾经也是一位萌新,喜欢在家 ...

  6. Petrozavodsk Summer Training Camp 2016H(多标记线段树)题解

    题意: \(n\)个草,第\(0\)天种下,高度都为\(0\),每个草每天长高\(a_i\).现给出\(q\)询问,每次给出第\(b_i\)天,然后把高于\(d_i\)的全削成\(d_i\),每次问你 ...

  7. 手工数据结构系列-C语言模拟栈 hdu1022

    这个题我一开始是这么想的.. 爆搜所有可能的出栈序列 然后对输入进行匹配 这样我感觉太慢 然后我们可以想到直接通过入栈序列对出栈序列进行匹配 但是我犯了一个错误..那就是出栈序列一定到入栈序列里找.. ...

  8. for-in循环等

    一.for-in循环 in表示从(字符串.序列等)中一次取值,又称为遍历 其便利对象必须是可迭代对象 语法结构: for 自定义的变量 in 可迭代对象: 循环体 for item in 'Pytho ...

  9. 蓝湖 UI 设计稿上如何生成渐变色和复制渐变色

    蓝湖 UI 设计稿上如何生成渐变色和复制渐变色 Sketch 生成渐变色 不要上传图片,切图 如果是切图,切图模式下就不会生成 css 代码了 复制渐变色 OK .button { width: 28 ...

  10. Sketch & UI & PS

    Sketch & UI & PS app ui https://sketchapp.com/learn https://www.sketch.com/docs/ https://ske ...