Dij

个人训练记录(UPD 9.16)

我怕爱的太早我们不能终老 提交于 2021-02-07 21:37:57
本文章记录一些较难的题,摘自自己的blog中的其他文章。也有些单独成章有点浪费的题也写在里面了。 2019.7.15-2019.7.21 1182F(2900) 题意:求在区间 $[a,b]$ 中找一个最小的 x 使得 $\text{abs}(\text{sin}(\frac{p}{q} \pi x))$ 最大。 $0 \le a \le b \le 10^{9}, 1 \le p,q \le 10^9$ key:姿势 实际上是求一个最小的 x 使得 $f(x)=2px \bmod 2q$ 最靠近 q。 性质:$f(x)+f(y)\equiv f(x+y) \bmod 2q$ 。所以对于区间内每个数 x ,都可以把它拆分为 $x=a+i*t+j$ 。其中 $t=\sqrt{b-a+1}, j=(x-a) \bmod t, i \in [0,t]$ 所以只需要把所有 $f(a+j)$ 记下来排个序,之后枚举 i 二分查找即可。剩余的区间( $i=t$ 时 j 可能取不到所有$[0,t)$ )需要暴力。 有两个坑点:1. 有序表中同样 f 的取小的。 2. 因为模运算的序列是环形的,所以如果二分查找的结果是首/尾,需要特判。 1194E(2200) 题意:有 n 个线段,每个都是平行 x 或者 y 轴,只有互相垂直的两线段才会相交。问形成了多少个矩形。 $n \le 5000,

Java后端技术学习体系——韩顺平

筅森魡賤 提交于 2021-02-02 11:57:43
文章目录 第一部分:Java基础 变量、控制结构、OOP(封装,继承,多态)、数组、Java API、异常和处理、集合、泛型、IO、反射、网络通信 第二部分:Java高级 1. Java多线程/高并发 1.1 并发基础 互斥同步、非阻塞同步、指令重排、synchronized、 volatile 1.2 线程 1.3 锁 自动锁、偏向锁、可重入锁 1.4 线程池 1.5 并发容器 1.6 JUC executor、collections、locks、alomic(原子类)、tools 2. 数据结构和算法 2.1 数据结构 数组(数组问题)、队列、栈、链表、树、散列、堆、图 2.2 算法 排序(8种)、查找、分治、动态规划(背包问题)、回溯(骑士周游问题)、贪心算法、KMP、Prim、kuskal、flovd-最短路径、(Dij...)最短路径 3. 设计模式(23种) 单例模式、观察者模式、工厂模式、适配器模式、装饰者模式、代理模式、模版模式、职责链模式、其他(组合模式、桥接模式...) 4. JVM JVM体系、类加载机制、双亲委派机制/沙箱安全机制、JMM(Java内存模型)、字节码执行过程、GC(垃圾回收算法)、JVM性能监控和故障定位、JVM调优 第三部分:Java web 1. 前端基础 html、css、JavaScript、ajax、jquery 2. 前端框架

【数据结构与算法拓展】最短路径的方案数统计问题(基于floyd算法)

余生颓废 提交于 2020-12-17 13:46:34
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷。 也因如此,它作为博主大二上学期最重要的必修课出现了。由于大家对于上学期C++系列博文的支持,我打算将这门课的笔记也写作系列博文,既用于整理、消化,也用于同各位交流、展示数据结构的美。 此系列文章,将会分成两条主线,一条“数据结构基础”,一条“数据结构拓展”。“数据结构基础”主要以记录课上内容为主,“拓展”则是以课上内容为基础的更加高深的数据结构或相关应用知识。 欢迎关注博主,一起交流、学习、进步,往期的文章将会放在文末。 随着学习的深入,相信各位读者的野心已经仅满足于计算出任意两点间的最短路径。那么更进一步的,在这一节我们要讨论关于最短路径的计数问题。在计算出任意两点间的最短路径长度的基础上,我们还需要统计出这些最短路径的方案数。 这个问题,乍一看感觉有些不同寻常,因为不管怎么说,方案数相较于长度来说总还是不好把握的。我们在思考统计方案数的算法的时候总是容易囿于对起点到终点路径规划决策的模拟。 朴素的解决思路多是先在纸上推演从一起点到终点的路径,一条一条的画出最短路径。小规模的时候,找出答案不是难事,但是一旦数据量较大,笔算就会漏洞百出,更何况一旦准备将其付诸于程序,就像是秀才遇到兵,发现根本无从下手。。。。

