D
利用visit记录访问的顺序
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
long long a[101];
int visit[101];
int num;
int count=0,flag=0;
void dfs(int k)
{
visit[k]=count;
if(count==num-1)
{
flag=1;
return;
}
count++;
for(int i=0; i<num; i++)
{
if(i!=k)
{
if(a[i]==2*a[k]&&!visit[i])
{
dfs(i);
if(flag)
break;
}
else if(a[k]%3==0&&a[i]==a[k]/3&&!visit[i])
{
dfs(i);
if(flag)
break;
}
}
}
}
int main()
{
cin>>num;
for(int i=0; i<num; i++)
{
cin>>a[i];
}
flag=0;
count=0;
for(int i=0; i<num; i++)
{
memset(visit,0,sizeof(visit));
count=0;
dfs(i);
if(flag)
{
break;
}
}
long long b[105];
for(int i=0;i<num;i++)
{
b[visit[i]]=a[i];
}
for(int i=0;i<num;i++)
{
printf("%I64d ",b[i]);
}
cout<<endl;
return 0;
}
F
转自https://blog.youkuaiyun.com/riba2534/article/details/80221379
1. 用自己的LIS 模板dp tle
2. map 竟然可以存储 10^9 因为是范围为int的键 !!!!!!
#include <cstdio>
#include <cstring>
#include <cctype>
#include <stdlib.h>
#include <string>
#include <map>
#include <iostream>
#include <sstream>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#include<list>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define inf 0x3f3f3f3f
#define x1 hpc_x1
#define y1 hpc_y1
typedef long long ll;
const int N=2e5+20;
int a[N];
map<int,int>mp;
int main()
{
int n,x;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&x);
a[i]=x;
mp[x]=mp[x-1]+1;
}
int pos,maxx=0;
for(auto i:mp)
{
if(i.second>maxx)
{
maxx=i.second;
pos=i.first;
}
}
pos=pos-maxx+1;
printf("%d\n",maxx);
for(int i=1; i<=n; i++)
{
if(a[i]==pos)
{
printf("%d ",i);
pos++;
}
}
puts("");
return 0;
}