准备了很长时间期末考结果还是萎掉了......技术考了年级400名......
【250 IdentifyingWood】一遍找过去就好了...
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
class IdentifyingWood {
public:
string check(string s, string t) {
int ls=s.length(),lt=t.length();
string ans0="Yep, it's wood.",ans1="Nope.";
int flag=0;
for (int i=0;i<ls && flag<lt;i++) if (s[i]==t[flag]) flag++;
if (flag==lt) return ans0;
else return ans1;
}
};
【500 QuadraticLaw】求最大的非负整数t使得t^2+t<=d,二分t即可。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
class QuadraticLaw {
public:
long long times(long long t) {return t*t+t;}
long long getTime(long long d) {
long long l=0,r=1000000000,mid;
while (l<r) if (times(mid=(l+r+1)>>1)<=d) l=mid;else r=mid-1;
return l;
}
};
【1000】枚举被割的边,此时分成了两棵树,分别对这两个树求直径,加上被割去的边的长度,就得到了当前方案树直径的最大值(将割去边连接到两棵树的直径的端点上)。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
using namespace std;
const int maxn=2010;
class LonglongestPathTree {
public:
int head[maxn],next[maxn<<1],E[maxn<<1],D[maxn<<1],Ecnt;
int vis[maxn];
inline void Add_Edge(int a,int b,int len)
{
Ecnt++;next[Ecnt]=head[a];head[a]=Ecnt;E[Ecnt]=b;D[Ecnt]=len;
Ecnt++;next[Ecnt]=head[b];head[b]=Ecnt;E[Ecnt]=a;D[Ecnt]=len;
}
int Q[maxn];
long long dis[maxn];
void BFS(int stx,int va,int vb,int &maxv)
{
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
int h=0,t=0;
maxv=Q[0]=stx;
vis[stx]=1;
while (h<=t)
{
int x=Q[h++];
for (int i=head[x];i;i=next[i]) if (!vis[E[i]] && (!(x==va && E[i]==vb)) && (!(x==vb && E[i]==va)))
{
dis[E[i]]=dis[x]+D[i];
vis[E[i]]=1;
Q[++t]=E[i];
if (dis[E[i]]>dis[maxv]) maxv=E[i];
}
}
}
long long Find_diameter(int stx,int va,int vb)
{
int max1,max2;
BFS(stx,va,vb,max1);
BFS(max1,va,vb,max2);
return dis[max2];
}
long long getLength(vector <int> A, vector <int> B, vector <int> L) {
int n=A.size()+1;
long long ans=0;
Ecnt=0;
for (int i=0;i<n-1;i++) Add_Edge(A[i],B[i],L[i]);
for (int del=0;del<n-1;del++)
{
memset(vis,0,sizeof(vis));
int va,vb;
long long La=0,Lb=0;
va=A[del],vb=B[del];
La=Find_diameter(0,va,vb);
for (int i=1;i<n;i++) if (!vis[i]) {Lb=Find_diameter(i,va,vb);break;}
if (ans<La+Lb+L[del]) ans=La+Lb+L[del];
}
return ans;
}
};