begin()和end()产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器
st.begin() 返回一个迭代器,它指向容器第一个元素
st.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置
st.rbegin() 返回一个逆序迭代器,它指向容器最后一个元素
st.rend() 返回一个逆序迭代器,它指向容器第一个元素前面的位置
返回set 容器中最后一个元素: st.rbegin()
begin()和end()产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器
st.begin() 返回一个迭代器,它指向容器第一个元素
st.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置
st.rbegin() 返回一个逆序迭代器,它指向容器最后一个元素
st.rend() 返回一个逆序迭代器,它指向容器第一个元素前面的位置
返回set 容器中最后一个元素: st.rbegin()
1 | ListNode* reverseList(ListNode* L){ |
1 | LinkList L = (LNode *)malloc(sizeof (LNode)); |
1 | void creat(LinkList L,int n){ |
1 | int get_k_LinkList(LinkList L, int k){ |
题目链接
签到,保持$a_1$到$a_n$比例不变,给出K输出满足$K==\frac{1}{n}\sum a_i^2$的$a_i$
1 | int n=read(),k=read(); |
题目链接
n次definition
1 | 1 <unit> = <value> <unit> |
q次query
1 | <value> <unit> to <unit> |
保证每次询问前都曾有定义过
1 | int cnt; |
并查集维护是否可以兑换,输出”impossible”的情况
1 | int find(int x){ |
1 | string t; |
求三维平面内 距离最小的两点
使用分治的思想 按照x轴大小排序后 分为左,中,右三部分
最短距离有三种可能
1.左部分之间的两点
2.右部分之间的两点
3.跨越中间的两点
求出1,2两部分的最小值$d=min(d1,d2)$后,借助贪心的思想,将与中间点距离小于d的点放入容器内,借助$O(M^2)\quad M<<N$遍历
1 | const int N = 1e5+5; |
SDKD2023 Summer TeamContest A——NCC_17011
题目链接
无向图从1到n存在m条light trains
m>=n-1 所以点1和n一定是联通的
存在k个wormhole 可以随机传送到另外k-1个位置 且at most once
求最少经过多少条light trains 可以到达点n
思路
• Compute dist(s, w) and dist(w, t) for each wormhole w and sum S using two BFS from s and t.
• Determine the wormhole you should enter to minimize the expected distance.
• If you enter wormhole w , the expected distance from s to t is
$$dist_w=dist(s,w)+\frac{1}{k-1}\sum dist(w_1,t)(w_1≠w)=dist(s,w)+\frac{1}{k-1}(S-dist(w_1,t))\with\quad S=\sum dist(w_1,t)$$
1 | //bfs两次 求任一点到1和n的距离dist1数组和dist2数组 |
题目链接
读了一遍题 dp? 数学正态分布!
两个6面骰子的结果和出现次数
2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 5 4 3 2 1
一个4面骰子和一个6面骰子的结果和出现次数
2 3 4 5 6 7 8 9 10
1 2 3 4 5 4 3 2 1
观察可发现数字出现的次数成正态分布
需要注意分奇偶使用两个指针l r向前后移动输出即可
1 | int a[25]; |
题目链接
签到 ss转化为G输出
1 | signed main(){ |
题目链接
set存储目前所以的空位 且最多最多移动到ma+q的位置上(最右端的青蛙连续跳q次)
借助upper_bound函数查找第一个大于x的数
1 | int a[200005]; |
题目链接
每个数字都可以由0-9的卡牌组成
求从0-N需要多少张不同的卡牌
特判前两位大小情况 0一定是长度-1张
1 | int cnt[15]; |
题目链接
首先给出balanced的定义->可以通过不断插入括号的操作获得的序列
特点是序列内的括号是一一对应存在的
将括号序列的前后连起来 求是否存在切割点满足切割后仍是balanced序列但不于前序列相同
思路: 先将序列分解成对应的子序列 再将序列复制前后联通 剪枝N^2暴力
1 | string t[1000010]; |
题目链接
给出数d(1<=d<=100)构造出a b c三个数(1<=a,b,c<=100)两两不同
且满足a,b,c通过加减乘除运算 且a,b,c至多用一次后一定不等于d
1 | signed main(){ |
1.首次参加SDKD夏季集训 体验到前3h小时读题 后2h写题的训练方式 遗憾的是没有到现场参加
2.有不少题赛后发现仔细理解题目后 还是可以完成的,看到没有人去开新题 就不敢自己去试试。
3.代码模板熟练情况,构造题的思维,还有边界条件的处理,复杂度的剪枝优化等,需要强化。
题目链接
双指针求小区间的长度之和[L,R]满足R大于等于区间内最大值
1 | int a[1000005]; |
题目链接
N个牛 第i头牛跳舞花费a_i 最大时间为T 求不超过时间T的前提下
最少多少个舞台够使用
二分check 答案区间[1,n]
1 | bool check(int mid){ |
题目链接
读入字符串后 分解成n个分数
f[i]的1和-1表示符号 a[i]表示分子 b[i]表示分母
通分为Π[i] 分子带入计算
分子和分母同时除以__gcd(a,b)
b为1的时候 不输出分号和b
题目链接
求包含K种数字的最短连续子序列长度
双指针 维护连续子序列[L,R]
1 | struct node{ |
题目链接
1.dp[i]由上一层加上a[i]*N^2递推
2.dp[i]由前面第j层加上(a[j]+a[j+1]+…+a[i])x(a[j]+a[i])递推 需要满足a[i]+a[j]<=t这一条件
1 | int n,t; |
题目链接
包含标点符号、空格的字符串,再只考虑字母的条件下求最长回文串
转化为只含有小写字母的字符串,利用map映射俩字符串的坐标,再进行操作
1 | //坐标映射 只需要处理数组d |
1 | int e[N],ne[N],h[N],w[N],idx; |
1 | vector<int>g[N]; |
题目链接
无向图边长度为1 Q次询问求两点u,v之间最短距离经过的点集
N<=40 floyed处理多源最短路
1 | for(int i=1;i<=n;i++){ |
题目链接
m条路线(无向边) 从u到v花费时间p
w个虫洞(有向边) 从u到v可以回到时间p之前
判断是否可以回到出发点同时也是出发时刻以前的某一时刻
spfa判断是否存在负环
1 | int idx,e[2505],ne[2505],h[2505],w[2505]; |
题目链接
从第0天开始 每一天你可以做以前推荐过的或者当天推荐的题
但有r个规则 在做第i道前要完成s道题目
求出做出第K道题需要的天数 如果不可以输出-1
从所有入度为0的点出发 跑一遍最短路dist[k]==0x3f3f3f3f时不能实现
注意N<=500但是有T组数据 T<=5 不可以Floyed求
1 | vector<int>a[505];//存图 |
题目链接
给N个数 以任意两个数的异或为边长建图 求其最大生成树
1 | int f[2005]; |
题目链接
给出N个点坐标和M对点之间有通路 且以两点之间的距离作为边权 求第S个点到第T个点的最短距离
N<=100 floyed
1 | int x[105],y[105]; |
题目链接
N个城市由N-1条线路相连 其中K个是红点(不能在同一个连通块内)
给出N-1条可删去的线路和代价 求最小代价
最小代价==所有代价之和-尽可能多连接的线路之和
连通块维护 查询 vis[]数组标记是否产生冲突
1 | int find(int x){ |