第九届全国大学生GIS应用技能大赛下午试题(参考答案)

微笑、不失礼 提交于 2020-12-16 03:26:22
第九届全国大学生GIS应用技能大赛下午试题参考 一、案例背景 我们现在是江苏省城市研究科研项目组的一员,我们分配到了以下任务: 任务一 :创建三甲医院20 分钟、45 分钟服务区,并计算每一个地级市/县级市拥有的 三甲医院20 分钟、45 分钟服务区占全市面积百分比。 任务二 :制作各地级市/县级市城市联系强度图。 下图是互联网上搜索的城市联系强度图: 任务三 :制作江苏省地级市/县级市城市中心度专题地图。 二、数据说明(见“下午A”文件夹中的“数据”文件夹) 主要道路.shp:江苏省主要道路数据来源于OpenStreet 网站。 江苏省省界.shp:江苏省行政区面数据。 江苏市届.shp:江苏省地级市面数据。 江苏县界.shp:江苏省区县面数据。 市级点.shp:江苏省地级市点数据。 县级点.shp:江苏省区县点数据。 三甲医院.shp:江苏省三甲医院点数据。 区县数据.xls:江苏省各区县GDP 数据。 三、分析要求(100 分) 1. 处理研究区数据。(10 分) 我们的研究区是地级市市区和县级市,请按照下面的要求创建县市级点数据和县市级面 数据。 注意 :结果数据是本项目的研究区数据,之后所有的步骤都使用本步骤结果数据,请按 照要求处理数据并保证属性信息的正确。 (1)创建县市级点数据。 县级点数据中Name 字段属性值为“XX 区”并且属于同一个地级市的点,请使用市级

中国石油大学天梯赛真题模拟第一场

