补一下之前的总结……

T1.restaurant

这道题还是很简单的嘛,子恒dalao非常良心。我们把招牌菜和所需要的菜品绑定在一起就成了完全背包,然后直接跑一遍完全背包即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<set>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ; ll read()
{
ll ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} ll T,n,m,t[M],tmax,w[M],x,dp[M]; int main()
{
freopen("restaurant.in","r",stdin);
freopen("restaurant.out","w",stdout);
T = read();
while(T--)
{
memset(dp,,sizeof(dp));
n = read(),m = read(),tmax = read();
rep(i,,n) t[i] = read(),w[i] = read();
rep(i,,m) t[n+i] = read(),w[n+i] = read();
rep(i,,m)
rep(j,,n) x = read(),t[n+i] += x * t[j];
rep(i,,n+m)
{
rep(j,t[i],tmax) dp[j] = max(dp[j],dp[j-t[i]] + w[i]);
}
printf("%lld\n",dp[tmax]);
}
return ;
}

T2.olefin

这道题当时想了60分暴力,反正就是直接从一个点开始向两边暴搜即可。

然后有20分是可以固输的,还有40分直接暴力,于是就得了60.

然后这道题的正解是换根DP,就是我们先求出一个点所在子树深度最大的点的深度,然后再记录fromroot表示从根来的最长链的长度,首先一遍dfs求出深度之后,我们对于每个点用fromroot更新其儿子的答案,然后更新它儿子的fromroot。

之后我们对于每一个点找出儿子之中深度最大的和次大的,用次大更新最大,最大更新其他即可。

60分暴力:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<set>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} struct edge
{
int next,to,from;
}e[M<<]; int id,n,m,ecnt,head[M],t,sum,maxn,x,dis[M];
bool vis[M]; void add(int x,int y)
{
e[++ecnt].to = y;
e[ecnt].next = head[x];
head[x] = ecnt;
} void dfs(int x)
{
dis[x] = ,vis[x] = ;
int maxm = ;
bool flag = ;
for(int i = head[x];i;i = e[i].next)
{
if(vis[e[i].to]) continue;
if(e[i].to > n) continue;
dfs(e[i].to);
flag = ;
maxm = max(maxm,dis[e[i].to]);
}
if(flag) dis[x] += maxm,dis[x]++;
} void naive(int x)
{
rep(i,,n) vis[i] = ;
int k = ((x-)<<)-;
int r1 = e[k].to,r2 = x;
//printf("#%d %d\n",r1,r2);
vis[r1] = vis[r2] = ;
dfs(r1);
vis[r1] = vis[r2] = ;
dfs(r2);
//printf("!%d %d\n",dis[r1],dis[r2]);
printf("%d ",dis[r1] + dis[r2] + );
} int main()
{
freopen("olefin.in","r",stdin);
freopen("olefin.out","w",stdout);
id = read();
t = read();
while(t--)
{
n = read(),m = read();
ecnt = ;rep(i,,n) head[i] = ;
rep(i,,n<<) e[i].next = e[i].to = ;
rep(i,,n) x = read(),add(i,x),add(x,i);
rep(i,,m)
{
x = read();
if(id == ) printf("%d ",n-);
else if(id == ) printf("2 ");
else naive(x);
}
enter;
}
return ;
}

100分:

#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 100005
#define pb push_back
#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = ;T f = ;char c = getchar();
while(c < '' || c > '') {
if(c == '-') f = -;
c = getchar();
}
while(c >= '' && c <= '') {
res = res * + c - '';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < ) {x = -x;putchar('-');}
if(x >= ) out(x / );
putchar('' + x % );
}
int N,M,fa[MAXN];
int dp[MAXN],ans[MAXN],fr[MAXN];
struct node {
int to,next;
}E[MAXN * ];
int head[MAXN],sumE;
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
void dfs1(int u) {
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
dfs1(v);
dp[u] = max(dp[v] + ,dp[u]);
}
}
void dfs2(int u) {
pii p(,);
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
ans[v] = max(dp[v] + + fr[u],ans[v]);
fr[v] = max(fr[v],fr[u] + );
if(dp[v] >= dp[p.se]) p.se = v;
if(dp[p.se] >= dp[p.fi]) swap(p.se,p.fi);
}
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != p.fi) {
ans[v] = max(dp[v] + + dp[p.fi],ans[v]);
fr[v] = max(fr[v],dp[p.fi] + );
}
else if(p.se) {
ans[p.fi] = max(ans[p.fi],dp[p.fi] + + dp[p.se]);
fr[p.fi] = max(fr[p.fi],dp[p.se] + );
}
dfs2(v);
}
}
void Solve() {
memset(head,,sizeof(head));sumE = ;
memset(fr,,sizeof(fr));memset(dp,,sizeof(dp));memset(ans,,sizeof(ans));
read(N);read(M);
for(int i = ; i <= N ; ++i) {
read(fa[i]);
add(fa[i],i);
}
dfs1();dfs2();
int x;
for(int i = ; i <= M ; ++i) {
read(x);out(ans[x]);
if(i == M) enter;
else space;
}
if(!M) enter;
}
int main() {
freopen("olefin.in","r",stdin);
freopen("olefin.out","w",stdout);
int id,T;
read(id);read(T);
while(T--) {
Solve();
}
return ;
}

T3.tromino

这道题当时自己确实不知道该怎么做啊……

后来听了讲解竟然要分成那么多情况……我们考虑当左侧都填满的时候右侧有多少种填充情况。一共有九种,然后考虑在这个基础上把左边那一列填满,然后把这个3*2的窗口向右移动一列,看他们的变化情况……

然后你发现每步的移动都是一样的,你就能得到一个9*9的矩阵。

如果你使用OEIS网站或者高斯消元……可以把其简化为一个6*6矩阵,然后转移即可……

