Solution

注意取模!!!

Code

#include<bits/stdc++.h>
#define mod 1000000007
#define LL long long
using namespace std; int n, a, b; LL mpow(LL a, LL b) {
LL ans = ;
for(; b; b >>= , a = a * a % mod)
if(b & ) ans = ans * a % mod;
return ans;
} LL fac[], inv[], l[], t[];
void init() {
fac[] = ;
inv[] = ;
for(int i = ; i <= ; i ++) {
fac[i] = fac[i - ] * i % mod;
inv[i] = mpow(fac[i], mod - );
}
} LL C(int p, int q) {
return fac[p] * inv[q] % mod * inv[p - q] % mod;
} int main() {
freopen("matrix.in", "r", stdin);
freopen("matrix.out", "w", stdout);
scanf("%d%d%d", &n, &b, &a);
for(int i = ; i <= n; i ++) scanf("%lld", &l[i]);
for(int i = ; i <= n; i ++) scanf("%lld", &t[i]);
LL ans = ;
init();
for(int i = ; i <= n; i ++) {
ans = (ans + b * l[i] % mod * C(n - + n - i, n - ) % mod * mpow(a, n - i) % mod * mpow(b, n - ) % mod) % mod;
ans = (ans + a * t[i] % mod * C(n - + n - i, n - ) % mod * mpow(b, n - i) % mod * mpow(a, n - ) % mod) % mod;
}
printf("%lld", ans);
return ;
}

Solution

二分+DP,二分需要多少组p+q,记忆化搜索判断是否可以达到条件。

定义$dp[dep][j][k]$表示当前取到第$dep$个数,还需要j个p,k个q来使满足条件。(p>q)

每次先尽量放p,剩下中再尽量放q,放q时就有限制,不能取超过$mid-i$,i表示当前取的p的数量。

Code

#include<bits/stdc++.h>
using namespace std; int n, a[], p, q;
int sum[], vis[][][], tim, all;
bool dfs(int dep, int nump, int numq) {
if(nump == && numq == ) return ;
if(dep == n + || sum[dep] < nump * p + numq * q) return ;
if(vis[dep][nump][numq] == tim) return ;
for(int i = ; i <= min(nump, a[dep] / p); i ++)
if(dfs(dep + , nump - i, max(numq - min((a[dep] - p * i) / q, all - i), ))) return ;
vis[dep][nump][numq] = tim;
return ;
} bool check(int mid) {
tim ++;
all = mid;
return dfs(, mid, mid);
} int erfen() {
int l = , r = sum[] / (p + q), ans;
while(l <= r) {
int mid = (l + r) >> ;
if(check(mid)) ans = mid, l = mid + ;
else r = mid - ;
}
return ans;
} int main() {
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
scanf("%d", &n);
for(int i = ; i <= n; i ++) scanf("%d", &a[i]);
for(int i = n; i >= ; i --) sum[i] = sum[i + ] + a[i];
scanf("%d%d", &p, &q);
if(p < q) swap(p, q);
int ans = erfen();
printf("%d", ans * (p + q));
return ;
}

Solution

考试最后半小时开始写QAQ结果发现是做过的题啊??

可是最后Spfa写错了!!!我爆哭!!!!

将与1相连的所有点取出来,二进制分类,分成起点和终点,跑多起点多终点的Spfa,处理出两两起点终点间最短路,更新答案即可QAQ

Spfa要判更新的点不能是1!!

Code

#include<bits/stdc++.h>
using namespace std; int n, m; struct Node {
int v, nex, w;
} Edge[]; int h[], stot = ;
void add(int u, int v, int w) {
Edge[++stot] = (Node) {v, h[u], w};
h[u] = stot;
} int dis[];
int vis[], nums, numt, w[], t[], S[], T[];
void Spfa1() {
queue < int > q;
memset(vis, , sizeof(vis));
memset(dis, 0x3f3f3f3f, sizeof(dis));
for(int i = ; i <= nums; i ++) q.push(S[i]), vis[S[i]] = , dis[S[i]] = min(dis[S[i]], w[S[i]]);
while(!q.empty()) {
int u = q.front(); q.pop(); vis[u] = ;
for(int i = h[u]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(dis[v] > dis[u] + Edge[i].w && v != ) {
dis[v] = dis[u] + Edge[i].w;
if(!vis[v]) {
vis[v] = ; q.push(v);
}
}
}
}
} void Spfa2() {
queue < int > q;
memset(vis, , sizeof(vis));
memset(dis, 0x3f3f3f3f, sizeof(dis));
for(int i = ; i <= numt; i ++) q.push(T[i]), vis[T[i]] = , dis[T[i]] = min(dis[T[i]], w[T[i]]);
while(!q.empty()) {
int u = q.front(); q.pop(); vis[u] = ;
for(int i = h[u]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(dis[v] > dis[u] + Edge[i].w && v != ) {
dis[v] = dis[u] + Edge[i].w;
if(!vis[v]) {
vis[v] = ; q.push(v);
}
}
}
}
} int tov[], tot;
int main() {
freopen("graph.in", "r", stdin);
freopen("graph.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = ; i <= m; i ++) {
int u, v, a, b;
scanf("%d%d%d%d", &u, &v, &a, &b);
add(u, v, a); add(v, u, b);
}
int ans = 0x3f3f3f3f;
memset(w, 0x3f3f3f3f, sizeof(w));
memset(t, 0x3f3f3f3f, sizeof(t));
for(int i = h[]; i; i = Edge[i].nex)
tov[++tot] = Edge[i].v, w[Edge[i].v] = min(w[Edge[i].v], Edge[i].w), t[Edge[i].v] = min(t[Edge[i].v], Edge[i ^ ].w);
sort(tov + , tov + + tot);
int M = tov[tot], tt = ;
while(M) {
int tmp = (M & );
nums = , numt = ;
for(int i = ; i <= tot; i ++)
if(((tov[i] >> tt) & ) == tmp) S[++nums] = tov[i];
else T[++numt] = tov[i];
Spfa1();
for(int j = ; j <= numt; j ++) {
ans = min(ans, t[T[j]] + dis[T[j]]);
}
Spfa2();
for(int j = ; j <= nums; j ++) {
ans = min(ans, t[S[j]] + dis[S[j]]);
}
M >>= , tt ++;
}
printf("%d", ans);
return ;
}

