最短路+拆点 A As long as Binbin loves Sangsang

题意:从1走到n,每次都是LOVE,问到n时路径是连续多个"LOVE"的最短距离.秀恩爱不想吐槽.

分析:在普通的最短路上有寻路的限制,把一个点看成4个点,表示通过某一个字符到该点的最短距离.注意自环的处理,还有距离会爆int。

#include <bits/stdc++.h>

const int N = 1314 + 5;
const int M = 13520 + 5;
const long long INF = 200000000000LL;
struct Edge {
int v, w, ch, nex;
};
Edge edge[M<<1];
int head[N];
int n, m, etot; void init_edge() {
etot = 0;
memset (head, -1, sizeof (head));
} void add_edge(int u, int v, int w, char ch) {
edge[etot].v = v; edge[etot].w = w;
edge[etot].nex = head[u];
if (ch == 'L') {
edge[etot].ch = 0;
} else if (ch == 'O') {
edge[etot].ch = 1;
} else if (ch == 'V') {
edge[etot].ch = 2;
} else if (ch == 'E') {
edge[etot].ch = 3;
}
head[u] = etot++;
} struct Node {
int u, id;
};
long long dis[N][4];
int cnt[N][4];
bool vis[N][4]; void SPFA(int s) {
for (int i=1; i<=n; ++i) {
for (int j=0; j<4; ++j) {
vis[i][j] = false;
dis[i][j] = INF;
cnt[i][j] = 0;
}
}
dis[s][3] = 0; vis[s][3] = true;
std::queue<Node> que;
que.push ((Node) {s, 3});
while (!que.empty ()) {
Node now = que.front (); que.pop ();
int u = now.u, id = now.id;
vis[u][id] = false;
for (int i=head[u]; ~i; i=edge[i].nex) {
Edge &e = edge[i];
if (e.ch != (id + 1) % 4) {
continue;
}
if (dis[e.v][e.ch] > dis[u][id] + e.w || dis[e.v][e.ch] == 0) {
dis[e.v][e.ch] = dis[u][id] + e.w;
cnt[e.v][e.ch] = cnt[u][id];
if (e.ch == 3) {
cnt[e.v][e.ch]++;
}
if (!vis[e.v][e.ch]) {
vis[e.v][e.ch] = true;
que.push ((Node) {e.v, e.ch});
}
} else if ((dis[e.v][e.ch] == dis[u][id] + e.w || dis[e.v][e.ch] == 0) && cnt[e.v][e.ch] <= cnt[u][id]) {
cnt[e.v][e.ch] = cnt[u][id];
if (e.ch == 3) {
cnt[e.v][e.ch]++;
}
if (!vis[e.v][e.ch]) {
vis[e.v][e.ch] = true;
que.push ((Node) {e.v, e.ch});
}
}
}
}
} int main() {
int T;
scanf ("%d", &T);
for (int cas=1; cas<=T; ++cas) {
init_edge ();
scanf ("%d%d", &n, &m);
char ch[2];
for (int i=0; i<m; ++i) {
int u, v, l;
scanf ("%d%d%d%s", &u, &v, &l, ch);
add_edge (u, v, l, ch[0]);
add_edge (v, u, l, ch[0]);
}
SPFA (1);
if (dis[n][3] == INF || cnt[n][3] == 0) {
printf ("Case %d: Binbin you disappoint Sangsang again, damn it!\n", cas);
} else {
printf ("Case %d: Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %d LOVE strings at last.\n", cas, dis[n][3], cnt[n][3]);
}
}
return 0;
}

DP+优化 C Dragon Ball

题意:m个时间,每个时间去取一个龙珠,代价是距离|x-ball[i].pos|,此时人移动到龙珠的位置,还有该龙珠的代价ball[i].cost,问最小代价。

分析:,另一种情况同理,先对每个时间的位置排序,求i-1时间前缀最小的转移就好了。

#include <bits/stdc++.h>

