cf-#189-div 2

A题:

从前往后暴搜就OK;

B题:

每次询问的时候都bfs一次

C题:

异或运算,从后往前运算。

-------------分割线---------------------

D题:对于第K个人来说,找是谁杀了他,然后dp[k]储存杀他需要的步数。

 

#include<stdio.h>

#include<string.h>

#include<iostream>

using namespace std;

int main()

{

	int n;

	int a[100001];

	int pre[100001];

	int dp[100001];

	int i,j,tmp;

	while(~scanf("%d",&n))

	{

		for(i=1;i<=n;i++)scanf("%d",&a[i]);

		memset(pre,0,sizeof(pre));

		memset(dp,0,sizeof(dp));

		for(i=1;i<=n;i++)

		{

			tmp=0;

			for(j=i-1;j;j=pre[j])

			{

				if(a[i]<a[j])

				{

					pre[i]=j;

					dp[i]=tmp+1;

					break;

				}

				tmp=max(tmp,dp[j]);

			}

		}

		int ans;

		ans=0;

		for(i=1;i<=n;i++)ans=max(ans,dp[i]);

		cout<<ans<<endl;

	}

	return 0;

}


 


 

你可能感兴趣的:(div)