#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=310;
int n,m,K,u,v,w,pos[maxn];
LL dis[maxn][maxn],dp[maxn<<1][maxn],ans=1ll<<40;
int main()
{
mem(dis,42);mem(dp,42);
n=read();m=read();K=read();
for(int i=1;i<=n;i++)dis[i][i]=0;
while(m--)u=read(),v=read(),w=read(),dis[u][v]=min(dis[u][v],(LL)w),dis[v][u]=min(dis[v][u],(LL)w);
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
pos[0]=1;dp[0][1]=0;
for(int i=1;i<=2*K;i++)
{
pos[i]=read();
for(int j=1;j<=n;j++)
{
dp[i][j]=min(dp[i][j],dp[i-1][j]+dis[pos[i-1]][pos[i]]);
dp[i][j]=min(dp[i][j],dp[i-1][j]+dis[j][pos[i]]);
for(int k=1;k<=n;k++)
if(k!=j)
{
dp[i][k]=min(dp[i][k],dp[i-1][j]+dis[j][k]+dis[k][pos[i]]);
dp[i][k]=min(dp[i][k],dp[i-1][j]+dis[pos[i-1]][k]+min(dis[k][pos[i]],dis[j][pos[i]]));
}
}
}
for(int i=1;i<=n;i++)ans=min(ans,dp[2*K][i]);
printf("%lld\n",ans);
return 0;
}
#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=100010;
int n,a,b,c,ce=-1,v[maxn],tot;
int first[maxn];
struct Edge
{
int u,v,w,next;
Edge() {}
Edge(int _1,int _2,int _3,int _4):u(_1),v(_2),w(_3),next(_4) {}
}e[maxn<<2];
void addEdge(int a,int b,int c)
{
e[++ce]=Edge(a,b,c,first[a]);first[a]=ce;
e[++ce]=Edge(b,a,c,first[b]);first[b]=ce;
}
void Dfs(int now,int fa)
{
for(int i=first[now];i!=-1;i=e[i].next)
if(e[i].v!=fa)
v[e[i].v]=v[now]^e[i].w,Dfs(e[i].v,now);
}
struct Node{int ch[2];}t[maxn<<5];
void insert(int &x,int w,int p)
{
if(!x)x=++tot,t[x].ch[0]=t[x].ch[1]=0;
if(p==-1)return;
insert(t[x].ch[(w>>p)&1],w,p-1);
}
int Query(int x,int w,int p)
{
if(p==-1)return 0;int c=(w>>p)&1;
if(t[x].ch[c])return Query(t[x].ch[c],w,p-1);
else return Query(t[x].ch[c^1],w,p-1)^(1< v,int p)
{
if(!v.size()||p==-1)return 0;
vector d[2];int ret=0,rt;
for(int i:v)d[(i>>p)&1].push_back(i);
if(d[0].size()&&d[1].size())
{
ret=1<<(p+1);rt=tot=0;
for(int i:d[0])insert(rt,i,30);
for(int i:d[1])ret=min(ret,Query(rt,i,30));
}
return ret+Solve(d[0],p-1)+Solve(d[1],p-1);
}
int main()
{
mem(first,-1);
n=read();
for(int i=1;i A;
for(int i=1;i<=n;++i)A.push_back(v[i]);
printf("%lld\n",Solve(A,30));
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
===== D.Drop Voicing =====
=== 题意 ===
有一个n个数字的环,每次可以选择一个位置插入到另一个位置,问至少操作几次可以使得环有序
=== 题解 ===
枚举环断开的位置,就成了链上的插入排序问题,计算出LIS后剩下的就是最少移动次数
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=100010;
int n,to[maxn],size[maxn],cnt;
bool vis[maxn];
struct data
{
int l,v[maxn];
data(){l=1;memset(v,0,sizeof(v));}
data operator = (const int& t)
{
l=1;v[1]=t;
while(v[l]>9) v[l+1]+=v[l]/10,v[l]%=10,l++;
return *this;
}
data operator * (const int& t)
{
data c;c.l=l;
for(int i=1;i<=l;i++)c.v[i]=v[i]*t;
for(int i=1;i9)c.v[c.l+1]+=c.v[c.l]/10,c.v[c.l]%=10,c.l++;
return c;
}
data operator *= (const int& t)
{
*this=*this*t;
return *this;
}
data operator / (const int& t)const
{
data c;c.l=0;int f=0;
for(int i=l;i;i--)
{
f=f*10+v[i];
if(f>=t)c.l=max(c.l,i);
c.v[i]=f/t;
f%=t;
}
return c;
}
int operator % (const int& t)const
{
int f=0;
for(int i=l;i;i--)f=(f*10+v[i])%t;
return f;
}
};
int gcd(int a,int b){return b==0 ? a : gcd(b,a%b);}
void print(data s){for(int i=min(n,s.l);i;i--)printf("%d",s.v[i]);}
int main()
{
n=read();
for(int i=1;i<=n;i++)to[i]=read();
for(int i=1;i<=n;i++)
if(!vis[i])
{
int now=i;
size[++cnt]=1;
vis[now]=1;
while(!vis[to[now]])
vis[to[now]]=1,now=to[now],size[cnt]++;
}
sort(size+1,size+cnt+1);
cnt=unique(size+1,size+cnt+1)-size-1;
data ans;
ans=size[1];
int GCD;
for(int i=2;i<=cnt;i++)
{
int tmp=ans%size[i];
GCD=gcd(tmp,size[i]);
ans=ans*size[i];
ans=ans/GCD;
}
print(ans);
return 0;
}
===== I.Hard Math Problem =====
=== 题意 ===
你需要在一个无限大的平面网格上放置 G ,H ,E 三种物品,其中 H 的四周必须有至少一个 G 和 E ,问 H 的最大占比是多少
=== 题解 ===
假设 每个 H 的四周都只有一个 G 和 E ,那么一个 G 和 E 最多可以满足四个 H ,所以占比就是 4/6
#include
#include
#include
#include
#define ll long long
using namespace std;
int read()
{
int k=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) k=k*10+c-'0';return k*f;
}
int main()
{
puts("0.666667");
return 0;
}
#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef unsigned long long ULL;
typedef pair PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=4010;
string a,s[maxn],prt[maxn];
int n,Case,tot,id[maxn],list1[maxn],list2[maxn],l1,l2,dp[maxn][maxn][3],len;//[0/1/2]表示是否当前在分支中(是否放下了endif)
ULL h[maxn];
bool cmp(int a,int b){return h[list1[a]]==h[list2[b]];}
ULL Hash(string str)
{
ULL res=0;
for(int i=0;i')Case=0;
else ++n,s[n]=a,id[n]=Case;
}
for(int i=1;i<=n;i++)h[i]=Hash(s[i]);
for(int i=1;i<=n;i++)
{
if(id[i]!=2)list1[++l1]=i;
if(id[i]!=1)list2[++l2]=i;
}
for(int i=0;i<=l1;i++)for(int j=0;j<=l2;j++)dp[i][j][0]=dp[i][j][1]=dp[i][j][2]=maxn;
dp[0][0][0]=0;
for(int i=0;i<=l1;i++)
for(int j=0;j<=l2;j++)
{
if(i && j && cmp(i,j))dp[i][j][0]=min(dp[i-1][j-1][0]+1,min(dp[i-1][j-1][1]+2,dp[i-1][j-1][2]+2));
if(i)dp[i][j][1]=min(dp[i-1][j][1]+1,dp[i-1][j][0]+2);
if(j)dp[i][j][2]=min(dp[i][j-1][2]+1,min(dp[i][j-1][1]+2,dp[i][j-1][0]+2));
dp[i][j][0]=min(dp[i][j][0],min(dp[i][j][1]+1,dp[i][j][2]+1));
}
dfs(l1,l2,0);
for(int i=len;i;i--)cout<