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