百度地图的实时路况

点数100的无向图,d(u,v,w)表示从 u 号点出发,严格不经过 v 号点,最终到达 w 号点的最短路径长度
求∑​1≤x,y,z≤n,x≠y,y≠zd(x,y,z)
cdq

#include<bits/stdc++.h>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
#define
int f[30][maxn][maxn];
int n;
void update(int dep,int l,int r) {
Fork(k,l,r)
For(i,n)
For(j,n)
f[dep][i][j]=min(f[dep][i][j],f[dep][i][k]+f[dep][k][j]);
}
ll ans=0;
void cdq(int dep, int l, int r) {
if (l==r) {
For(i,n) For(j,n) if (i!=l&&j!=l) ans+=(f[dep][i][j] == INF)? (-1) : (ll)(f[dep][i][j]);
return ;
}
int m=(l+r)>>1;
memcpy(f[dep+1],f[dep],sizeof(f[dep]));
update(dep+1,m+1,r);
cdq(dep+1,l,m);
memcpy(f[dep+1],f[dep],sizeof(f[dep]));
update(dep+1,l,m);
cdq(dep+1,m+1,r);
}
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
cin>>n;
For(i,n) For(j,n) {
cin>>f[0][i][j];
if (f[0][i][j]==-1) f[0][i][j]=INF;
if (i==j) f[0][i][i]=0;
}
ans=0;
cdq(0,1,n);
cout<<ans<<endl;

return 0;
}

联想专卖店大促销

枚举1个,推导另外2个
强行3分过

#include<bits/stdc++.h>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int ans;
int check(int a,int b,int c) {
if (b>a) swap(a,b);
if (c>a) swap(a,c);
if (c>b) swap(b,c);
int t= min(b+c+1,a)+b+c;
ans=max(ans,t);
return t;

}
int a,b,c;
int check2(int i) {
int a2=a-i*2,b2=b-i,c2=min(c,min(a2,b2));
int ans=0;
int l=0,r=min(a2,b2/2);
while(r-l>=3) {
int m1=l+(r-l)/3;
int m2=r-(r-l)/3;
int s1=check(i,m1,min(c,min(a2-m1,b2-2*m1)));
int s2=check(i,m2,min(c,min(a2-m2,b2-2*m2)));
if (s1>=s2) r=m2;else l=m1;
}
Fork(m1,l,r) ans=max(ans,check(i,m1,min(c,min(a2-m1,b2-2*m1))));
return ans;
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("data2.out","w",stdout);

int T=read();
while(T--) {
ans=0;
scanf("%d%d%d",&a,&b,&c);
if (a<b) swap(a,b);
c=min(c,a); c=min(c,b);
//A>=B>=C
int l=0,r=a/2;
while(r-l>=3) {
int m1=l+(r-l)/3;
int m2=r-(r-l)/3;
int s1=check2(m1);
int s2=check2(m2);
if (s1>=s2) r=m2;else l=m1;
}
Fork(m1,l,r) ans=max(ans,check2(m1));

printf("%d\n",ans);


}

return 0;
}

微信钱包付款

f(x)为数字 x 的各位数字之和,例如 f(123)=1+2+3。现在三个人想找到一种分摊方案,使得 f(a)=f(b)=f(c)
(0≤x≤10^10000)

import java.io.*;
import java.util.*;
import java.math.*;

public class Main
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);

BigInteger t = new BigInteger("3");
while(cin.hasNextBigInteger())
{
BigInteger n = cin.nextBigInteger();
if (n.mod(t).compareTo(BigInteger.ZERO)==0) {
n = n.divide(t);
System.out.println(n+ " "+ n+ " " + n);
}
else {
System.out.println("-1");
}

}
}
}

菜鸟物流的运输网络

n(<=100)点m边无向图中输出任意一条从s到mid再到t的路径,不经过重复点
有人暴搜过了,我还没试出来
官方:以mid为源,s,t为汇,最短路。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<vector>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int nex[MAXN];
class Cost_Flow
{
public:
int n,s,t;
int q[MAXM];
int edge[MAXM],next[MAXM],pre[MAXN],weight[MAXM],size;
int cost[MAXM],cp[MAXM];
void addedge(int u,int v,int w,int c)
{
edge[++size]=v;
weight[size]=cp[size]=w;
cost[size]=c;
next[size]=pre[u];
pre[u]=size;
}
void addedge2(int u,int v,int w,int c){addedge(u,v,w,c),addedge(v,u,0,-c);}
bool b[MAXN];
int d[MAXN];
int pr[MAXN],ed[MAXN];
bool SPFA(int s,int t)
{
For(i,n) d[i]=INF,b[i]=0;
d[q[1]=s]=0;b[s]=1;
int head=1,tail=1;
while (head<=tail)
{
int now=q[head++];
Forp(now)
{
int &v=edge[p];
if (weight[p]&&d[now]+cost[p]<d[v])
{
d[v]=d[now]+cost[p];
if (!b[v]) b[v]=1,q[++tail]=v;
pr[v]=now,ed[v]=p;
}
}
b[now]=0;
}
return d[t]!=INF;
}
int totcost;

int CostFlow(int s,int t)
{
int maxflow=0;
while (SPFA(s,t))
{
int flow=INF;
for(int x=t;x^s;x=pr[x]) {
flow=min(flow,weight[ed[x]]);
}
totcost+=flow*d[t];
maxflow+=flow;
for(int x=t;x^s;x=pr[x]) weight[ed[x]]-=flow,weight[ed[x]^1]+=flow;
}
return totcost;
}

void dfs(int x,int fa,int n) {
if (x>n) cout<<x-n;
Forp(x) {
int v=edge[p];
if (v==fa) continue;
if (v>2*n) continue;
if (weight[p]^cp[p]) {
if (x>n) cout<<' ';
dfs(v,x,n);break;
}
}

}
void mem(int n,int t)
{
(*this).n=n;
size=1;
totcost=0;
MEM(pre) MEM(next)
}
}S1;
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int n,m,s,mid,t;
int main()
{
// freopen("F.in","r",stdin);
// freopen(".out","w",stdout);

int T2=read();
while(T2--) {
n=read();m=read();
int S=2*n+1,T=S+1;
S1.mem(T,T);

cin>>s>>t>>mid;
Rep(i,m) {
int u,v;
scanf("%d%d",&u,&v);
if (u==v) continue;
S1.addedge2(u+n,v,1,0);
S1.addedge2(v+n,u,1,0);
}
For(i,n) S1.addedge2(i,i+n,1,0);
S1.addedge2(S,mid+n,2,0);
S1.addedge2(s+n,T,1,0);
S1.addedge2(t+n,T,1,0);
S1.CostFlow(S,T);
S1.dfs(s+n,0,n);
puts("");
}

return 0;
}