洛谷B3666题解

这不是一道单调栈+异或的题吗???

  • 什么是单调栈和异或?
  1. 单调栈:单调栈是一种数据结构,它里边存放的数据具有单调性,每个元素都只进栈一次,进栈时会把破坏栈的单调性的元素弹出。
    实现方法:
stack <int> s;//单调栈,单调递增
int index;//要进栈的元素
while(!s.empty()&&s.top<index)s.pop();
s.push(index);
  1. 异或:异或是离散数学中逻辑运算的一种二元计算,符号为 ⊕ \oplus ,当符号两边分别为 t r u e ( 1 ) true(1) true(1) f a l s e ( 0 ) false(0) false(0) 时,结果才是 t r u e ( 1 ) true(1) true(1),否则为 f a l s e ( 0 ) false(0) false(0)。即:
    V 1 ⊕ V 2 = { 0 if  V 1 = V 2 1 if  V 1 ≠ V 2 V_1\oplus V_2=\begin{cases} 0&\text{if } V_1=V_2 \\ 1&\text{if } V_1\ne V_2 \end{cases} V1V2={01if V1=V2if V1=V2
    按位异或即把 V 1 V1 V1 转化为二进制后,每一位都再异或 V 2 V2 V2。 在本题我们需要用到异或的一个重要性质:当一个数 V V V 异或它自己时,结果为 0 0 0。也就是 V ⊕ V = 0 V \oplus V =0 VV=0
  • 一些细节
  1. 惨痛的教训——没开 unsigned long long
  2. 卡常的数据——要用 scanfprintf

最后就是代码啦!

#include<bits/stdc++.h>
using namespace std;
unsigned long long n, ans;
struct node {
	unsigned long long x, num;
};
stack<node>st;
signed main() {
	scanf("%llu", &n);
	for (int i = 1; i <= n; i++) {
		unsigned long long a;
		scanf("%llu", &a);
		while (!st.empty() && st.top().x < a) {
			ans ^= st.top().num;
			st.pop();
		}
		node fun;
		fun.x = a; fun.num = i;
		st.push(fun);
		ans ^= i;
		printf("%llu\n", ans);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值