ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABC265F,G

2022-08-30 01:00:28  阅读:129  来源: 互联网

标签:pp int memset vis sm ans ABC265F


ABC265F

题解做法 by Mikukuovo

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
int n,d;
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>d;
    vector<int>p(n),q(n);
    for(int i=0;i<n;++i) cin>>p[i];
    for(int i=0;i<n;++i) cin>>q[i];
    vector dp(d+1,vector<ll>(d+1));
    dp[0][0]=1;
    for(int k=0;k<n;++k){
        int w=abs(p[k]-q[k]);
        vector s1(d+1,vector<ll>(d+1));
        s1=dp;
        auto s2=s1;
        for(int i=0;i<d;++i){
            for(int j=0;j<d;++j){
                (s1[i+1][j+1]+=s1[i][j])%=mod;
                (s2[i+1][j]+=s2[i][j+1])%=mod;
            }
        }
        auto Calcs1=[&](int i,int j)->ll{
            if(i<0||j<0) return 0;
            return s1[i][j];
        };
        auto Calcs2=[&](int i,int j,int w)->ll{
            int prei=i-w-1,prej=j+w+1;
            if(j<0){
                i+=j;
                j=0;
            }
            if(i<0) return 0;
            ll res=s2[i][j];
            if(prei>=0&&prej<=d) res-=s2[prei][prej];
            res=(res%mod+mod)%mod;
            return res;
        };
        for(int i=0;i<d+1;++i){
            for(int j=0;j<d+1;++j){
                ll res=0;
                (res+=Calcs1(i-1,j-w-1))%=mod;
                (res+=Calcs1(i-w-1,j-1))%=mod;
                (res+=Calcs2(i,j-w,w))%=mod;
                dp[i][j]=res;
            }
        }
    }
    ll ans=0;
    for(int i=0;i<d+1;++i) for(int j=0;j<d+1;++j) (ans+=dp[i][j])%=mod;
    cout<<ans<<endl;
    return 0;
}

ABC265G

分块做法 by wanghaoze

#include<bits/stdc++.h>
using namespace std;
int n,q,a[101010],tp[111],l[111],r[111],p[3][111];
int cnt[3][222],mp[101010],pp[3][222],vl[3][222];
bool vis[101010];
long long sm[3][3][222];
void solve(int m)
{
	memset(vis,0,sizeof(vis));
	for(int i=0;i<m;i++)
	{
		cin>>tp[i]>>l[i]>>r[i];
		if(tp[i]==2)
		{
			cin>>p[0][i]>>p[1][i]>>p[2][i];
		}
		l[i]--;
		vis[l[i]]=1;
		vis[r[i]]=1;
	}
	int nn=0;
	memset(cnt,0,sizeof(cnt));
	memset(sm,0,sizeof(sm));
	memset(mp,0,sizeof(mp));
	for(int i=0;i<=n;i++)
	{
		if(vis[i])
		{
			nn++;
			mp[i]=nn;
			pp[0][nn]=0;
			pp[1][nn]=1;
			pp[2][nn]=2;
		}
		sm[0][a[i]][nn]+=cnt[0][nn];
		sm[1][a[i]][nn]+=cnt[1][nn];
		sm[2][a[i]][nn]+=cnt[2][nn];
		cnt[a[i]][nn]++;
	}
	for(int i=0;i<m;i++)
	{
		if(tp[i]==2)
		{
			for(int j=mp[l[i]];j<mp[r[i]];j++)
			{
				pp[0][j]=p[pp[0][j]][i];
				pp[1][j]=p[pp[1][j]][i];
				pp[2][j]=p[pp[2][j]][i];
			}
		}
		else
		{
			long long ans=0;
			for(int j=mp[l[i]];j<mp[r[i]];j++)
			{
				vl[0][j]=0;
				vl[1][j]=0;
				vl[2][j]=0;
				vl[pp[0][j]][j]+=cnt[0][j];
				vl[pp[1][j]][j]+=cnt[1][j];
				vl[pp[2][j]][j]+=cnt[2][j];
				if(pp[0][j]>pp[1][j])
				{
					ans+=sm[0][1][j];
				}
				if(pp[0][j]>pp[2][j])
				{
					ans+=sm[0][2][j];
				}
				if(pp[1][j]>pp[0][j])
				{
					ans+=sm[1][0][j];
				}
				if(pp[1][j]>pp[2][j])
				{
					ans+=sm[1][2][j];
				}
				if(pp[2][j]>pp[0][j])
				{
					ans+=sm[2][0][j];
				}
				if(pp[2][j]>pp[1][j])
				{
					ans+=sm[2][1][j];
				}
			}
			for(int j=mp[l[i]];j<mp[r[i]];j++)
			{
				for(int k=j+1;k<mp[r[i]];k++)
				{
					ans+=1ll*vl[1][j]*vl[0][k]+1ll*vl[2][j]*vl[0][k]+1ll*vl[2][j]*vl[1][k];
				}
			}
			cout<<ans<<endl;
		}
	}
	int lst=0;
	for(int i=0;i<n;i++)
	{
		lst=max(mp[i],lst);
		if(lst)
		{
			a[i]=pp[a[i]][lst];
		}
	}
}
int main()
{
	cin>>n>>q;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<q;i+=100)
	{
		solve(min(q,i+100)-i);
	}
	return 0;
}

标签:pp,int,memset,vis,sm,ans,ABC265F
来源: https://www.cnblogs.com/Zeardoe/p/16637932.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有