SRM 635 DIV2

    准备了很长时间期末考结果还是萎掉了......技术考了年级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;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值