那年仲夏 提交于 2020-11-23 07:39:46
7-10 排座位 (25 分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。 输入格式: 输入第一行给出3个正整数: N ( ≤100),即前来参宴的宾客总人数,则这些人从1到 N 编号; M 为已知两两宾客之间的关系数; K 为查询的条数。随后 M 行,每行给出一对宾客之间的关系,格式为: 宾客1 宾客2 关系 ,其中 关系 为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后 K 行,每行给出一对需要查询的宾客编号。 这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。 输出格式: 对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出 No problem ;如果他们之间并不是朋友,但也不敌对,则输出 OK ;如果他们之间有敌对,然而也有共同的朋友,则输出 OK but... ;如果他们之间只有敌对关系,则输出 No way 。 输入样例: 7 8 4 5 6 1 2 7 -1 1 3 1 3 4 1 6 7 -1 1 2 1 1 4 1 2 3 -1 3 4 5 7 2 3 7 2 输出样例: No problem OK OK

HDU6805 Deliver the Cake(拆点+最短路)

为君一笑 提交于 2020-10-04 00:41:27
题意 给出一个nm的无向图,有边权。 张三在起点s,目标是t。 点分成左点右点和中间点,到左点的时候必须用左手,到右点的时候必须用右手,中间点没有特殊要求。 张三每次切换左右手都要花费额外的时间,询问起点到终点的最短路。 题解 把每个点拆成两个点,左点拆成两个左点,右点拆成两个右点,中间点拆成一左一右两个点,然后跑dijsktra。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=4e5+ 10 ; const ll inf= 1e18; int n,m,s,t,cost; string ss; struct node { int u; int v; int w; int next; }edge[maxn * 8 ]; int head[maxn* 3 ]; int tol= 0 ; void addedge ( int u, int v, int w) { edge[tol].u = u; edge[tol].v = v; edge[tol].w = w; edge[tol].next = head[u]; head[u] =tol++ ; edge[tol].u = v; edge[tol].v = u; edge[tol].w = w; edge[tol]

Diary (2020暑期集训日记&总结)

家住魔仙堡 提交于 2020-08-16 14:15:57
2020.08 2020.8.15 Splay 第一次在blog里粘代码 每天一棵 \(Splay\) 好一个调解心情 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define debug puts("hs") using namespace std; inline int read(){ int x = 0, w = 1; char ch; for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1; for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; return x * w; } const int ss = 100010; const int inf = 0x7fffffff; struct node{ int son[2]; int size, num, val, fa; }tr[ss << 1]; int root, cnt; inline void update(int x){ tr[x].size = tr[tr[x].son[0]].size + tr[tr[x].son[1]].size + tr

Diary (2020暑期集训日记&总结)

家住魔仙堡 提交于 2020-08-16 10:53:49
2020.08 2020.8.15 Splay 第一次在blog里粘代码 每天一棵 \(Splay\) 好一个调解心情 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define debug puts("hs") using namespace std; inline int read(){ int x = 0, w = 1; char ch; for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1; for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; return x * w; } const int ss = 100010; const int inf = 0x7fffffff; struct node{ int son[2]; int size, num, val, fa; }tr[ss << 1]; int root, cnt; inline void update(int x){ tr[x].size = tr[tr[x].son[0]].size + tr[tr[x].son[1]].size + tr

Diary (2020暑期集训日记&总结)

半腔热情 提交于 2020-08-14 22:50:29
2020.08 2020.8.8 日常早晨更总结 学长出题是真心不错 尤其是数据 最起码没有什么奇奇怪怪的算法卡到了高分 感觉下午讲课有点小困 但是晚上听课就兴奋的一批 思维在状态效率也高(才不是夜猫子本质) 可能是因为刚锻炼完比较兴奋? 不过总体效果还挺好的 一诺学姐很认真也很有耐心 (省略夸奖词一千字) 筒子们讨论也挺积极 最后立哥又补充了一个相当优秀的做法 收获颇丰 给学长学姐点赞 考试T4是个2——SAT 没练习就考了 考场就这呗 我的内心 2020.8.7 啊这,跳闸了 总结和代码全没了 爷吐了 早晨来了之后 显示屏烧了 结果换了一块还这样? 换了线还这样? 那就是——主机烧了…… 跑到后面发现小坤的主机也烧了 系统启动不了了 这断电断的 真要命 查了几个主机 要么启动不了 要么就只有win7 辗转近十几台电脑终于搬出来俩能用的 总之换上了 真就信奥=会修电脑 行了以后妹子可以找我们修电脑了 没鞋穿了啊 白鞋有两双洗了 还一双太白不舍得穿 (其实都不舍得) 一双新的也不舍得穿 正好还要下雨 穿个沙滩鞋就算了 反正也没啥人 晚上学长讲课2——SAT还有二分图 感觉不是很难吧 但是还没咋做题 老姚昨天找谈话了 说不静 确实不静 细节处理不好 需要磨 自己扣吧还是 少看题解 把之前做的勉强的题重新做做 比做新题强 前期应该会很痛苦的吧 还是坚持一段时间试试先 肯定会有收获的

KD树的空间复杂度是O(n)O(n)的

社会主义新天地 提交于 2020-08-14 13:14:00
「NOI2019」弹跳 题解(KD树) 题意:w×h网格中有n个点,m条边。每条边可以从p点花费t时间到一个矩形中的任意点,求1号点到每个点的最少时间。 1 <= w , h <= n <= 70000 , 1 <= m <= 150000 1<=w,h<=n<=70000,1<=m<=150000 时间2s, 空间128M 。 本题如果放在序列上,使用线段树建图,可以做到 O ( m l o g n ) O(mlogn)的复杂度,通过数据分治可以获得72分。 对于二维问题可以想到将线段树变为二维线段树,然而会被卡空间。 考虑此题暴力Dij的本质:就是每次找最小的点,然后把一个矩形中大于z的数都改为z,再删除这个点。 看到矩形修改,可以想到KD树。 KD树的空间复杂度是 O ( n ) O(n)的,很优秀。 在矩形修改时,采用类似线段树的方法:如果当前矩形与修改的矩形没有交,就直接返回。如果被包含,则直接打标记。 但与线段树不同的:还需要考虑当前的点是否在矩形内,如果在则直接修改这个点。 这就是KD树处理矩形的方法。 时间复杂度: O ( m n−−√ ) O(mn)。 删除一个点可以打一个特殊标记实现。 把这个写上后,会发现超时。 考虑剪枝:如果z大于当前点的标记,就直接返回。 这样就能过了。 代码: # include <stdio.h> # include <stdlib.h