zoukankan      html  css  js  c++  java
  • loj 6270 数据结构板子题

    loj

    这题显然可以对长度离线,从大到小枚举长度,然后(O(nlog^2n))二维数点即可 然后就T了

    板子题都不会了嘤嘤嘤

    换个方向考虑,从小到大枚举,然后询问的答案就是 长度(le n)的合法区间贡献减长度(le k_i-1)的合法区间贡献.然后合法区间贡献又等于所有的贡献减不合法区间的贡献,不合法区间显然有左端点(<L)和右端点(>R)的,一般情况下这两种情况是会重复的,但是如果只统计长度(<)当前询问区间长度(+1)的区间,那么这两种不合法区间是没有交的,因为他们的交集的区间长度一定要比当前询问区间长度(+1)大,并且这样合法区间也会被包含在当前询问区间长度(+1)内.所以把每个询问拆成 区间长度$le (当前询问区间长度)+1(的合法区间贡献减长度)le k_i-1$的合法区间贡献,然后从小到大枚举长度,加入符合条件的区间,用树状数组维护即可

    #include<bits/stdc++.h>
    #define LL long long
    #define uLL unsigned long long
    #define db double
    
    using namespace std;
    const int N=500+10,mod=1024523;
    int rd()
    {
    	int x=0,w=1;char ch=0;
    	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    	return x*w;
    }
    void ad(int &x,int y){x+=y,x-=x>=mod?mod:0;}
    char cc[N],ss[N];
    int n,m,f[2][N][N];
    
    int main()
    {
    	n=rd(),m=rd();
    	scanf("%s%s",cc+1,ss+1);
    	reverse(cc+1,cc+n+1),reverse(ss+1,ss+m+1);
    	int nw=1,la=0;
    	f[la][1][1]=1;
    	for(int i=1;i<=n+m;++i)
    	{
    		for(int j=1;j<=n+1;++j)
    			for(int k=1;k<=n+1;++k)
    			{
    				if(!f[la][j][k]) continue;
    				int jj=i+1-j,kk=i+1-k;
    				if(j<=n&&k<=n&&cc[j]==cc[k]) ad(f[nw][j+1][k+1],f[la][j][k]);
    				if(j<=n&&kk<=m&&cc[j]==ss[kk]) ad(f[nw][j+1][k],f[la][j][k]);
    				if(jj<=m&&k<=n&&ss[jj]==cc[k]) ad(f[nw][j][k+1],f[la][j][k]);
    				if(jj<=m&&kk<=m&&ss[jj]==ss[kk]) ad(f[nw][j][k],f[la][j][k]);
    				f[la][j][k]=0;
    			}
    		nw^=1,la^=1;
    	}
    	printf("%d
    ",f[la][n+1][n+1]);
    	return 0;
    }
    
  • 相关阅读:
    PA
    核电站问题(codevs 2618)
    [转]SQL SERVER 的排序规则
    C# 窗体控件输入框大写
    查看哪些端口被使用
    [转]Windows服务“允许服务与桌面交互”的使用和修改方法
    [转]OBJECT_ID 有哪些种类
    如何:对 Windows 窗体控件进行线程安全调用
    老人手机不要买山寨机
    VBA文本型数字变成数值
  • 原文地址:https://www.cnblogs.com/smyjr/p/11374211.html
Copyright © 2011-2022 走看看