- 博客(12)
- 收藏
- 关注
原创 The 2021 ICPC Asia Regionals Online Contest (I)
A 线段树 + 二分 线段树维护结束时间,二分查找合适的结点,找不到则执行下一个询问 #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int N = 100010; PII p[N]; int cnt[N]; struct node{ int l,r; ll min_et; }tr[N*4]; void pushu
2021-09-23 16:46:50
333
2
原创 hdu1754 I Hate It
传送门 思路 裸题 Code #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 200010; int w[N]; int n,m; struct node{ int l,r; int maxm; }tr[N*4]; void pushup(int u){ tr[u].maxm=max(tr[u<<1].maxm,tr[u<<
2021-09-01 15:12:10
144
原创 hdu1166 敌兵布阵
传送门 思路 裸题 Code #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 50010; ll tr[N]; ll ans[N]; int n; int lowbit(int x){ return x & -x; } void add(int x,int v){ for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=
2021-09-01 15:08:32
139
原创 Function
传送门 思路 枚举 g(x) ( g(x) 的范围是[1,54] ),则 g(x)、a、b、c、d 已知,那么我们可以得到一个二次函数 即:A * x^2 + B * x A:a * g(x) + b B:c * g(x) * g(x) + d * g(x) ps:我这里的 a、b、c、d、A、B 指得是我代码中的 a、b、c、d、A、B A > 0 时:开口向上,最小值在 x0 附近,x0:对称点 即 -B / (2 * A) A < 0 时:开口向下,最小值在两端 A = 0 时:变为一条
2021-08-29 22:08:12
156
原创 Command Sequence
传送门 思路 不妨令: num_U:字符‘U’的数目 num_D:字符‘D’的数目 num_L:字符‘L’的数目 num_R:字符‘R’的数目 我们称呼区间内 num_U 等于 num_D 且 num_L 等于 num_R 的连续区间 [l,r] 为 ”好区间“ 给定我们一个只由 ‘U’ ‘D’ ‘L’ ‘R’ 四种字符组成的字符串,问:这样的“好区间”有多少个 ? 对于好区间 [l,r],显然有: sum_U[r] - sum_U[l-1] = sum_D[r] - sum_D[l-1] sum_L[
2021-08-29 21:40:40
312
原创 Power Sum
传送门 思路 任意四个相邻的平方数,比如 a = i^2, b = (i+1)^2 ,c = (i+2)^2, d = (i+3)^2 都满足 a - b - c + d = 4 我们可以根据这个性质来凑 n Code #include <bits/stdc++.h> using namespace std; int n; int main(){ int T; cin>>T; while(T--){ cin>>n; string res,s1=
2021-08-29 21:09:43
369
原创 P4113 [HEOI2012]采花
传送门 思路 类似于 HH的项链 本题题意:问区间[L,R]里,出现次数 >= 2 的元素有几种 不同之处在于本题需要维护两个last last1[i]:i 上一次出现的位置 last2[i]:i 上上次出现的位置 对于一个元素 x ,当它第一次出现时,什么都不发生,同时更新 last1 当它的 last1[x] 存在时,在 last1[x] 位置上 加1,同时更新 last1 和 last2 当它的 last2[x] 存在时,在 last1[x] 位置上 加1, 在 last2[x] 位置上 减1,
2021-08-23 18:35:55
112
原创 P1972 [SDOI2009]HH的项链
传送门 思路 题意概括:问 [L,R] 里,有多少种数字 ? 在以 R 为右端点的区间里,对于某一种数字,我们只关心 它最后一次出现的位置 我们只在其最后一次 出现的位置上 加 1 ( add 操作 ),其余出现的位置都保持为 0 比如数列:1、3、3、1 当 R = 4 时,进行 add 操作后,各位置上的数为 0、0、1、1 此时,无论 左端点 L (L <= R)取值为多少,[L,R] 里的数字种类 都等于 sum(R)- sum(L - 1) 对于 m 个询问,若每次都遍历询问区间 [Li,R
2021-08-22 23:59:01
94
原创 P3586 [POI2015]LOG
P3586 [POI2015]LOG 思路 显然,he >= (c-k)*s 时,输出 TAK,否则 NIE c 和 s 的含义如题目 he 的含义:小于 s 的数 的和 k 的含义:大于等于 s 的数 的数目 问题转化为 快速求 he 和 k:使用树状数组 显然 我们先需要离散化:将 m 个询问里的 a 和 s 进行离散化 然后 维护两个树状数组: 对于 k :我们可以维护一个树状数组 tr add(tr,x,v) 表示:让数字 x ,其数目 + v sum(tr,x) 表示:大小在 [1,x]
2021-08-22 18:00:37
241
原创 POJ 2253
Frogger 从 点 1 到点 2 有多条路径,每条路径有个 最远跳跃距离,问这些最远跳跃距离中 最小的值是多少 ? Code #include <cmath> #include <cstdio> #include <queue> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef pair<int,
2021-07-15 19:24:57
92
原创 POJ 2387
Til the Cows Come Home 思路 dijkstra 模板题 不作解释 . Code #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 1010; bool st[N]; int dist[N]; int g[N][N]; int n,m; int dijkstra(){ memset(dist,0x3f
2021-07-14 17:57:14
93
原创 博弈论
博弈论 大纲—— 巴什博弈、威佐夫博弈、尼姆博弈 一、巴什博弈 (一堆物品 两人取) 只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取m个。最后取光者得胜。 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保
2021-03-19 22:02:51
1402
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