const int N = 50 + 5;
const int M = 1000 + 5;
const int INF = 0x3f3f3f3f;
struct Ball {
int pos, cost;
bool operator < (const Ball &rhs) const {
return pos < rhs.pos;
}
};
Ball ball[N][M];
int dp[N][M];
int m, n, x; int main() {
int T;
scanf ("%d", &T);
while (T--) {
scanf ("%d%d%d", &m, &n, &x);
for (int i=1; i<=m; ++i) {
for (int j=1; j<=n; ++j) {
scanf ("%d", &ball[i][j].pos);
}
}
for (int i=1; i<=m; ++i) {
for (int j=1; j<=n; ++j) {
scanf ("%d", &ball[i][j].cost);
}
std::sort (ball[i]+1, ball[i]+1+n);
}
memset (dp, INF, sizeof (dp));
for (int i=1; i<=n; ++i) {
dp[1][i] = abs (ball[1][i].pos - x) + ball[1][i].cost;
}
for (int i=2; i<=m; ++i) {
int k = 1, mn = INF;
for (int j=1; j<=n; ++j) {
for (; k<=n && ball[i-1][k].pos <= ball[i][j].pos; ++k) {
mn = std::min (mn, dp[i-1][k] - ball[i-1][k].pos);
}
dp[i][j] = mn + ball[i][j].pos + ball[i][j].cost;
}
k = n; mn = INF;
for (int j=n; j>=1; --j) {
for (; k>=1 && ball[i-1][k].pos > ball[i][j].pos; --k) {
mn = std::min (mn, dp[i-1][k] + ball[i-1][k].pos);
}
dp[i][j] = std::min (dp[i][j], mn - ball[i][j].pos + ball[i][j].cost);
}
}
int ans = INF;
for (int i=1; i<=n; ++i) {
ans = std::min (ans, dp[m][i]);
}
printf ("%d\n", ans);
}
return 0;
}

模拟 E Matrix operation

读懂题,照着模拟

#include <bits/stdc++.h>

int mat[4][4] = {2, 3, 1, 1,
1, 2, 3, 1,
1, 1, 2, 3,
3, 1, 1, 2};
int a[4][4], tmp[4]; void run() {
int ans[4][4];
for (int i=0; i<4; ++i) {
for (int j=0; j<4; ++j) {
for (int k=0; k<4; ++k) {
int t;
if (mat[i][k] == 2) {
t = a[k][j] << 1;
if (t > 0xFF) {
t ^= 0x1B;
}
if (t > 0xFF) {
t %= (0xFF + 1);
}
} else if (mat[i][k] == 3) {
t = a[k][j] << 1;
if (t > 0xFF) {
t ^= 0x1B;
}
t ^= a[k][j];
if (t > 0xFF) {
t %= (0xFF + 1);
}
} else {
t = a[k][j];
}
tmp[k] = t;
}
int t = tmp[0];
for (int i=1; i<4; ++i) {
t ^= tmp[i];
}
ans[i][j] = t;
}
}
for (int i=0; i<4; ++i) {
for (int j=0; j<3; ++j) {
printf ("%02X ", ans[i][j]);
}
printf ("%02X\n", ans[i][3]);
}
} int main() {
int T;
scanf ("%d", &T);
while (T--) {
for (int i=0; i<4; ++i) {
for (int j=0; j<4; ++j) {
scanf ("%X", &a[i][j]);
}
}
run ();
if (T) {
puts ("");
}
}
return 0;
}

数学+快速幂 F Palindrome graph

题意:一个n*n的图填充颜色使得图如何反转或旋转都不会变化。

分析:考虑到是中心对称的,只要考虑1/8的图(三角形)就行了,假设总和x个。填充过的颜色的位置转移到1/8的图中(假设y个),其他的地方能涂k种颜色,答案是k^(x-y)。

#include <bits/stdc++.h>

const int MOD = 100000007;

int pow_mod(int x, int n) {
int ret = 1;
while (n) {
if (n & 1) {
ret = (long long) ret * x % MOD;
}
x = (long long) x * x % MOD;
n >>= 1;
}
return ret;
} const int N = 10005; bool vis[N/2][N/2];
int n, m, k; int main() {
while (scanf ("%d%d%d", &n, &m, &k) == 3) {
memset (vis, false, sizeof (vis));
int mid = n / 2;
if (n & 1) {
mid++;
}
for (int i=0; i<m; ++i) {
int x, y;
scanf ("%d%d", &x, &y);
x++; y++;
if (x > mid) {
x = n + 1 - x;
}
if (y > mid) {
y = n + 1 - y;
}
if (x < y) {
std::swap (x, y);
}
vis[x][y] = true;
}
int c = 0;
for (int i=1; i<=mid; ++i) {
for (int j=1; j<=i; ++j) {
if (!vis[i][j]) {
c++;
}
}
}
printf ("%d\n", pow_mod (k, c));
}
return 0;
}

