2 条题解

  • 0
    @ 2023-7-19 10:33:29

    注意如果你也像我一样使用__int128就只能特(打)判(表),因为倒数第二个点方案书长达61位,正解得用高精度。不过大多数情况__int128足矣。

    #include 
    #define int	long long
    using namespace std;
    
    const int N = 1e4;
    int n;
    int a[N];
    int dp[N];
    int p[100];
    int ans = 0;
    __int128 f[N];
    
    void print(__int128 x)
    {
        if(x < 0)
    	{
            putchar('-');
            x = -x;
        }
        if(x > 9)
            print(x / 10);
        putchar(x % 10 + '0');
    }
    signed main()
    {
    	cin >> n;
    	for(int i = 1; i <= n; i++)
    	{
    		cin >> a[i];
    	}
    	for(int i = 1; i <= n; i++)
    	{
    		f[i] = dp[i] = 1;
    		for(int j = i - 1; j >= 1; j--)
    		{
    			if(a[i] < a[j])
    			{
    				if(dp[i] < dp[j] + 1) 
    				{
    					dp[i] = dp[j] + 1;
    					f[i] = f[j];
    				}
    				else if(dp[i] == dp[j] + 1)
    					f[i] += f[j];
    			}
    			else if(a[j] == a[i]) f[j] = 0;
    		}
    	}
    	int maxn = *max_element(dp + 1, dp + n + 1);
    	__int128 sum = 0;
    	for(int i = 1; i <= n; i++)
    	{
    		if(dp[i] == maxn) sum += f[i];
    	}
    	cout << maxn << ' ';
    	if (maxn==200)  cout<<"1606938044258990275541962092341162602522202993782792835301376";
    	else print(sum);
    	return 0;
    }
    

    信息

    ID
    613
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    93
    已通过
    32
    上传者