4 条题解

  • 0
    @ 2026-6-12 16:17:58

    注意到我们在做这道题之前学习了:

    • 线段树
    • 缩点
    • 矩阵快速幂
    • 二维数点
    • 中国剩余定理
    • 莫队
    • 树链剖分
    • 高斯消元
    • 线性基

    所以我们在写代码的时候不需要删除这些模板的代码(会让我们累死),只需要注释即可(不会让我们累死)。

    代码如下:

    /*
    
    #include<bits/stdc++.h>
    #define int long long
    #define N 100005
    using namespace std;
    constexpr int MOD=571373;
    
    int n,m,q;
    int op,l,r,x;
    array<int,N> a;
    
    struct tree
    {
    	array<int,N<<2> p;
    	array<int,N<<2> t1;
    	array<int,N<<2> t2;
    
    	inline void lazy(int rt,int l,int r,int k)
    	{
    		(p.at(rt)+=(r-l+1)*k%MOD)%=MOD;
    		(t1.at(rt)+=k)%=MOD;
    	}
    
    	inline void times(int rt,int l,int r,int k)
    	{
    		(p.at(rt)*=k)%=MOD;
    		(t1.at(rt)*=k)%=MOD;
    		(t2.at(rt)*=k)%=MOD;
    	}
    
    	void push(int rt,int l,int r)
    	{
    		if(t2.at(rt)!=1)
    		{
    			int mid=l+r>>1;
    			times(rt<<1,l,mid,t2.at(rt) );
    			times(rt<<1|1,mid+1,r,t2.at(rt) );
    		}
    		if(t1.at(rt) )
    		{
    			int mid=l+r>>1;
    			lazy(rt<<1,l,mid,t1.at(rt) );
    			lazy(rt<<1|1,mid+1,r,t1.at(rt) );
    		}
    		t1.at(rt)=0;
    		t2.at(rt)=1;
    	}
    
    	void build(int rt,int l,int r)
    	{
    		if(l==r)
    		{
    			p.at(rt)=a.at(l);
    			return;
    		}
    
    		int mid=l+r>>1;
    		build(rt<<1,l,mid);
    		build(rt<<1|1,mid+1,r);
    		p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
    	}
    
    	void add(int rt,int l,int r,int ql,int qr,int k)
    	{
    		if(ql<=l && r<=qr)
    		{
    			lazy(rt,l,r,k);
    			return;
    		}
    		push(rt,l,r);
    
    		int mid=l+r>>1;
    		if(ql<=mid) add(rt<<1,l,mid,ql,qr,k);
    		if(mid<qr) add(rt<<1|1,mid+1,r,ql,qr,k);
    		p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
    	}
    
    	void mul(int rt,int l,int r,int ql,int qr,int k)
    	{
    		if(ql<=l && r<=qr)
    		{
    			times(rt,l,r,k);
    			return;
    		}
    		push(rt,l,r);
    
    		int mid=l+r>>1;
    		if(ql<=mid) mul(rt<<1,l,mid,ql,qr,k);
    		if(mid<qr) mul(rt<<1|1,mid+1,r,ql,qr,k);
    		p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
    	}
    
    	int query(int rt,int l,int r,int ql,int qr)
    	{
    		if(ql<=l && r<=qr)
    		return p.at(rt);
    		push(rt,l,r);
    
    		int ret=0;
    		int mid=l+r>>1;
    		if(ql<=mid) (ret+=query(rt<<1,l,mid,ql,qr)%MOD)%=MOD;
    		if(mid<qr) (ret+=query(rt<<1|1,mid+1,r,ql,qr)%MOD)%=MOD;
    		return ret;
    	}
    };
    
    tree t;
    
    signed main()
    {
    	cin>>n>>q>>m;
    	for(int i=1;i<=n;i++)
    	scanf("%lld",&a.at(i) );
    	t.build(1,1,n);
    	t.t2.fill(1);
    
    	while(q--)
    	{
    		scanf("%lld",&op);
    		if(op==1)
    		{
    			scanf("%lld%lld%lld",&l,&r,&x);
    			t.mul(1,1,n,l,r,x);
    		}
    		else if(op==2)
    		{
    			scanf("%lld%lld%lld",&l,&r,&x);
    			t.add(1,1,n,l,r,x);
    		}
    		else
    		{
    			scanf("%lld%lld",&l,&r);
    			printf("%lld\n",t.query(1,1,n,l,r)%MOD);
    		}
    	}
    	return 0;
    }
    
    #include<bits/stdc++.h>
    #define int long long
    #define N 105
    using namespace std;
    constexpr int INF=0x3f3f3f3f3f3f3f3f;
    constexpr int MOD=1e9+7;
    
    int n,m;
    array<array<int,N>,N> a;
    
    inline void times(array<array<int,N>,N> &x,array<array<int,N>,N> &y)
    {
    	array<array<int,N>,N> ret={};
    	for(int k=1;k<=n;k++)
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
    	(ret.at(i).at(j)+=x.at(i).at(k)*y.at(k).at(j)%MOD)%=MOD;
    	x=ret;
    }
    
    inline void pow(array<array<int,N>,N> &a,int y)
    {
    	array<array<int,N>,N> ret;
    	ret=a;
    	while(y)
    	{
    		if(y&1) times(ret,a);
    		times(a,a);
    		y>>=1;
    	}
    	a=ret;
    }
    
    signed main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
    	scanf("%lld",&a.at(i).at(j) );
    	if(m==0)
    	{
    		for(int i=1;i<=n;i++)
    		{
    			for(int j=1;j<=n;j++)
    			printf("%d ",i==j ? 1:0);
    			printf("\n");
    		}
    		return 0;
    	}
    
    	pow(a,m-1);
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		printf("%lld ",a.at(i).at(j) );
    		printf("\n");
    	}
    	return 0;
    }
    
    #include<bits/stdc++.h>
    #define int long long
    #define N 2000000
    #define f first
    #define s second
    using namespace std;
    
    struct str
    {
    	int x;
    	int id;
    	int val;
    };
    
    int n,q;
    int x,y,z;
    array<int,N+5> a;
    array<int,N+5> g;
    array<int,N+5> ans;
    array<vector<str>,N+5> v;
    
    inline int lowbit(int x)
    {
    	return x&(-x);
    }
    
    inline void add(int x)
    {
    	for(int i=x;i<=N;i+=lowbit(i) )
    	g.at(i)++;
    }
    
    inline int query(int x)
    {
    	int ret=0;
    	for(int i=x;i>=1;i-=lowbit(i) )
    	ret+=g.at(i);
    	return ret;
    }
    
    signed main()
    {
    	cin>>n>>q;
    	g.fill(0);
    	ans.fill(0);
    	for(int i=1;i<=n;i++)
    	scanf("%lld",&a.at(i) );
    
    	for(auto &e:v) e.clear();
    	for(int i=1;i<=q;i++)
    	{
    		scanf("%lld%lld%lld",&x,&y,&z);
    		v.at(x-1).push_back({z,i,-1});
    		v.at(y).push_back({z,i,1});
    	}
    
    	for(int i=1;i<=n;i++)
    	{
    		add(a.at(i) );
    		for(const auto &e:v.at(i) )
    		ans.at(e.id)+=e.val*query(e.x);
    	}
    
    	for(int i=1;i<=q;i++)
    	printf("%lld\n",ans.at(i) );
    	return 0;
    }
    
    
    #include<bits/stdc++.h>
    #define int long long
    #define N 91
    using namespace std;
    
    int n;
    array<int,N> a,b;
    
    int ext(int a,int b,int &x,int &y)
    {
    	if(!b)
    	{
    		x=1;
    		y=0;
    		return a;
    	}
    	
    	int q=ext(b,a%b,x,y);
    	
    	int t=x;
    	x=y;
    	y=t-a/b*y;
    	return q;
    }
    
    int crt(array<int,N> p,array<int,N> q,int k)
    {
    	int x,y,m;
    	int a=0,n=1;
    	for(int i=1;i<=k;i++)
    	n*=p.at(i);
    	
    	for(int i=1;i<=k;i++)
    	{
    		m=n/p.at(i);
    		ext(p.at(i),m,x,y);
    		a=(a+(__int128)y*m*q.at(i) )%n;
    	}
    	
    	if(a>0) return a;
    	else return a+n;
    }
    
    signed main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	cin>>a.at(i)>>b.at(i);
    	
    	cout<<crt(a,b,n)<<endl;
    	return 0;
    }
    
    #include<bits/stdc++.h>
    #define int long long
    #define N 50004
    #define f first
    #define s second
    using namespace std;
    constexpr int INF=0x3f3f3f3f3f3f3f3f;
    
    struct str
    {
    	int x;
    	int y;
    	int id;
    };
    
    int n,m,k;
    int ans;
    array<int,N> a;
    array<int,N> p;
    array<int,N> ansl;
    
    int q;
    int x,y;
    int l,r;
    array<str,N> s;
    
    inline int to(int x)
    {
    	return (x-1)/m+1;
    }
    
    inline int bl(int x)
    {
    	return (x-1)*m+1;
    }
    
    inline int br(int x)
    {
    	return min(m*x,n);
    }
    
    inline void add(int x)
    {
    	p.at(a.at(x) )++;
    	ans+=p.at(a.at(x) )<<1;
    	ans--;
    }
    
    inline void del(int x)
    {
    	p.at(a.at(x) )--;
    	ans-=p.at(a.at(x) )<<1;
    	ans--;
    }
    
    signed main()
    {
    	cin>>n>>q>>k;
    	m=sqrt(n);
    	p.fill(0);
    	for(int i=1;i<=n;i++)
    	scanf("%lld",&a.at(i) );
    
    	for(int i=1;i<=q;i++)
    	{
    		scanf("%lld%lld",&s.at(i).x,&s.at(i).y);
    		s.at(i).id=i;
    	}
    
    	sort(s.begin()+1,s.begin()+1+q,[](str &l,str &r)
    	{if(to(l.x)==to(r.x) ) return l.y<r.y;
    	 else return to(l.x)<to(r.x);});
    	l=s.at(1).x,r=s.at(1).y;
    
    	for(int i=l;i<=r;i++)
    	p.at(a.at(i) )++;
    	for(int i=1;i<=k;i++)
    	ans+=p.at(i)*p.at(i);
    	ansl.at(s.at(1).id)=ans;
    
    	for(int i=2;i<=q;i++)
    	{
    		while(l<s.at(i).x) del(l++);
    		while(l>s.at(i).x) add(--l);
    		while(r<s.at(i).y) add(++r);
    		while(r>s.at(i).y) del(r--);
    		ansl.at(s.at(i).id)=ans;
    	}
    
    	for(int i=1;i<=q;i++)
    	printf("%lld\n",ansl.at(i) );
    	return 0;
    }
    
    #include<bits/stdc++.h>
    #define int long long
    #define N 100005
    #define M 710
    #define f first
    #define s second
    using namespace std;
    constexpr int INF=0x3f3f3f3f3f3f3f3f;
    
    int n,r;
    int q,op;
    int x,y,z;
    int cnt,mod;
    array<int,N> a;
    array<int,N> fa;
    array<int,N> dep;
    array<int,N> hev;
    array<int,N> p,to;
    array<int,N> t1,t2;
    array<int,N> top,dfn;
    array<vector<int>,N> g;
    
    inline int lowbit(int x)
    {
    	return x&-x;
    }
    
    inline void add(array<int,N> &t,int x,int k)
    {
    	k%=mod;
    	for(int i=x;i<=n;i+=lowbit(i) )
    	(t.at(i)+=k)%=mod;
    }
    
    inline void update(int l,int r,int k)
    {
    	k%=mod;
    	add(t1,l,k);
    	add(t1,r+1,(mod-k)%mod);
    	add(t2,l,(l%mod)*k%mod);
    	add(t2,r+1,(mod-(r+1)%mod*k%mod)%mod);
    }
    
    inline int query(int l,int r)
    {
    	int ret;
    	int ret1=0,ret2=0;
    	for(int i=r;i>0;i-=lowbit(i) )
    	{
    		(ret1+=t1.at(i) )%=mod;
    		(ret2+=t2.at(i) )%=mod;
    	}
    	ret=( (r+1)%mod*ret1%mod-ret2+mod)%mod;
    
    	ret1=0,ret2=0;
    	for(int i=l-1;i>0;i-=lowbit(i) )
    	{
    		(ret1+=t1.at(i) )%=mod;
    		(ret2+=t2.at(i) )%=mod;	
    	}
    	ret=(ret-( (l%mod*ret1%mod-ret2+mod)%mod)+mod)%mod;
    	return ret;
    }
    
    void dfs1(int rt,int f)
    {
    	p.at(rt)=1;
    	fa.at(rt)=f;
    	dep.at(rt)=dep.at(f)+1;
    	for(const auto &e:g.at(rt) )
    	if(e!=f)
    	{
    		dfs1(e,rt);
    		p.at(rt)+=p.at(e);
    		if(p.at(hev.at(rt) )<p.at(e) )
    		hev.at(rt)=e;
    	}
    }
    
    void dfs2(int rt,int ft)
    {
    	dfn.at(rt)=++cnt;
    	to.at(cnt)=rt;
    	top.at(rt)=ft;
    	if(hev.at(rt) )
    	dfs2(hev.at(rt),ft);
    
    	for(const auto &e:g.at(rt) )
    	if(e!=fa.at(rt) && e!=hev.at(rt) )
    	dfs2(e,e);
    }
    
    inline int front(int l,int r)
    {
    	int ret=0;
    	while(top.at(l)!=top.at(r) )
    	{
    		if(dep.at(top.at(l) )<dep.at(top.at(r) ) )
    		swap(l,r);
    		(ret+=query(dfn.at(top.at(l) ),dfn.at(l) ) )%=mod;
    		l=fa.at(top.at(l) );
    	}
    
    	if(dep.at(l)>dep.at(r) ) swap(l,r);
    	(ret+=query(dfn.at(l),dfn.at(r) ) )%=mod;
    	return ret;
    }
    
    inline int sons(int x)
    {
    	return query(dfn.at(x),dfn.at(x)+p.at(x)-1);
    }
    
    inline void change(int l,int r,int k)
    {
    	while(top.at(l)!=top.at(r) )
    	{
    		if(dep.at(top.at(l) )<dep.at(top.at(r) ) )
    		swap(l,r);
    		update(dfn.at(top.at(l) ),dfn.at(l),k);
    		l=fa.at(top.at(l) );
    	}
    	if(dep.at(l)>dep.at(r) ) swap(l,r);
    	update(dfn.at(l),dfn.at(r),k);
    }
    
    inline void covson(int x,int k)
    {
    	update(dfn.at(x),dfn.at(x)+p.at(x)-1,k);
    }
    
    signed main()
    {
    	cin>>n>>q>>r>>mod;
    	for(int i=1;i<=n;i++)
    	scanf("%lld",&a.at(i) );
    	for(int i=1;i<n;i++)
    	{
    		scanf("%lld%lld",&x,&y);
    		g.at(x).push_back(y);
    		g.at(y).push_back(x);
    	}
    
    	dfs1(r,0);
    	dfs2(r,r);
    	for(int i=1;i<=n;i++)
    	update(dfn.at(i),dfn.at(i),a.at(i) );
    	
    	while(q--)
    	{
    		scanf("%lld",&op);
    		if(op==1)
    		{
    			scanf("%lld%lld%lld",&x,&y,&z);
    			change(x,y,z);
    		}
    		else if(op==2)
    		{
    			scanf("%lld%lld",&x,&y);
    			printf("%lld\n",front(x,y) );
    		}
    		else if(op==3)
    		{
    			scanf("%lld%lld",&x,&y);
    			covson(x,y);
    		}
    		else if(op==4)
    		{
    			scanf("%lld",&x);
    			printf("%lld\n",sons(x) );
    		}
    	}
    	return 0;
    }
    
    #include<bits/stdc++.h>
    #define int long long
    #define N 105
    #define M 105
    using namespace std;
    constexpr double zed=1e-9;
    
    int n;
    int now,num;
    array<array<double,M>,N> a;
    array<double,N> ans;
    
    inline int gauss()
    {
    	now=1;
    	// 从当前行开始找绝对值最大的元素 
    	for(int i=1;i<=n;i++)
    	{
    		num=now;
    		for(int j=now;j<=n;j++)
    		if(fabs(a.at(j).at(i) )>fabs(a.at(num).at(i) ) )
    		num=j;
    		// 如果当前列全为 0,跳过 
    		if(fabs(a.at(num).at(i) )<zed) continue;
    		
    		// 将最大行交换到当前位置 
    		if(num!=now)
    		for(int j=1;j<=n+1;j++)
    		swap(a.at(now).at(j),a.at(num).at(j) );
    		// 主元归一 
    		double x=a.at(now).at(i);
    		for(int j=1;j<=n+1;j++)
    		a.at(now).at(j)/=x;
    		
    		double fac;
    		for(int j=1;j<=n;j++)
    		if(j!=now)
    		{
    			fac=a.at(j).at(i);
    			if(fabs(fac)>zed)
    			for(int l=1;l<=n+1;l++)
    			a.at(j).at(l)-=fac*a.at(now).at(l);
    		}
    		now++;
    	}
    	
    	// 检查无解  
    	bool tr;
    	for(int i=now;i<=n;i++)
    	{
    		tr=true;
    		for(int j=1;j<=n;j++)
    		if(fabs(a.at(i).at(j) )>zed)
    		{
    			tr=false;
    			break;
    		}
    		if(tr && fabs(a.at(i).at(n+1) )>zed)
    		return -1;
    	}
    	// 无穷解 
    	if(now<=n) return 0;
    	
    	for(int i=1;i<=n;i++)
    	ans.at(i)=a.at(i).at(n+1);
    	return 1;
    }
    
    signed main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=n+1;j++)
    	scanf("%lf",&a.at(i).at(j) );
    	
    	if(gauss()<=0) cout<<"No Solution"<<endl;
    	else
    	for(int i=1;i<=n;i++)
    	printf("%.2lf\n",ans.at(i) );
    	return 0;
    }
    
    */
    
    
    
    #include<bits/stdc++.h>
    #define int long long
    #define N 100005
    using namespace std;
    
    
    
    signed main()
    {
    	freopen("test.out","w",stdout);
    	cout<<"Hello"<<", "<<"W"<<"o"<<"r"<<"l"<<"d"+1-1<<"!"<<endl;
    	return 0;
    }
    

    信息

    ID
    1
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    202
    已通过
    51
    上传者