辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)
【题目描述】
辣鸡ljhNOI之后就退役了,然后就滚去学文化课了。
然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑。
题目描述是这样的:在一个二维平面上有一层水分子,请问形成了多少个氢键?
这个二维平面可以看做一个类似棋盘的东西,每个格子可以容纳一个水分子,左下角的格子为(0,0),这个格子右边的格子为(1,0),上方格子为(0,1),以此类推。
辣鸡ljh当然不会做了,所以他来求助JeremyGou,JeremyGou一眼就看穿了真相,并想用这道题来考一考正在做NOIP模拟赛的你。
注:在本题中,我们认为一个水分子能与和它曼哈顿距离为2且直线距离小于2的其他格子形成氢键。
【输入格式】
一个整数n接下来n行,每行给出四个整数x1,y1,x2,y2表示以(x1,y1)为左下角,(x2,y2)为右上角的矩形中每个格子都有一个水分子。给出的所有矩形没有交集。
【输出格式】
一个整数,表示氢键的数量。
【样例1输入】
3
0 0 0 0
0 1 1 2
2 2 2 3
【样例1输出】
5
【样例1解释】左图为水分子的排布,右图中的绿色线条表示氢键。
【样例2输入】
10
1 8 8 9
0 3 10 7
0 0 7 0
0 2 9 2
4 10 8 10
10 0 10 2
0 10 0 10
8 0 9 1
0 8 0 9
9 8 10 8
【样例2输出】
157
【子任务】
解题思路
本题主要是注意细节问题。我们分成两块来求,第一块是矩形内的氢键数量,第二块是矩形与矩形之间的氢键数量
一、矩形内的氢键数量
对于一个矩形【X1,Y1,X2,Y2】,我们可以通过计算得到其中的氢键数量为 (X2-X1)*(Y2-Y1)*2 (读者可以把【左上-右下】与【右上-左下】两个方向分开计算,各自都是(X2-X1)*(Y2-Y1)个氢键)
证明?请画图感性证明。
二、矩形间的氢键数量
我们先把所有矩形按照x1为关键字排序,然后O(n2)地询问,注意剪枝即可。实际复杂度约为O(NlogN)。
排序是为了方便剪枝。
剪枝:
设当前正在把 i 与 v 两个矩形进行比较,第一个for循环是i,第二个for循环是v,那么就有:
if(matrix[v].x1>matrix[i].x2+1) break;
if(matrix[v].y1>matrix[i].y2+1||matrix[v].y2<matrix[i].y1-1) continue;
如果以上两步都没有跳转,那么说明v与i一定会形成至少一个氢键。
下面就开始复杂的计算啦:
我们首先把两个矩形i、v按照 matrix[v].x1<=matrix[i].x2 的真假分为两类:
1)若此式为真,那么两个矩形一定是上下排列且连有氢键的。
2)若此式为假,那么两个矩形一定是左右排列且连有氢键的。
(因为题目描述明确说明所给矩形不会产生覆盖的情况)
这里挑一种来讨论,对于另一种我们把推导出的代码中x和y互换即可(想一想,为什么可以这样?)。
呈上对于左右排列讨论y的代码,其中对于每一种情况,读者可以自行画图体会,若读者不会位运算,可以把 <<1 等价转化为 *2 阅读。
if(matrix[v].y1>matrix[i].y2||matrix[v].y2<matrix[i].y1) ++ans; else if(matrix[v].y1==matrix[i].y1) {if(matrix[v].y2==matrix[i].y2) ans+=(matrix[v].y2-matrix[v].y1)<<1;else if(matrix[v].y2<matrix[i].y2) ans+=((matrix[v].y2-matrix[v].y1)<<1)+1;else ans+=((matrix[i].y2-matrix[i].y1)<<1)+1; } else if(matrix[v].y2==matrix[i].y2) {if(matrix[v].y1>matrix[i].y1) ans+=((matrix[v].y2-matrix[v].y1)<<1)+1;else ans+=((matrix[i].y2-matrix[i].y1)<<1)+1; } else if(matrix[v].y1>matrix[i].y1&&matrix[v].y2<matrix[i].y2) ans+=(matrix[v].y2-matrix[v].y1+1)<<1; else if(matrix[v].y1>matrix[i].y1&&matrix[v].y2>matrix[i].y2) ans+=(matrix[i].y2-matrix[v].y1+1)<<1; else if(matrix[v].y1<matrix[i].y1&&matrix[v].y2>matrix[i].y2) ans+=(matrix[i].y2-matrix[i].y1+1)<<1; else /*if(matrix[v].y1<matrix[i].y1&&matrix[v].y2<matrix[i].y2)*/ ans+=(matrix[v].y2-matrix[i].y1+1)<<1; //最后一定只剩下这种情况,为了加速程序运行,可以不再判断
对于判断x的情况,我们把上述代码中的所有“y”字符替换为“x”字符即可。
需要注意的是,由于我们已经按照x1的大小从小到大进行了排序,所以可以不再判断 matrix[v].x1<matrix[i].x1 这一种情况及其子情况。
(记得加上前文说过的两个if剪枝优化,不然你这个是妥妥的O(n2),绝对过不了!)
附上AC代码
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 template<class T>inline void read(T &_a) 5 { 6 char _ch=getchar();_a=0; 7 while(_ch<'0'||_ch>'9') _ch=getchar(); 8 while(_ch>='0'&&_ch<='9'){_a=(_a<<3)+(_a<<1)+_ch-'0';_ch=getchar();} 9 } 10 11 int n; 12 long long ans; 13 struct fff{ 14 long long x1,y1,x2,y2; 15 inline bool operator < (const fff x) const {return x1==x.x1?y1<x.y1:x1<x.x1;} 16 }node[100001]; 17 18 int main() 19 { 20 freopen("ljh.in","r",stdin); 21 freopen("ljh.out","w",stdout); 22 read(n); 23 for(register int i=1;i<=n;++i) 24 { 25 read(node[i].x1),read(node[i].y1),read(node[i].x2),read(node[i].y2); 26 ans+=(node[i].x2-node[i].x1)*(node[i].y2-node[i].y1)<<1; 27 } 28 sort(node+1,node+n+1); 29 for (register int i=1;i<n;++i) 30 { 31 for (register int v=i+1;v<=n;++v) 32 { 33 if(node[v].x1>node[i].x2+1) break; 34 if(node[v].y1>node[i].y2+1||node[v].y2<node[i].y1-1) continue; 35 if(node[v].x1<=node[i].x2) 36 { 37 if(node[v].x1==node[i].x1) 38 { 39 if(node[v].x2==node[i].x2) ans+=(node[v].x2-node[v].x1)<<1; 40 else if(node[v].x2<node[i].x2) ans+=((node[v].x2-node[v].x1)<<1)+1; 41 else ans+=((node[i].x2-node[i].x1)<<1)+1; 42 } 43 else if(node[v].x2==node[i].x2) 44 { 45 if(node[v].x1>node[i].x1) ans+=((node[v].x2-node[v].x1)<<1)+1; 46 else ans+=((node[i].x2-node[i].x1)<<1)+1; 47 } 48 else if(node[v].x2<node[i].x2) ans+=(node[v].x2-node[v].x1+1)<<1; 49 else /*if(node[v].x1>node[i].x1&&node[v].x2>node[i].x2)*/ ans+=((node[i].x2-node[v].x1+1)<<1); 50 } else { 51 if(node[v].y1>node[i].y2||node[v].y2<node[i].y1) ++ans; 52 else if(node[v].y1==node[i].y1) 53 { 54 if(node[v].y2==node[i].y2) ans+=(node[v].y2-node[v].y1)<<1; 55 else if(node[v].y2<node[i].y2) ans+=((node[v].y2-node[v].y1)<<1)+1; 56 else ans+=((node[i].y2-node[i].y1)<<1)+1; 57 } 58 else if(node[v].y2==node[i].y2) 59 { 60 if(node[v].y1>node[i].y1) ans+=((node[v].y2-node[v].y1)<<1)+1; 61 else ans+=((node[i].y2-node[i].y1)<<1)+1; 62 } 63 else if(node[v].y1>node[i].y1&&node[v].y2<node[i].y2) ans+=(node[v].y2-node[v].y1+1)<<1; 64 else if(node[v].y1>node[i].y1&&node[v].y2>node[i].y2) ans+=(node[i].y2-node[v].y1+1)<<1; 65 else if(node[v].y1<node[i].y1&&node[v].y2>node[i].y2) ans+=(node[i].y2-node[i].y1+1)<<1; 66 else /*if(node[v].y1<node[i].y1&&node[v].y2<node[i].y2)*/ ans+=(node[v].y2-node[i].y1+1)<<1; 67 } 68 } 69 } 70 printf("%lld",ans); 71 return 0; 72 }
View Code
转载于:https://www.cnblogs.com/jaywang/p/7723963.html
辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)相关推荐
- [CSP-S模拟测试]:辣鸡(ljh) (暴力)
题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的$ljh$却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的: 在一个二维平面上 ...
- [NOIP模拟测试10]辣鸡(ljh) 题解
首先计算块内贡献,很显然是$(x_2-x_1)*(y_2-y_1)*2$. 然后考虑矩形之间的贡献,sort一遍分类讨论$n^2$暴力即可. 注意考虑边界情况是否能多两个,以及角对角的情况. 另外,排 ...
- HZOJ 辣鸡(ljh)
题解?noipT1还需要题解?正解就是$n^2$大暴力. 考试的时候打了$n^2$的暴力,也想到了正解的优化,然而觉得它太麻烦了,而且$n^2$怎么优化也过不了50000啊,而且即使不优化前面30分我 ...
- 模拟赛-20190114-新魔法(distance)
前言 第一篇模拟赛题思路总结 题目相关 题目链接 题目大意 给定一个长度为nnn序列,每一个位置iii都有一种颜色aia_iai 现在有mmm次操作,操作分两种: 第一种操作,将所有颜色xxx都替换 ...
- ssl模拟赛(2019.3.2 )
前言: 某教练让初一蒟蒻(我)和初一巨佬(别人)做模拟赛 模拟赛题目: 题目 做法 CY跳荷叶 模拟 排排坐 DFS 分离与合体 石子合并 腾讯大战360 spfa(最短路) 比赛和想法: 这次比赛时 ...
- NOIP模拟测试10「大佬·辣鸡·模板」
大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 【noip模拟赛4】Matrix67的派对 暴力dfs
[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
最新文章
- JoVE微生物组专刊征稿,写方法拍视频教程发SCI(宏基因组公众号专属福利)
- Java利用POI生成Excel强制换行
- an unsupported operation was attempted问题解决
- 一周一论文(翻译 总结)—— [SOSP 18] LITE Kernel RDMA Support for Datacenter Applications : 一个LITE 内核支持的RDMA通信库
- linux与mysql_Linux与MySQL
- 系统命名与 SQL 命名之争 - 第 1 部分
- 微软4年后重登市值第一,纳德拉如何做到的?
- jq 通过标签名称获取标签_如何快速通过今日头条原创标签的审核?
- mac android屏幕演示,如何在Mac上录制Android设备的屏幕 | MOS86
- 00 后的 AI 开发者进阶之道:从入门到鏖战 MIT 编程大赛 | 人物志
- 手把手教你学习ROR-5.Validation
- servlet实现登陆注册
- 【转】Horspool字符串匹配算法
- 【Linux】03 文件权限
- 听音室-HIFI入门之10张公认的经典发烧碟
- win10红警2黑屏_Windows10黑屏常见情况及解决办法
- php草莓派,甜品控的减脂早餐,这样做低卡又裹腹,草莓派香蕉派,好吃分享了...
- transition天坑
- html5中分镜图文脚本,企业宣传片脚本如何撰写分镜头?
- 1 、(5分)短信中提取号码