DFS序+线段树 G Successor

题意:给了n个人的上下级关系,每个人有能力和忠诚度,问如果上级被炒了,下属里能力比他强,忠诚度最高的是谁。

分析:其实就是给了一棵树,DFS序转换为线性序列,每一个上级管辖一段区间,按照能力从大到小排序,每次插入能力比上级强的,相同的也同时插入,询问忠诚度最高的对应人的id即是答案。

#include <bits/stdc++.h>

const int N = 5e4 + 5;
struct Person {
int sup, loy, ab, id;
bool operator < (const Person &rhs) const {
return ab > rhs.ab;
}
}p[N];
int n, m;
int left[N], right[N];
std::map<int, int> ID;
std::vector<int> edge[N];
int tot; #define lson l, mid, o << 1
#define rson mid + 1, r, o << 1 | 1 int mx[(N<<1)<<2];
void push_up(int o) {
mx[o] = std::max (mx[o<<1], mx[o<<1|1]);
} void updata(int p, int v, int l, int r, int o) {
if (l == r) {
mx[o] = v;
return ;
}
int mid = l + r >> 1;
if (p <= mid) {
updata (p, v, lson);
} else {
updata (p, v, rson);
}
push_up (o);
} int query(int ql, int qr, int l, int r, int o) {
if (ql <= l && r <= qr) {
return mx[o];
}
int mid = l + r >> 1, ret = -1;
if (ql <= mid) {
ret = std::max (ret, query (ql, qr, lson));
}
if (qr > mid) {
ret = std::max (ret, query (ql, qr, rson));
}
return ret;
} void DFS(int u) {
left[u] = tot++;
for (auto v: edge[u]) {
DFS (v);
}
right[u] = tot;
} int ans[N]; void solve() {
tot = 1;
DFS (0);
//build (1, tot-1, 1);
memset (mx, -1, sizeof (mx));
std::sort (p+1, p+n);
ans[0] = -1;
for (int j, i=1; i<n; i=j) {
j = i;
while (j < n && p[j].ab == p[i].ab) {
int id = p[j].id;
ans[id] = ID[query (left[id]+1, right[id]-1, 1, tot-1, 1)];
j++;
}
j = i;
while (j < n && p[j].ab == p[i].ab) {
int id = p[j].id;
updata (left[id], p[j].loy, 1, tot-1, 1);
j++;
}
}
} int main() {
int T;
scanf ("%d", &T);
while (T--) {
scanf ("%d%d", &n, &m);
for (int i=0; i<n; ++i) {
edge[i].clear ();
}
ID.clear ();
ID[-1] = -1;
for (int i=1; i<n; ++i) {
scanf ("%d%d%d", &p[i].sup, &p[i].loy, &p[i].ab);
p[i].id = i;
edge[p[i].sup].push_back (i);
ID[p[i].loy] = i;
}
solve ();
for (int i=0; i<m; ++i) {
int j;
scanf ("%d", &j);
printf ("%d\n", ans[j]);
}
}
return 0;
}

