首页 > 代码库 > iOS MapKit导航及地理转码辅助类

iOS MapKit导航及地理转码辅助类

Problem 2167 大王叫我来巡山呐

做的的第二题 呵呵

Problem 2168 防守阵地 I

做的第一题

打了下草稿 马上切了它

假设当前x=(ai)*1+(ai+1)*2+(ai+2)*3+‘‘‘‘+(aj)*m

下一次是(ai+1)*1+(ai+2)*2+(ai+3)*3+‘‘‘‘+(aj+1)*m = (ai)*1+(ai+1)*2+(ai+2)*3+‘‘‘‘+(aj)*m+(aj+1)*(m+1) -(ai+(ai+1)+(ai+2)+‘‘‘+(aj)+(aj+1))

紫色的这一段是连续的 直接前缀和预处理

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000010;
int n, m;
int a[maxn];
int b[maxn];
int main()
{
	while(scanf("%d %d", &n, &m) != EOF)
	{
		__int64 ans = 0;
		for(int i = 1; i <= n; i++)
		{
			scanf("%d", &a[i]);
			b[i] = b[i-1] + a[i];
			if(i <= m)
				ans += i*a[i];
		}
		__int64 x = ans;
		for(int i = m+1; i <= n; i++)
		{
			
			__int64 temp = x + (m+1) * a[i];
			temp -= b[i] - b[i-m-1];
			x = temp;
			ans = max(ans, temp);
		}
		printf("%I64d\n", ans);
	}
	return 0;
}

 

Problem 2169 shadow

做的第三题

开始想直接广搜了 不过被消灭的军队是不能在被消灭一次的 开始不知道怎么处理 后来想了下

如果某些军队经过最短路的上的点是同一点 那么接下来他们走的路应该是一样的 所以直接contine

另外开了个数组sum sum[u]代表到u这个点为止 包括之前的消灭的军队总数
 

#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 100010;
int d[maxn];
int sum[maxn];
int a[maxn];
int b[maxn];
int vis[maxn];
vector <int> G[maxn];
int n, m;

void BFS()
{
	queue <int> Q;
	for(int i = 0; i <= n; i++)
		d[i] = 999999999;
	memset(sum, 0, sizeof(sum));
	for(int i = 1; i <= m; i++)
	{
		Q.push(b[i]);
		d[b[i]] = 0;
		vis[b[i]] = 1;
	}
	while(!Q.empty())
	{
		int u = Q.front(); Q.pop();
		for(int i = 0; i < G[u].size(); i++)
		{
			int v = G[u][i];
			
			if(vis[v])
			{
				sum[v] += sum[u];
				sum[u] = 0;
				continue;
			}
			vis[v] = true;
			if(d[v] > d[u] + 1)
			{
				sum[v] += sum[u] + a[v];
				sum[u] = 0;
				d[v] = d[u] + 1;
				Q.push(v);
			}
		}		
	}
}
int main()
{
	while(scanf("%d %d", &n, &m) != EOF)
	{
		for(int i = 0; i <= n; i++)
		{
			G[i].clear();
		}
		for(int i = 1; i <= n; i++)
		{
			scanf("%d", &a[i]);
		}
		for(int i = 1; i <= m; i++)
		{
			scanf("%d", &b[i]);
		}
		for(int i = 1; i < n; i++)
		{
			int u, v;
			scanf("%d %d", &u, &v);
			G[u].push_back(v);
			G[v].push_back(u);
		}
		memset(vis, 0, sizeof(vis));
		BFS();
		int ans = 0;
		for(int i = 1; i <= n; i++)
			ans += sum[i];
		printf("%d\n", ans);
	}
	return 0;
}

Problem 2170 花生的序列

由于聊聊天 看看动漫没时间了 本来想看这题的 有空再想想

Problem 2171 防守阵地 II

做的第四题

看了下题目 尼玛线段树成段更新!!!! 直接线段树搞过去 代码太恶心 不过真的是水题啊

#include <stdio.h>
#define MAX 100010
struct node
{
	int l;
	int r;
	int sum;
	int add;
}a[MAX*4];

void build(int l,int r,int rt)
{
	a[rt].l = l;
	a[rt].r = r;
	a[rt].add = 0;
	if(l == r)
	{
		scanf("%d", &a[rt].sum);
		return;
	}
	int m = (l + r) >> 1;
	build(l,m,rt<<1);
	build(m+1,r,rt<<1|1);
	a[rt].sum = a[rt<<1].sum + a[rt<<1|1].sum;
}

