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;
}
posted @   小菜珠的成长之路  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示