BZOJ5123: [Lydsy1712月赛]线段树的匹配 记忆化搜索

思路十分显然,但是结构体的写法要注意.   

定义重载运算符可以有效地减小代码量.  

因为一个小错误调了半天,自闭了. 

code: 

#include <map> 
#include <cstdio>   
#define mod 998244353 
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;  
typedef long long ll;  
struct data 
{
    ll x,y;   
    data() {} 
    data(ll a,ll b) { x=a,y=b; }    
    data operator+(const data &a) const {    
        return data(x+a.x,y*a.y%mod); 
    }    
    data operator*(const data &a) const 
    {    
        if(x>a.x) return *this; 
        if(x<a.x) return a;   
        return data(x,(y+a.y)%mod); 
    }
};     
struct node 
{
    data f,g;
    node() {}    
    node(data a,data b) { f=a,g=b; }                                       
};    
map<ll,node>dp;   
node dfs(ll n) 
{ 
    if(dp.find(n)!=dp.end()) return dp[n];              
    node L=dfs(n-(n>>1)),R=dfs(n>>1);               
    return dp[n]=node((L.g+R.f+data(1,1))*(L.f+R.g+data(1,1))*(L.g+R.g+data(1,2)),(L.g+R.f)*(L.f+R.f)*(L.f+R.g)*(L.g+R.g));        
}
int main() 
{   
    // setIO("input");
    dp[1]=node(data(-100,0),data(0,1));     
    ll n; 
    scanf("%lld",&n);   
    node tmp=dfs(n);   
    data ans=(tmp.f*tmp.g);  
    printf("%lld %lld\n",ans.x,ans.y);   
    return 0; 
}

  

posted @ 2020-06-01 22:01  EM-LGH  阅读(193)  评论(0编辑  收藏  举报