void update(int l,int r,int rt,int add)
{
	if(a[rt].l == l && a[rt].r == r)
	{
		a[rt].add += add;
		a[rt].sum += add * (r-l+1);
		return;
	}
	if(a[rt].l == a[rt].r)
		return;
	if(a[rt].add)
	{
		int k = a[rt].r - a[rt].l + 1;
		a[rt<<1].add += a[rt].add;
		a[rt<<1|1].add += a[rt].add;
		a[rt<<1].sum += a[rt].add*(k - (k>>1));
		a[rt<<1|1].sum += a[rt].add*(k>>1);
		a[rt].add = 0;
	}
	int m = (a[rt].l + a[rt].r) >> 1;
	if(r <= m)
		update(l,r,rt<<1,add);
	else if(l > m)
		update(l,r,rt<<1|1,add);
	else
	{
		update(l,m,rt<<1,add);
		update(m+1,r,rt<<1|1,add);
	}
	a[rt].sum = a[rt<<1].sum + a[rt<<1|1].sum;
}
int query(int l, int r, int rt)
{
	if(a[rt].l == l && a[rt].r == r)
	{
		return a[rt].sum;
	}
	if(a[rt].l == a[rt].r)
		return 0;
	
	if(a[rt].add)
	{
		int k = a[rt].r - a[rt].l + 1;
		a[rt<<1].add += a[rt].add;
		a[rt<<1|1].add += a[rt].add;
		a[rt<<1].sum += a[rt].add*(k - (k>>1));
		a[rt<<1|1].sum += a[rt].add*(k>>1);
		a[rt].add = 0;
	}
	int m = (a[rt].l + a[rt].r) >> 1;
	int res = 0;
	if(r <= m)
		res = query(l,r,rt<<1);
	else if(l > m)
		res = query(l,r,rt<<1|1);
	else
	{
		res += query(l,m,rt<<1);
		res += query(m+1,r,rt<<1|1);
	}
	a[rt].sum = a[rt<<1].sum + a[rt<<1|1].sum;
	return res;
}
	
int main()
{
	int n, m, q;
	while(scanf("%d %d %d",&n, &m, &q) != EOF)
	{		
		build(1, n, 1);
		while(q--)
		{
			int x;
			scanf("%d", &x);
			printf("%d\n", query(x, x+m-1, 1));
			update(x, x+m-1, 1, -1);
		}
	}	
	return 0;
}


 

Problem 2172 巡了南山我巡北山

没看呢

Problem 2173 Nostop

做的第五题

第一感觉是floyd+矩阵快速幂 10亿次floyd肯定不行嘛 矩阵快速幂加速啊

要多做做经典题目啊!!!POJ 3613 这种经典题目很多啊 我们要学经典题目 然后举一反三

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const __int64 fd = 1;
const __int64 INF = fd<<55;
const int maxn = 55;
struct Mat
{
    __int64 a[maxn][maxn];
};
Mat A, B, C, D;
int n, m;

Mat floyd(Mat x, Mat y)
{
	Mat z;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++)
		{
			z.a[i][j] = INF;
			
		}
	for(int k = 1; k <= n; k++)
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++)
		 		z.a[i][j] = min(z.a[i][j], x.a[i][k] + y.a[k][j]);
	return z;
}
/*Mat get(Mat x, Mat y)
{
    Mat z;
    memset(z.a, 0, sizeof(z.a));
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            for(int k = 1; k <= n; k++)
            {
                z.a[i][j] += x.a[i][k]*y.a[k][j];
                //z.a[i][j] %= mod;
            }
    return z;
}*/
void Mat_pow(int x)
{
    while(x)
    {
        if(x&1)
            B = floyd(B, A);
        A = floyd(A, A);
        x >>= 1;
    }
}
int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		int x;
		scanf("%d %d %d", &n, &m, &x);

		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++)
			{
				A.a[i][j] = B.a[i][j] = INF;
				if(i == j)
					B.a[i][j] = 0;
			}
		while(m--)
		{
			int u, v;
			__int64 w;
			scanf("%d %d %I64d", &u, &v, &w);
			if(A.a[u][v] > w)
				A.a[u][v] = w;
		}
		Mat_pow(x);
		if(B.a[1][n] == INF)
			puts("-1");
		else
			printf("%I64d\n", B.a[1][n]);
	}
	return 0;
}


 

Problem 2174 卷福的难题

没看呢

 

 

最后总结一下 前面4题都1A的 最后一题忘记处理-1的情况 坑!!!

不过还是得更加努力 某一方面研究的更深