标签:style blog color os strong io
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的情况 坑!!!
不过还是得更加努力 某一方面研究的更深
iOS MapKit导航及地理转码辅助类,码迷,mamicode.com
标签:style blog color os strong io
原文地址:http://blog.csdn.net/aldridge1/article/details/24595383