2018.09.08 DL24 Day1 总结
补一下之前的总结……
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 总结的更多相关文章
- 2018.09.08 AtCoder Beginner Contest 109简要题解
比赛传送门 水题大赛? 全是水题啊!!! T1 ABC333 就是判断是不是两个数都是奇数就行了. 代码: #include<bits/stdc++.h> using namespace ...
- 2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)
传送门 状压dp好题啊. 可以发现这道题的状压只用压缩5位. f[i][j]表示当前在第i个位置状态为j的最优值. 显然可以由f[i-1]更新过来. 因此只用预处理在第i个位置状态为j时有多少个小朋友 ...
- 2018.09.08 poj1185 炮兵阵地(状压dp)
传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...
- 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)
传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...
- 2018.09.08 bzoj4518: [Sdoi2016]征途(斜率优化dp)
传送门 把式子展开后发现就是要求: m∗(∑i=1msum′[i])−sum[n]2" role="presentation" style="position: ...
- 2018.09.08 NOIP模拟trip(最长链计数)
差不多是原题啊. 求最长链变成了最长链计数,其余没有变化. 这一次考试为了保险起见本蒟蒻还是写了上次没写的辅助数组. 代码: #include<bits/stdc++.h> #define ...
- 2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...
- 2018.09.08 NOIP模拟eat(贪心)
签到水题啊... 这题完全跟图论没有关系. 显然如果确定了哪些点会被选之后顺序已经不重要了.于是我们给点按权值排序贪心从大向小选. 我们要求的显然就是∑i(a[i]−(n−i))" role ...
- 2018.09.22 上海大学技术分享 - An Introduction To Go Programming Language
老实说笔者学习 Go 的时间并不长,积淀也不深厚,这次因缘巧合,同组的同事以前是上海大学的开源社区推动者之一,同时我们也抱着部分宣传公司和技术分享的意图,更进一步的,也是对所学做一个总结,所以拟定了这 ...
随机推荐
- linux ping-测试主机之间网络的连通性
博主推荐:更多网络测试相关命令关注 网络测试 收藏linux命令大全 ping命令用来测试主机之间网络的连通性.执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问 ...
- aggregate和annotate方法使用详解与示例
aggregate和annotate方法的使用场景 Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询.当我们需要对查询集(queryset)的某些字段进行计算或 ...
- xtu read problem training 4 A - Moving Tables
Moving Tables Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ...
- thinkphp整合系列之微信公众号支付
<?phperror_reporting(E_ALL);ini_set('display_errors', '1');// 定义时区ini_set('date.timezone','Asia/S ...
- 添物不花钱学javaEE--CSS
CSS是什么? CSS: Cascading Style Sheets CSS官方网址: https://www.w3.org/TR/2011/REC-CSS2-20110607/ 其实仔细研究这个就 ...
- NYOJ-770仿射密码,乘数密码与移位密码的结合;
仿射密码 时间限制:1000 ms | 内存限制:65535 KB 难度:1 -> Link <- 和乘数密码差不多: 加密算法:Ek(m)=(k1*m+k2)%q;gcd(k ...
- SPOJ ARCTAN
POJ1183 除输入方式外与这道题完全一样 题目大意是给定一个a 求最小的满足arctan(1/A)=arctan(1/B)+arctan(1/C) 的B+C的最小值 根据上述递推规律,我们只要从2 ...
- [luoguP1410] 子序列(DP)
传送门 发现一个结论. 只要存在长度>=3的非严格下降子序列就是NO,反之就是YES #include <cstdio> #include <iostream> #def ...
- 跪啃SAM
struct SAM { ],size,last,pre[maxn],pos[maxn]; SAM() { size=; memset(ch[],,])); pre[]=-; } int idx(ch ...
- ssh远程登录
ssh root@192.168.124.128 密钥登录: 1).ssh-keygen 生成公钥和私钥 [root@rhel5 ~]# ssh-keygen -t rsa Generating pu ...