要稳啊,t1,t3贼水
一个模拟,一个两次最短路(反着各点到1,正着1到各点),SPFA跑一遍就完事
//XD Murs XD// #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define oo 0x3f3f3f3f #define F(i,s,e) for(int i=s;i<=e;i++) #define D(i,e,s) for(int i=e;i>=s;i--) using namespace std; const int maxn=110000; int n,m,q,head[maxn],rest[maxn],to[maxn],END[maxn],x[maxn],y[maxn],z[maxn],len; int first[maxn],second[maxn]; bool vis[maxn]; struct queue//手工stl_XD { int head,tail; int num[100100]; queue() {head=0; tail=0;} inline void push(int o) {num[tail++]=o;} inline int pop() {return num[head++];} inline bool empty() {return head>=tail;} inline int top() {return num[head];} }kept; void push(int u,int v,int w) { len++; to[len]=v; END[len]=w; rest[len]=head[u]; head[u]=len; } void resetf() { len=0; memset(head,0,sizeof(head)); memset(first,oo,sizeof(first)); memset(vis,0,sizeof(vis)); } int quest(int a,int b) { //printf("f %d s %d\n",first[a],second[b]); if(first[a]==oo||second[b]==oo) return -1; return first[a]+second[b]; } void SPFA() { vis[1]=1; kept.push(vis[1]); first[1]=0; while(!kept.empty()) { int u=kept.top(); kept.pop(); vis[u]=0; for(int i=head[u];i;i = rest[i]) { int v=to[i]; if(first[v]>first[u]+END[i]) { first[v]=first[u]+END[i]; if(!vis[v]) { vis[v]=1; kept.push(v); } } } } } void slove() { resetf(); F(i,1,m) push(x[i],y[i],z[i]); SPFA(); F(i,1,n) second[i]=first[i]; resetf(); F(i,1,m) push(y[i],x[i],z[i]); SPFA(); } int main() { freopen("production.in","r",stdin); freopen("production.out","w",stdout); scanf("%d%d",&n,&m); F(i,1,m) scanf("%d%d%d",&x[i],&y[i],&z[i]); slove(); scanf("%d",&q); F(i,1,q) { int a,b; scanf("%d%d",&a,&b); printf("%d\n",quest(a,b)); } return 0; }
T1 RE了,原因是我开的整数组,分为两半分别处理,只有指向2*n大小的空间,但是在运行时会算到最大4*n的地址,然后指针指向就错误了,最后re.XD
#include<cstdio> #include<cstring> #include<algorithm> #define F(i,s,e) for(int i=s;i<=e;i++) #define D(i,e,s) for(int i=e;i>=s;i--) using namespace std; const int maxn=100100; int n,l1[maxn],l2[maxn]; int main() { freopen("expedition.in","r",stdin); freopen("expedition.out","w",stdout); scanf("%d",&n); int *l1=new int[2*n+1]; int *l2=new int[n+1]; int ans=0; F(i,1,2*n) scanf("%d",&l1[i]); F(i,1,n) l2[i]=0; F(i,1,n) l2[l1[2*i]]+=l1[2*i-1]; F(i,1,n) ans+=l2[i]*l2[i]; printf("%d\n",ans); return 0; }
T2 高精度乘法,比较麻烦,而且一般只用到"+","-",就没有敲。但是暴力也是有10分的。
浙公网安备 33010602011771号