2025.4.1
现在我在学校上次去考了那个四川算法设计大赛,特别的简单,除了一道选择题没看到我的答案,其他的都轻松拿下,特别是有一道程序完善题,考的是Dijkstra的模版,我早就背下来了嘿嘿,就看复赛了,我是真的有点害怕OI模式,看不到我的分数我会很急,我的OI模式考的一般都挺差的,怕的就是每道题都有坑。。。每道题不仅考数学思维,还会考语文的阅读理解!!?我是真的会谢!今天班主任发威了,全班的学生都在颤抖,基本上“犯罪的学生”都被抓了。我是真的还流浃背了,主要是老师的气场太强了,我的寝室里有零食,就怕老师下一个点到的人是我。我们学校的主任都太逆天了,今天跑操时,主任跟发疯了一样,让我们停下搜我们身(说是看到了同学带卡片了,其实那个同学也给我看了他的卡片,嘿嘿)。我是真的无语了。。。
2025.4.4
今天是我妹妹的生日,但刚好我又要去考一场试,是去嘉祥锦江去考试了,就看能不能过了,如果能过那可太好了。但是:
- 编程考试,满分400分,我只考了265,预计350。预计预实际之间的差距就是我OI模式的不熟悉导致的。第二题A了,第一题得了95!!第三题只有20分,第四题是50分。总结一下,第一题没达到预期,错误点为输出条件不清楚(就是没读题),第二道题达到了预期,第三道题没达到预期,错误点为按位或和按位与没有理解清楚,知识点不够熟练。第四题达到了预期,它是一道动态规划,但本人动态规划很差,所以只能用贪心骗了qwq。。。
- 主课考试,满分200分,实际分数未知。语文直接摆烂,好家伙都不会(还是会一些些的),数学应该还好,但有三道题没时间做,老师也说了,这就不是给我考满分的,所以我认为只要时间多一些我就能满分。
综上,能过还是很悬的,如果上了,我也是很开心的啊。希望一切顺利吧!
2025.4.5
新的一天到来啦,我认为我的dp还是太差了,所以我需要好好练习呢。下午学习了并查集的新方法,有一些难度,但对我来说还是能接受,其实熟悉了做题套路与方法,还是很so easy的。晚上要考atcoder,不知道atcoder的难度如何,我有空肯定会整理整理的,要不就下周五吧,或者请看VCR。
2025.4.6
我是真的分层图不懂啊,也不能说是不懂,只能说是不会分层。我在网上又找了些分层图讲解,只能说略知皮毛吧,现在我对分层图的主要看法就是:
- 先造点,而点呢,可以通过题目中的具体变量进行组合。
- 然后按照单/双向路来建图,有的时候是u -> v + n(仅有其中一种边),有的时候是u -> v(仅有其中一种边)。具体判断过程就是这道题是否有次数限制(一般是有的),但有些题有些抽象,他用分层图好做,但没有次数限制,比如说这道题,他是普通的最短路多了一个限制,就好像有一种背包题一样,除了体积,还有其他的限制。既然都这样说了,所以也是可以考虑dp的,到一个点后,看是到这个点更优还是不到。第二种做法就是分层图,这道题就可以用第二个条件进行分层(具体来说其实是编点)。
既然说都说了,那么就来讲一下这道题吧。。。(题目地址已提供)
思路:
首先看一手数据范围,非常安全,我们可以考虑分层,来达到第二个限制不用限制的目的,但该怎么建点呢?我们就可以考虑用第二个参数(也就是题目中的hi)来进行分点。最后跑一个最短路即可,没有什么难点,代码如下:
[code]#include using namespace std;#define int long longconst int N = 2e3 * 201 * 2 + 10, INF = 0x3f3f3f3f3f3f3f3f;struct Node{ int x, w;};vector mp[N];struct pq{ int x, dis; bool operator A.dis; }};int n, m, k, st, ed, dis[N];void Dijkstra(int s){ priority_queue q; q.push({s, 0}); memset(dis, 0x3f, sizeof dis); dis = 0; while(!q.empty()){ pq t = q.top(); q.pop(); int x = t.x, d = t.dis; if(d != dis[x]) continue; for(auto nxt : mp[x]){ int y = nxt.x, w = nxt.w; if(dis[x] + w < dis[y]){ dis[y] = dis[x] + w; q.push({y, dis[y]}); } } }}signed main(){ cin >> k >> n >> m; while(m --){ int u, v, w1, w2; cin >> u >> v >> w1 >> w2; for(int i = 0; i < k; i++){ mp[u + i * n].push_back({v + i * n + w2 * n, w1}); mp[v + i * n].push_back({u + i * n + w2 * n, w1}); } } cin >> st >> ed; Dijkstra(st); int ans = INF; for(int i = 0; i < k; i++) ans = min(ans, dis[ed + i * n]); cout = INF ? -1 : ans) y.r;}void solve(){ int n, m, L, V; scanf("%d %d %d %d", &n, &m, &L, &V); cnt = 0; memset(vis, 0, sizeof vis); for(int i = 1; i 1; double v1 = sqrt(v * v * 1.0 + 2.0 * a * (p[mid] - d)); if(v1 > V) res = mid, l = mid + 1; else r = mid - 1; } if(res < id) continue; q[++ idx].l = id, q[idx].r = res; } } sort(q + 1, q + idx + 1, cmp); int ed = 2e9; for(int i = idx; i >= 1; i--){ if(ed |