D:Divide by three, multiply by two 除了这种做法还可以通过建图的方式
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[110], ans[110];
int n, flag=0;
map<ll , int >mp;
bool dfs(int f){
if(f==n+1)
return true;
if(ans[f-1]%3==0 && mp[ans[f-1]/3])
{
ans[f]=ans[f-1]/3;
mp[ans[f-1]/3]--;
if(dfs(f+1)) return true;
mp[ans[f-1]/3]++;
}
if(mp[ans[f-1]*2])
{
ans[f]=ans[f-1]*2;
mp[ans[f-1]*2]--;
if(dfs(f+1)) return true;
mp[ans[f-1]*2]++;
}
return false;
}
int main(){
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%I64d", num+i);
mp[num[i]]++;
}
for(int i=1; i<=n; i++)
{
ans[1]=num[i];
mp[num[i]]--;
if(dfs(2))
break;
mp[num[i]]++;
}
for(int i=1; i<n; i++)
printf("%I64d ", ans[i]);
printf("%I64d\n", ans[n]);
return 0;
}
E - Cyclic Components 除了搜索还可以用并查集
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int n, m;
vector<int> G[maxn];
int vis[maxn], ans=0, flag=0;
void dfs(int u, int f){
int sz=G[u].size();
if(sz!=2) flag=0;
for(int i=0; i<sz; i++){
if(G[u][i]!=f){
if(!vis[G[u][i]]){
vis[G[u][i]]=1;
dfs(G[u][i], u);
}
else if(flag && vis[G[u][i]])
ans++;
}
}
}
int main(){
scanf("%d%d", &n, &m);
int u, v;
for(int i=1; i<=m; i++)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1; i<=n; i++){
if(!vis[i]){
vis[i]=1;
flag=1;
dfs(i, -1);
}
}
printf("%d\n", ans/2);
return 0;
}
F - Consecutive Subsequence 这个题应该的解法是dp,但是自己贪心模拟做出来的,第一个代码是自己写的,第二个是看了别人思路写的dp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int n, t=0;
vector<int> seq[maxn];
map<int, int> mp;
int num[maxn], elem[maxn];
int main(){
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d", elem+i);
int mx=0, id;
for(int i=1; i<=n; i++){
if(!mp[elem[i]-1])
{
if(!mp[elem[i]])
{
seq[++t].push_back(i);
num[t]++;
if(mx<num[t]){
mx=num[t]; id=t;
}
mp[elem[i]]=t;
}
}
else{
if(!mp[elem[i]]){
seq[mp[elem[i]-1]].push_back(i);
num[mp[elem[i]-1]]++;
mp[elem[i]]=mp[elem[i]-1];
mp[elem[i]-1]=0;
if(mx<num[mp[elem[i]]]){
mx=num[mp[elem[i]]]; id=mp[elem[i]];
}
}
else{
if(num[mp[elem[i]]]<num[mp[elem[i]-1]]+1){
int tt=mp[elem[i]-1];
seq[tt].push_back(i);
num[tt]++;
mp[elem[i]]=tt;
mp[elem[i]-1]=0;
if(mx<num[tt]){
mx=num[tt]; id=tt;
}
}
}
}
}
int sz=seq[id].size();
printf("%d\n", sz);
for(int i=0; i<sz-1; i++){
printf("%d ", seq[id][i]);
}
printf("%d\n", seq[id][sz-1]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int n, mx, ed;
map<int, int> dp;
int e[maxn];
int main(){
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%d", e+i);
dp[e[i]]=max(dp[e[i]], dp[e[i]-1]+1);
if(mx<dp[e[i]]){
mx=dp[e[i]]; ed=e[i];
}
}
int st=ed-dp[ed]+1;
printf("%d\n", dp[ed]);
for(int i=1; i<=n; i++)
{
if(st==ed && e[i]==st){
printf("%d\n", i); break;
}
else if(e[i]==st)
{
printf("%d ", i);
st++;
}
}
return 0;
}