社区讨论
求条玄学 CE
P6864[RC-03] 记忆参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mlgxt11x
- 此快照首次捕获于
- 2026/02/11 02:31 上周
- 此快照最后确认于
- 2026/02/11 02:31 上周
没见过这样的报错,可能是才疏学浅了。
code
CPP#include <iostream>
#include <cstring>
#include <array>
using namespace std;
typedef long long ll;
constexpr ll N=2e5+3;
struct Mat
{
array<array<ll,3>,3> a{};
ll sze=3;
Mat operator*(const Mat &other)
{
Mat z;
for (ll k=0;k<sze;k++)
{
for (ll i=0;i<sze;i++)
{
for (ll j=0;j<sze;j++)
{
z.a[i][j]+=a[i][k]*other.a[k][j];
}
}
}
return z;
}
void eye()
{
a={};
for (ll i=0;i<sze;i++)
{
a[i][i]=1;
}
}
} t[N<<2];
bool is_not_ava[N<<2];
inline ll ls(ll x)
{
return x<<1;
}
inline ll rs(ll x)
{
return x<<1|1;
}
inline void push_up(ll p)
{
if (is_not_ava[ls(p)]&&is_not_ava[rs(p)])
{
t[p].eye();
}
else if (is_not_ava[ls(p)])
{
t[p]=t[rs(p)];
}
else if (is_not_ava[rs(p)])
{
t[p]=t[ls(p)];
}
else
{
t[p]=t[rs(p)]*t[ls(p)];
}
}
void build(ll p,ll tl,ll tr)
{
if (tl==tr)
{
t[p].eye();
return;
}
ll tmid=(tl+tr)>>1;
build(ls(p),tl,tmid);
build(rs(p),tmid+1,tr);
push_up(p);
}
void change_2(ll p,ll tl,ll tr,ll i)
{
if (tl==tr)
{
t[p].a=array<array<ll,3>,3>{{{1,0,1},{0,0,1},{0,0,1}}};
return;
}
ll tmid=(tl+tr)>>1;
if (i<=tmid)
{
change_2(ls(p),tl,tmid,i);
}
else
{
change_2(rs(p),tmid+1,tr,i);
}
push_up(p);
}
void change_1(ll p,ll tl,ll tr,ll i)
{
if (tl==tr)
{
t[p].a=array<array<ll,3>,3>{{{1,1,1},{0,1,1},{0,0,1}}};
return;
}
ll tmid=(tl+tr)>>1;
if (i<=tmid)
{
change_1(ls(p),tl,tmid,i);
}
else
{
change_1(rs(p),tmid+1,tr,i);
}
push_up(p);
}
void undo(ll p,ll tl,ll tr,ll i)
{
if (tl==tr)
{
is_not_ava[p]=!is_not_ava[p];
return;
}
ll tmid=(tl+tr)>>1;
if (i<=tmid)
{
undo(ls(p),tl,tmid,i);
}
else
{
undo(rs(p),tmid+1,tr,i);
}
push_up(p);
}
ll related_i[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll n;
cin>>n;
build(1,1,n);
for (ll i=1;i<=n;i++)
{
char op;
cin>>op;
related_i[i]=i;
if (op=='1')
{
change_1(1,1,n,i);
}
else if (op== '2')
{
change_2(1,1,n,i);
}
else if (op=='3')
{
ll x;
cin>>x;
related_i[i]=related_i[x];
undo(1,1,n,related_i[x]);
}
ll f=0;
for (ll i=0;i<3;i++)
{
f+=t[1].a[0][i];
}
cout<<f<<'\n';
}
}
本地(c++20,g++-11 (Ubuntu 11.4.0-2ubuntu1~20.04) 11.4.0)可以编译通过并过样例。
回复
共 4 条回复,欢迎继续交流。
正在加载回复...