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;
}

浙公网安备 33010602011771号