1 条题解

  • 0
    @ 2025-10-22 18:09:33

    题解

    题目分析

    这是一道算法题目,需要根据具体题目要求进行求解。

    解题思路

    1. 问题分析

    • 仔细阅读题目描述,理解题目要求
    • 分析输入输出格式和约束条件
    • 确定需要使用的算法和数据结构

    2. 算法选择

    • 根据题目特点选择合适的算法
    • 考虑时间复杂度和空间复杂度
    • 确保算法能正确处理所有测试用例

    3. 实现要点

    • 注意边界条件的处理
    • 优化输入输出以提高效率
    • 确保代码的正确性和鲁棒性

    4. 调试和优化

    • 使用测试用例验证算法正确性
    • 分析性能瓶颈并进行优化
    • 确保代码能通过所有测试点

    注意事项

    • 仔细处理数据类型和精度问题
    • 注意数组越界和空指针问题
    • 确保算法的时间复杂度符合要求
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<cstdio>
    #include<bitset>
    #include<queue>
    #include<ctime>
    #include<cmath>
    #include<set>
    #include<map>
    #define infile(filename) freopen(filename".in","r",stdin)
    #define outfile(filename) freopen(filename".out","w",stdout)
    #define usefile(filename) infile(filename),outfile(filename)
    using namespace std; typedef long long ll; typedef unsigned long long ull; typedef __int128 I;
    namespace IO {
    	const int BUF=1<<20; static char ch[BUF]={},out[BUF]={},*l=ch,*r=ch,*o=out;
    #define FASTIO
    #ifdef FASTIO
    	inline char gc() { return (l==r&&(r=(l=ch)+fread(ch,1,BUF,stdin),l==r))?EOF:*l++; }
    #else
    	inline char gc() { return getchar(); }
    #endif
    	inline void flush() { fwrite(out,1,o-out,stdout),o=out; }
    	inline void putc(char ch) { if(o==out+BUF) flush(); *o++=ch; }
    	struct flusher{~flusher(){flush();}}_;
    }; using IO::gc; using IO::putc;
    template <typename T> void read(T &a) { static char fushu,ch; a=fushu=0; do ch=gc(); while(ch!='-'&&(ch<48||ch>57)); if(ch=='-') ch=gc(),fushu=1; do a=(a<<1)+(a<<3)+(ch^48),ch=gc(); while(ch>47&&ch<58); if(fushu) a=-a; }
    template <typename T,typename ...Args> void read(T &a,Args &...args) { read(a),read(args...); }
    template <typename T> void write(T a) { static char que[114]={},*p=que; if(!a) putc(48); if(a<0) putc('-'),a=-a; while(a) *p++=(a%10)^48,a/=10; while(p!=que) putc(*--p); putc(32); }
    template <typename T,typename ...Args> void write(T a,Args ...args) { write(a),write(args...); }
    template <typename T> void ckmax(T &a,T b) { if(a<b) a=b; }
    template <typename T> void ckmin(T &a,T b) { if(b<a) a=b; }
    const int N=1000099,moder=998244353;
    int add(int x,int y) { return x+y>=moder?x+y-moder:x+y; } int Add(int &x,int y) { return x=x+y>=moder?x+y-moder:x+y; }
    int sub(int x,int y) { return x<y?x-y+moder:x-y; } int Sub(int &x,int y) { return x=x<y?x-y+moder:x-y; }
    int kuai(int a,int b) { ull rey=1,temp=a; for(;b;b>>=1) { if(b&1) rey=rey*temp%moder; temp=temp*temp%moder; } return rey; }
    struct note { int a,b,c; note(int _a=0,int _b=0,int _c=0){a=_a,b=_b,c=_c;} };
    int TID,T,n; map<string,note> id; int a[23]={},fact[N]={},finv[N]={},pow2[N]={},pre[N]={}; string s[23];
    int Choose(int n,int m) { return n<m||n<0||m<0?0:(ull)fact[n]*finv[m]%moder*finv[n-m]%moder; }
    void init() {
    	id["LL_RR"]=id["LRL_R"]=id["L_RLR"]=note(0,1,0);
    	id["L_LRR"]=note(0,0,1),id["LLR_R"]=note(0,0,-1);
    	id["_LLRR"]=id["LLRR_"]=id["LRLR_"]=id["LR_LR"]=id["_LRLR"]=id["R_LLR"]=id["LRR_L"]=id["R_LRL"]=id["RLR_L"]=id["RR_LL"]=0;
    	id["RL_LR"]=1,id["LR_RL"]=-1;
    	id["RRL_L"]=id["LRRL_"]=id["RLRL_"]=2,id["R_RLL"]=id["_RLRL"]=id["_RLLR"]=-2;
    }
    int main()
    {
    	// usefile("frogs");
    	int i,c_,c__,c$,c$$,c0,cup,cdn,cex;
    	int _,A,B,C,D,big,les,equ;
    	ios::sync_with_stdio(0);
    	cin.tie(0),cout.tie(0);
    	init();
    	fact[0]=finv[0]=pow2[0]=1;
    	for(i=1;i<N;++i) fact[i]=(ull)fact[i-1]*i%moder;
    	finv[N-1]=kuai(fact[N-1],moder-2);
    	for(i=N-2;i;--i) finv[i]=(ull)finv[i+1]*(i+1)%moder;
    	for(i=1;i<N;++i) pow2[i]=add(pow2[i-1],pow2[i-1]);
    	auto PRE=[&](int x)->int{return x<-c_?0:x>c$?pre[c_+c$]:pre[x+c_];};
    	cin>>TID>>T;
    	loop : --T;
    	cin>>n;
    	c_=c__=c$=c$$=c0=cup=cdn=cex=A=B=C=D=0;
    	for(i=0;i<n;++i) {
    		cin>>s[i]>>a[i];
    		if(id[s[i]].c==1) cup+=a[i];
    		else if(id[s[i]].c==-1) cdn+=a[i];
    		else if(id[s[i]].b==1) cex+=a[i];
    		else if(id[s[i]].a==-1) c_+=a[i];
    		else if(id[s[i]].a==-2) c__+=a[i];
    		else if(id[s[i]].a==1) c$+=a[i];
    		else if(id[s[i]].a==2) c$$+=a[i];
    		else if(id[s[i]].a==0) c0+=a[i];
    	}
    	// printf("a: %d %d %d %d %d\n",c__,c_,c0,c$,c$$);
    	// printf("b: %d\n",cex);
    	// printf("c: %d %d\n",cdn,cup);
    	for(i=-c_;i<=c$;++i) pre[i+c_]=Choose(c_+c$,c_+i);
    	for(i=1;i<=c_+c$;++i) Add(pre[i],pre[i-1]);
    	big=les=equ=0;
    	for(i=-c__;i<=c$$;++i) {
    		_=Choose(c__+c$$,c__+i);
    		Add(les,(ull)PRE(-2*i-1)*_%moder);
    		Add(equ,(ull)sub(PRE(-2*i),PRE(-2*i-1))*_%moder);
    	}
    	big=sub(pow2[c_+c__+c$+c$$],add(les,equ));
    	Add(A,(ull)pow2[cup+cdn+cex]*big%moder);
    	Add(B,(ull)pow2[cup+cdn+cex]*les%moder);
    	// printf("les=%d equ=%d big=%d\n",les,equ,big);
    	_=pow2[max(0,cex-1)];
    	for(i=-cdn;i<=cup;++i)
    		if(i>0) Add(A,(ull)_*equ%moder*Choose(cdn+cup,cdn+i)%moder);
    		else if(i<0) Add(B,(ull)_*equ%moder*Choose(cdn+cup,cdn+i)%moder);
    		else Add(D,(ull)_*equ%moder*Choose(cdn+cup,cdn+i)%moder);
    	if(cex) {
    		_=pow2[cex-1];
    		for(i=-cdn;i<=cup;++i)
    			if(i>1) Add(A,(ull)_*equ%moder*Choose(cdn+cup,cdn+i)%moder);
    			else if(i<-1) Add(B,(ull)_*equ%moder*Choose(cdn+cup,cdn+i)%moder);
    			else Add(C,(ull)_*equ%moder*Choose(cdn+cup,cdn+i)%moder);
    	}
    	A=(ull)A*pow2[c0]%moder,B=(ull)B*pow2[c0]%moder;
    	C=(ull)C*pow2[c0]%moder,D=(ull)D*pow2[c0]%moder;
    	printf("%d %d %d %d\n",A,B,C,D);
    	if(T) goto loop;
    	return 0;
    }
    
    • 1

    信息

    ID
    3780
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者