社区讨论

卡常求助

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhiz9k6x
此快照首次捕获于
2025/11/03 18:08
4 个月前
此快照最后确认于
2025/11/03 18:08
4 个月前
查看原帖
实现了 https://www.luogu.com.cn/problem/P8569 的 O(n)O(n) 做法。
但是跑得非常慢,大概在暴力 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 条回复,欢迎继续交流。

正在加载回复...