STL
stack
ABC 243 D
题目链接
https://atcoder.jp/contests/abc243/tasks/abc243_d
语法总结
stack<int> stk; //stack的定义
stk.empty() //判断栈是否为空
stk.top() //返回栈顶元素
stk.pop() //将栈顶元素弹出栈
Ac代码
点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
char s[N], ss[N];
int n, idx;
ll x;
stack<char> stk;
int main()
{
scanf("%d%lld", &n, &x);
scanf("%s", s);
int len = strlen(s);
for(int i = 0; i < len; i ++){
char c = s[i];
if(c == 'L' || c == 'R') stk.push(c);
else{
if(!stk.empty()) stk.pop();
else x /= 2;
}
}
while(!stk.empty()){
ss[idx ++] = stk.top();
stk.pop();
}
for(int i = idx - 1; i >= 0; i --){
if(ss[i] == 'L') x = 2 * x;
else x = 2 * x + 1;
}
printf("%lld\n", x);
return 0;
}
双端队列
ABC 237 D
题目链接
https://atcoder.jp/contests/abc237/tasks/abc237_d
解析
感觉这种题很多倒着考虑的,从相对位置的角度入手,先插入最后一个元素n,再插入前n - 1 ~ 0这n个元素,相对位置与所给指令相反,最后输出答案
语法总结
deque<int> dq; //双端队列的定义
dq.push_back(); //从后面插入
dq.push_front(); //从前面插入
for(auto &i : dq) cout << i << ' '; //遍历
Ac代码
点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
using namespace std;
const int N = 5e5 + 10;
char a[N];
int n;
deque<int> dq;
int main()
{
scanf("%d", &n);
scanf("%s", a);
dq.push_back(n);
for(int i = n - 1; i >= 0; i --){
if(a[i] == 'L') dq.push_back(i);
else dq.push_front(i);
}
for(auto &i : dq) cout << i << ' ';
return 0;
}
cf776(div3)D
题目链接
https://codeforces.com/contest/1650/problem/D
解析
也是倒着模拟一遍,采用deque进行模拟很方便,不用搞数组下标。
语法总结
dq.pop_back(); //弹出dq结尾元素
dq.pop_front(); //弹出dq开头元素
dq.push_back(); //从dq结尾加入元素
dq.push_front(); //从dq开头加入元素
dq.front(); //返回dq首元素
dq.back(); //返回dq结尾元素
//另补充
dq.begin() //返回头迭代器
dq.end() //返回尾迭代器
dq.clear() //清空队列
Ac代码
点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
using namespace std;
const int N = 2e3 + 10;
int t, n;
int ans[N];
int main()
{
scanf("%d", &t);
while(t --){
deque<int> dq;
scanf("%d", &n);
for(int i = 0; i < n; i ++){
int x;
scanf("%d", &x);
dq.push_back(x);
}
for(int i = n; i >= 1; i --){
if(dq.back() == i){
ans[i] = 0;
dq.pop_back();
}
else{
int cnt = 1;
int t = dq.front(); dq.pop_front(); dq.push_back(t);
while(t != i){
t = dq.front();
dq.pop_front();
dq.push_back(t);
cnt ++;
}
ans[i] = cnt;
dq.pop_back();
}
}
for(int i = 1; i <= n; i ++) printf("%d ", ans[i]);
puts("");
}
return 0;
}
堆
AcWing 850. Dijkstra求最短路 II
题目链接
https://www.acwing.com/problem/content/852/
解析
堆优化版的dijkstra
语法总结
#include <queue> //头文件用queue
priority_queue<PII, vector<PII>, greater<PII>> heap; //堆顶是最小值,是小根堆
//如果堆中元素是自定义的结构体,要重载 >
struct Ver{
int id, type, d;
bool operator > (const Ver &W) const{
return d > W.d;
}
};
priority_queue<Ver, vector<Ver>, greater<Ver>> heap;
heap.empty() //返回堆是否为空
heap.size() //返回堆的大小
heap.top() //取出堆顶元素
heap.pop() //弹出堆顶元素
Ac代码
点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
int n, m;
int h[N], e[N], ne[N], w[N], idx;
int dist[N];
bool st[N];
void add(int a, int b, int c){
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
int dijkstra(){
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({0, 1});
while(!heap.empty()){
PII t = heap.top();
heap.pop();
int ver = t.second, distance = t.first;
if(st[ver]) continue;
st[ver] = true;
for(int i = h[ver]; i != -1; i = ne[i]){
int j = e[i];
if(dist[j] > distance + w[i]){
dist[j] = distance + w[i];
heap.push({dist[j], j});
}
}
}
if(dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
}
int main()
{
scanf("%d%d", &n, &m);
memset(h, -1, sizeof h);
while(m --){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
}
printf("%d\n", dijkstra());
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架