社区讨论
卡常求助
学术版参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhiz9k6x
- 此快照首次捕获于
- 2025/11/03 18:08 4 个月前
- 此快照最后确认于
- 2025/11/03 18:08 4 个月前
实现了 https://www.luogu.com.cn/problem/P8569 的 做法。
但是跑得非常慢,大概在暴力 20 到 30 倍时间。
所以很可能是复杂度假了。
CPP#include<bits/stdc++.h>
#define vr vector<int>
#define in signed
#define int unsigned long long
using namespace std;
namespace READ
{
inline int Read()
{
char ch=getchar();int s=0;
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
return s;
}
int tp[10005],l,r,g1,g2;
inline void init(int &n)
{
int i,k;n=Read(),k=Read(),l=1;
for(i=1;i<=k;++i)tp[i]=Read();
}
inline int read()
{
if(l>r)l=Read(),r=Read(),g1=Read(),g2=Read();
return tp[l++]*g1+g2;
}
}
const int w=64,A=-1;int n,ans;
struct mat
{
vr t;
inline void add(mat x,int G=A,in h=0)
{
if(!G)return;if(G!=A)for(int i=0;i<x.t.size();++i)x.t[i]&=G;
while(t.size()<x.t.size()+h)t.push_back(0);int p=0,P;in i=h;
for(;i<x.t.size()+h;p=P,++i)P=(t[i]&x.t[i-h])|((t[i]^x.t[i-h])&p),t[i]^=(x.t[i-h]^p);
for(;i<t.size()&&p;p=P,++i)P=t[i]&p,t[i]^=p;if(p)t.push_back(p);
}
inline void mul(mat x)
{
mat p;if(x.t.size()>t.size())swap(t,x.t);
for(in i=0;i<x.t.size();++i)p.add(*this,x.t[i],i);t=p.t;
}
};
struct node
{
mat L,R,S;int F;
inline node merge(node o)
{
mat oL=o.L;
o.L.mul(R),S.add(o.S),S.add(o.L);
L.add(oL,F),o.R.add(R,o.F),R=o.R,F&=o.F;
return *this;
}
}re;
inline node sol(in l,in r)
{
if(l==r){re.L.t=re.R.t=re.S.t={re.F=READ::read()^A};return re;}
in mid=l+r>>1;return sol(l,mid).merge(sol(mid+1,r));
}
signed main()
{
//freopen("dat.in","r",stdin);
READ::init(n);node as=sol(1,n);ans=(n*(n+1)>>1)*A;
for(in i=0;i<as.S.t.size();++i)
for(in j=0;i+j<w;++j)if(as.S.t[i]>>j&1)ans-=(1ull<<(i+j));
cout<<ans<<'\n';return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...