其实这道题的递推公式可以在OEIS上搜到的。

哦,然后因为这题的数据范围过大,即使是快速幂也满足不了需求,所以我们使用十进制快速幂,也就是每次把这个数一位一位的去进行快速幂即可,然后每次要乘上当前矩阵的10次幂。

看一下std,自己改过的代码找不到了……

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll; const int tb[][] = {
{, , , , , },
{, , , , , },
{, , , , , },
{, , , , , },
{, , , , , },
{-, , , , , },
};
const int pre_ans[] = {, , , , , }; const int N = , P = ;
char s[N];
int n, a[N]; struct matrix {
ll g[][];
matrix(){
memset(g, , sizeof(g));
}
matrix operator * (const matrix &b) const {
matrix c;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < ; k++)
c.g[i][j] = (c.g[i][j] + g[i][k] * b.g[k][j]) % P;
return c;
}
} mtx, ans, tmp, pw[]; int main(){ scanf("%s", s);
n = strlen(s);
if(n == && s[] < ''){
printf("%d\n", pre_ans[s[] - '']);
return ;
}
for(int i = ; i < n; i++)
a[i] = s[n - i - ] - '';
a[] -= ;
for(int i = ; a[i] < ; i++)
a[i] += , a[i + ]--;
while(n && a[n - ] == ) n--;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
mtx.g[i][j] = tb[i][j];
for(int i = ; i < ; i++)
pw[].g[i][i] = ;
for(int i = ; i <= ; i++)
pw[i] = pw[i - ] * mtx;
ans = pw[];
for(int i = n - ; i >= ; i--){
tmp = ans = ans * ans;
ans = ans * ans;
ans = ans * ans * tmp * pw[a[i]];
}
for(int i = ; i < ; i++)
mtx.g[i][] = pre_ans[i];
ans = ans * mtx;
printf("%lld\n", ans.g[][]); return ;
}

2018.09.08 DL24 Day1 总结的更多相关文章

  1. 2018.09.08 AtCoder Beginner Contest 109简要题解

    比赛传送门 水题大赛? 全是水题啊!!! T1 ABC333 就是判断是不是两个数都是奇数就行了. 代码: #include<bits/stdc++.h> using namespace ...

  2. 2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)

    传送门 状压dp好题啊. 可以发现这道题的状压只用压缩5位. f[i][j]表示当前在第i个位置状态为j的最优值. 显然可以由f[i-1]更新过来. 因此只用预处理在第i个位置状态为j时有多少个小朋友 ...

  3. 2018.09.08 poj1185 炮兵阵地(状压dp)

    传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...

  4. 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)

    传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...

  5. 2018.09.08 bzoj4518: [Sdoi2016]征途(斜率优化dp)

    传送门 把式子展开后发现就是要求: m∗(∑i=1msum′[i])−sum[n]2" role="presentation" style="position: ...

  6. 2018.09.08 NOIP模拟trip(最长链计数)

    差不多是原题啊. 求最长链变成了最长链计数,其余没有变化. 这一次考试为了保险起见本蒟蒻还是写了上次没写的辅助数组. 代码: #include<bits/stdc++.h> #define ...

  7. 2018.09.08 NOIP模拟 division(状压dp)

    这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...

  8. 2018.09.08 NOIP模拟eat(贪心)

    签到水题啊... 这题完全跟图论没有关系. 显然如果确定了哪些点会被选之后顺序已经不重要了.于是我们给点按权值排序贪心从大向小选. 我们要求的显然就是∑i(a[i]−(n−i))" role ...

  9. 2018.09.22 上海大学技术分享 - An Introduction To Go Programming Language

    老实说笔者学习 Go 的时间并不长,积淀也不深厚,这次因缘巧合,同组的同事以前是上海大学的开源社区推动者之一,同时我们也抱着部分宣传公司和技术分享的意图,更进一步的,也是对所学做一个总结,所以拟定了这 ...

随机推荐

  1. [Python3网络爬虫开发实战] 1.5.2-PyMongo的安装

    在Python中,如果想要和MongoDB进行交互,就需要借助于PyMongo库,这里就来了解一下它的安装方法. 1. 相关链接 GitHub:https://github.com/mongodb/m ...

  2. PHP:GD库 生成验证码图片

    文章来源:http://www.cnblogs.com/hello-tl/p/7592998.html <?php /** * __construct($new):构造函数创建一张图片$new- ...

  3. 贪心 Radar Installation (求最少探测雷达)

    Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...

  4. 关于Django中,实现序列化的几种不同方法

    前言 关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作. 今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法 创建 ...

  5. java 几种拼接字符串的效率问题

    拼接字符串,大致有3个class可以用,他们是String, StringBuffer,StringBuilder, StringBuilder是1.5中来代替StringBuffer的.检验方法如下 ...

  6. ***mysql 用一个表的一列,去更新另一表的一列

    需求: 老板给了一个EXCEL数据,是本人提供的一个模板,含ID,现在相当于要导入这新增的一列数据到数据库中的某一个表. 方法一:用navicat,在excel中复制一列,再粘贴到navicat中的一 ...

  7. Remove Duplicates from Sorted Array(参考)

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  8. 学习swift从青铜到王者之Swift集合数据类型03

    1 数组的定义 var array1 = [,,,] var array2: Array = [,,,] var array3: Array<Int> = [,,,] var array4 ...

  9. Ubuntu下Zabbix安装及使用问题

    1.configure: error: MySQL library not found MySQL library not found root@kallen:~# apt-get install l ...

  10. STM8S---外部中断应用之长按键识别

    STM8经常使用中断指令 开总中断 _asm("rim"); 禁止中断 _asm("sim"); 进入停机模式 _asm("halt"); ...