蒟蒻求助,全WA
查看原帖
蒟蒻求助,全WA
397382
玄君楼主2023/3/23 22:13

用的是nlogn的动态规划,样例点过了,为什么全wa呢......

代码如下

#include<bits/stdc++.h>
using namespace std;
int a[1000001];
int ans[1000010];
int ans2[1000010];
int n;
int find(int key);
int find2(int key);
int main()
{
	int n;
	cin >> n;
	ans[0] = 1e9;
	for (int i = 1;i <= n;i++)
	    {
	    	cin >> a[i];
		}
	int k = 1;
	
	for (int i = 1;i <= n;i++)
	    {
	    	if (ans[k - 1] > a[i])
	    	    {
	    	    	ans[k] = a[i];
	    	    	k++;
				}
			else
			    {
			    	ans[find(a[i])] = a[i];
				}
		}
	int w1 = k + 1;
	ans2[0] = -1;
	k = 1;
	for (int i = 1;i <= n;i++)
	    {
	    	if (ans2[k - 1] < a[i])
	    	    {
	    	    	ans2[k] = a[i];
	    	    	k++;
				}
			else
			    {
			    	ans2[find(a[i])] = a[i];
				}
		}
	int w2 = k;
	cout << w1 << endl << w2;
	return 0;
}
int find(int key)
    {
    	int l = 1,r = n;
		int id = -1;
		while (l < r)
		    {
		    	if (ans[(l + r) / 2 - 1] > key && ans[(l + r) / 2] < key)
		    	    {
		    	    	return (l + r) / 2;
					}
		    	if (ans[(l + r) / 2] == key)
		    	    {
		    	    	id = (l + r) / 2;
		    	    	break;
					}
		    	if (ans[(l + r) / 2] < key)
		    	    l = (l + r) / 2;
				if (ans[(l + r) / 2] > key)
				    r = (l + r) / 2;
			}
		return id;
	}
int find2(int key)
    {
    	int l = 1,r = n;
		int id = -1;
		while (l < r)
		    {
		    	if (ans2[(l + r) / 2 - 1] < key && ans[(l + r) / 2] > key)
		    	    {
		    	    	return (l + r) / 2;
					}
		    	if (ans2[(l + r) / 2] == key)
		    	    {
		    	    	id = (l + r) / 2;
		    	    	break;
					}
		    	if (ans2[(l + r) / 2] < key)
		    	    l = (l + r) / 2;
				if (ans2[(l + r) / 2] > key)
				    r = (l + r) / 2;
			}
		return id;
	}

谢谢

2023/3/23 22:13
加载中...