2012 Multi-University #7的更多相关文章

  1. 针对于网络安全领域中基于PCAP流量的数据集

    网络安全领域中基于PCAP流量的数据集 MAWI Working Group Traffic Archive URL:http://mawi.wide.ad.jp/mawi/ CIC dataset ...

  2. Parallel NetCDF 简介

    Parallel NetCDF API 所有C接口前加ncmpi前缀,Fortran接口前加nfmpi前缀 函数返回整数 NetCDF 状态变量 1. Variable and Parameter T ...

  3. 视觉中的深度学习方法CVPR 2012 Tutorial Deep Learning Methods for Vision

    Deep Learning Methods for Vision CVPR 2012 Tutorial  9:00am-5:30pm, Sunday June 17th, Ballroom D (Fu ...

  4. Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了

    作者:Glowin链接:https://zhuanlan.zhihu.com/p/22881223来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 原文地址:Google ...

  5. SQL Server 2012 内存管理 (memory management) 改进

    SQL Server 2012 的内存管理和以前的版本相比,有以下的一些变化. 一.内存分配器的变化 SQL Server 2012以前的版本,比如SQL Server 2008 R2等, 有sing ...

  6. 西安理工大学 李爱民 Xi'an University of Technology, Aimin Li

    李爱民-西安理工大学计算机科学与工程学院 ● 简介(Introduction)-> 李爱民(Aimin Li),男,湖北随州人,西安电子科学大学博士(PhD),中共党员.中国计算机学会会员,CS ...

  7. 微软BI SSRS 2012 Metro UI Win 8 风格的报表课程案例全展示

    开篇介绍 微软BI SSRS 2012 Metro UI 高端报表视频教程 (http://www.hellobi.com/course/15)课程从2014年6月开始准备,于2014年9月在 天善B ...

  8. Online handwriting recognition using multi convolution neural networks

    w可以考虑从计算机的“机械性.重复性”特征去设计“低效的”算法. https://www.codeproject.com/articles/523074/webcontrols/ Online han ...

  9. Patch multi versions of windows via Power shell

    Patch multi versions of windows via Power shell $version = Get-WmiObject -Class Win32_OperatingSyste ...

  10. Weblogic多数据源(Multi Data Sources)应用实践

    原创 2012年03月29日 10:55:28 标签: weblogic / 数据库 / 负载均衡 / 数据中心 / jdbc / 应用服务器   大型系统在进行数据库部署时,常常会分为主数据应用中心 ...

随机推荐

  1. Android Studio中JNI程序的单步调试和日志打印

    近日有个算法(检测碰撞)需要用C++实现,目的是IOS和ANDROID中共享同一段程序. 下面说说android调用这段程序过程中遇到的一些事情.(过程中网上搜索了一些相关文章,大部分说的是eclip ...

  2. Win7旗舰版-X86-X64-快速装机版

    装机版作品简介 Win7 32/64位旗舰版 6.5z 专注于Win7,致力于做更好用的系统!一如既往的品质,不流氓,不欺骗,不夸大!一直在改进,只为做得更好!万千用户的信赖,作者的品质保证! 作品摘 ...

  3. MySQL5.0数据库的安装

    ======================= 未完待续,持续更新中... -------------------------------------------------

  4. Yii2.0数据库查询的一些简单的操作

    User::find()->all(); 此方法返回所有数据: User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子): User::find()->w ...

  5. 在eclipse中遇到cannot open output file xxx.exe: Permission denied 的解决办法

    该问题出现的原因主要原因是,编译后运行的程序未能正确关闭,解决方法:删除debug目录即可 同理在vc6.0遇到同样问题时,删除debug目录,或者重启vc6.0即可

  6. 多光谱图像数据库, Multispectral images databses

    1. https://scien.stanford.edu/index.php/hyperspectral-image-data/ 2. http://www.cs.columbia.edu/CAVE ...

  7. tyvj1004 滑雪

    描述     trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行的路线必须向下倾斜.    例如样例中的那个矩形,可以从某 ...

  8. R语言——七月

    这两个月没有写什么代码.也没做什么大项目,基本就是对以前写的那个用ggplot2可视化数据的项目做一些增增补补,大部分技术难关都在ggplot2和R语言EXCEL处理这里解决并总结了.然后业余帮人修改 ...

  9. [Search Engine] 搜索引擎分类和基础架构概述

    大家一定不会多搜索引擎感到陌生,搜索引擎是互联网发展的最直接的产物,它可以帮助我们从海量的互联网资料中找到我们查询的内容,也是我们日常学习.工作和娱乐不可或缺的查询工具.之前本人也是经常使用Googl ...

  10. undefined method `environment' for nil:NilClass when importing Bootstrap into rails

    今天做项目时往Gemfile里加了各gem, 然后bundle update了一下, 然后悲剧了,出现了undefined method `environment' for nil:NilClass ...