【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】的更多相关文章

  1. 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence

    题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...

  2. 记忆化搜索 dp学习~2

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...

  3. BZOJ1048:[HAOI2007]分割矩阵(记忆化搜索DP)

    Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个), 这样分割了(n-1)次后,原矩阵被分割成 ...

  4. hdu 4960 记忆化搜索 DP

    Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Ot ...

  5. HNU OJ10086 挤挤更健康 记忆化搜索DP

    挤挤更健康 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 339, A ...

  6. HDU 1078 FatMouse and Cheese 记忆化搜索DP

    直接爆搜肯定超时,除非你加了某种凡人不能想出来的剪枝...555 因为老鼠的路径上的点满足是递增的,所以满足一定的拓补关系,可以利用动态规划求解 但是复杂的拓补关系无法简单的用循环实现,所以直接采取记 ...

  7. hdu1331&&hdu1579记忆化搜索(DP+DFS)

    这两题是一模一样的``` 题意:给了一系列递推关系,但是由于这些递推很复杂,所以递推起来要花费很长的时间,所以我要编程序在有限的时间内输出答案. w(a, b, c): 如果a,b,c中有一个值小于等 ...

  8. HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)

    Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K ...

  9. [P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm (记忆化搜索/DP?,Tarjan?)

    第一看还以为是水题 随便打了一个bfs只有40分…… 然后开始颓废 #include<bits/stdc++.h> #define N 100005 using namespace std ...

随机推荐

  1. C#_界面程序_数码游戏

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. 使用WebHelper调用Asp.net WebAPI

    1.WebHelper using System; using System.Collections.Generic; using System.Collections.Specialized; us ...

  3. [转载]使用 NuGet 管理项目库

    原文:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Mi ...

  4. 视觉中的经典图像特征小结(一): 颜色直方图, HOG, LBP

    [普兒原创, 如有错误和纰漏欢迎指正. 更新中...] 1. 颜色直方图 颜色空间在本质上是定义在某种坐标系统下的子空间,空间中的每一个坐标表示一种不同的颜色.颜色空间的目的在于给出某种颜色标准,使得 ...

  5. spring的普通类中获取session和request对像

    在使用spring时,经常需要在普通类中获取session,request等对像. 1.第一钟方式,针对Spring和Struts2集成的项目: 在有使用struts2时,因为struts2有一个接口 ...

  6. 使用InstallShield打包windriver驱动-转

    转自:http://blog.csdn.net/weixin_29796711/article/details/72822052 用户在使用我们用windriver开发的硬件驱动时,需要先安装wind ...

  7. linux 如何删除文件夹下面的文件和文件夹,只保留两个文件

    # 删除目录下那两个文件之外的所有文件 find dir/ -type f ! -name file1 -a ! -name file2 | xargs rm -f   # 删除所有空目录(非空目录不 ...

  8. TimedSupervisorTask

    啊啊啊 UnsupportedOperationException Lists.emptyLIst() . add (String[] ) 这他妈的不行.. .2017/09/13 16:42:16. ...

  9. C#实现语音朗读功能

    第一步:新建项目  TTS(从文本到语音(TextToSpeech)) 第二步:添加引用 System.Speech 第三步:主界面以及后台代码 using System;using System.G ...

  10. Batch Normalization 与 Caffe中的 相关layer

    在机器学习领域,通常假设训练数据与测试数据是同分布的,BatchNorm的作用就是深度神经网络训练过程中, 使得每层神经网络的输入保持同分布. 原因:随着深度神经网络层数的增加,训练越来越困难,收敛越 ...