6月28日考试 题解(GCD约分+动态规划+树状数组二维偏序)
前言:考的一般般吧……T3暴力没打上来挺可惜的,到手的75分没了。
----------------------------------
T1 【JZOJ4745】看电影
Description
听说NOIP2016大家都考得不错,于是CCF奖励省常中了 K 张变形金刚5的电影票奖励OI队的同学去看电影。可是省常中OI队的同学们共有 N(N >= K)人。于是机智的你想到了一个公平公正的方法决定哪K人去看电影。
N个人排成一圈,按顺时针顺序标号为1 - N,每次随机一个还存活的人的编号,将这个人踢出。继续上述操作,直到剩下K个人。
但这样显然太无聊了,于是小S又想出一个牛逼的方法。
N个人排成一圈,按顺时针顺序标号为1 - N,每次随机一个1 - N的编号,假设随机到的编号是X,如果编号为X人还未踢出,则将这个人踢出,否则看编号为X % N + 1(即顺时针顺序下一个编号)的人是否存活,如果还未踢出则将他踢出,否则继续看编号(X + 1)% N +1的人,如果已被踢出看顺时针的下一个…………,以此类推,直到踢出一个人为止。重复上述操作,直到剩下K个人。
已知小S的编号是Id,问按照小S的方法来他有多少的概率可以不被踢出,成功得到看电影的机会。
Input
第一行包括三个正整数,N,K,Id(1<=K<=N<=10^9,1<=ID<=N )
Output
一行一个最简分数,表示小S可以看到电影的概率。
(如果概率为1或0,请输出1/1或0/1)
---------------------------
因为在环上每个人的位置和被选中的概率是相同的。所以所有人能看电影的概率和为K。即一个人看电影的概率是K/N。约分后输出即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,k,ld;
int gcd(int a,int b)
{
if(b==)return a;
return gcd(b,a%b);
}
int main()
{
scanf("%d%d%d",&n,&m,&ld);
k=gcd(n,m);
printf("%d/%d",m/k,n/k);
return ;
}
T2 【JZOJ4746】树塔狂想曲
相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和。走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1)。如下图是一个数塔,映射到该数塔上行走的规则为:从左上角的点开始,向下走或向右下走直到最底层结束。
1
3 8
2 5 0
1 4 3 8
1 4 2 5 0
路径最大和是1+8+5+4+4 = 22,1+8+5+3+5 = 22或者1+8+0+8+5 = 22。
小S觉得这个问题so easy。于是他提高了点难度,他每次ban掉一个点,然后询问你不走该点的最大路径和。
当然他上一个询问被ban掉的点过一个询问会恢复(即每次他在原图的基础上ban掉一个点,而不是永久化的修改)。
n<=1000 m<=50W
----------------------------------
看完题目后不难想到要维护最大值和次大值。我们不妨从上往下DP一次,从下往上DP一次,来维护$(i,j)$的最大值。
写法就是$tot[i][j]=\max(f[i-1][j-1],f[i-1][j])+\max(ff[i+1][j],ff[i+1][j+1])+a[i][j]$
最大值和次大值再遍历一遍就可以求出来了。
#include<bits/stdc++.h>
using namespace std;
int f[][],ff[][],sum[],ans[],tot[][],second[];
int n,m,a[][];
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
void dp()
{
f[][]=a[][];
for (int i=;i<=n;i++)
for (int j=;j<=i;j++) f[i][j]=max(f[i-][j-],f[i-][j])+a[i][j];
for (int i=n;i>=;i--)
for (int j=i;j>=;j--) ff[i][j]=max(ff[i+][j],ff[i+][j+])+a[i][j];
for (int i=;i<=n;i++)
for (int j=;j<=i;j++) tot[i][j]=max(f[i-][j-],f[i-][j])+max(ff[i+][j],ff[i+][j+])+a[i][j];
for (int i=;i<=n;i++)
for (int j=;j<=i;j++)
if (tot[i][j]>ans[i]) ans[i]=tot[i][j],sum[i]=j;
for (int i=;i<=n;i++)
for (int j=;j<=i;j++)
if (j!=sum[i])
if (tot[i][j]>second[i]) second[i]=tot[i][j];
}
int main()
{
n=read(),m=read();
for (int i=;i<=n;i++)
for (int j=;j<=i;j++) a[i][j]=read();
dp();
for (int i=;i<=m;i++)
{
int x=read(),y=read();
if (x==&&y==){
cout<<-<<endl;
continue;
}
if (ans[x]==tot[x][y]) cout<<second[x]<<endl;
else cout<<ans[x]<<endl;
}
return ;
}
T3 【JZOJ4747】被粉碎的线段树
--------------------------------
我是没有看懂正解……贴一个正解连接吧:https://blog.csdn.net/dianning8393/article/details/101620538
不难想到75分的做法:同样使用线段树,只不过把每个区间的mid改为他给出的mid即可。区间权值设为1。注意要使用动态开点,如果使用2倍编号类型的线段树会挂25分,因为他给出的树不是完全二叉树。
貌似再加一些限制语句就可以到85分了,不过我没试过。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r,sum,lc,rc;
}tree[];
int n,m,a[],cnt,cut[],tot;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void build(int index,int l,int r)
{
tree[index].l=l;tree[index].r=r;
if (l==r){
tree[index].sum=;
return;
}
int mid=a[++cnt];cut[index]=mid;
if (!tree[index].lc) tree[index].lc=++tot,build(tree[index].lc,l,mid);
if (!tree[index].rc) tree[index].rc=++tot,build(tree[index].rc,mid+,r);
tree[index].sum=;
}
inline int query(int index,int l,int r)
{
if (l<=tree[index].l&&tree[index].r<=r) return tree[index].sum;
int mid=cut[index],res=;
if (l<=mid) res+=query(tree[index].lc,l,r);
if (r>mid) res+=query(tree[index].rc,l,r);
return res;
}
int main()
{
n=read(),m=read();
for (register int i=;i<n;i++) a[i]=read();
tot=;
build(,,n);
for (register int i=;i<=m;i++)
{
int x=read(),y=read();
printf("%d\n",query(,x,y));
}
return ;
}
6月28日考试 题解(GCD约分+动态规划+树状数组二维偏序)的更多相关文章
- 3月28日考试 题解(二分答案+树形DP+数学(高精))
前言:考试挂了很多分,难受…… --------------------- T1:防御 题意简述:给一条长度为$n$的序列,第$i$个数的值为$a[i]$.现让你将序列分成$m$段,且让和最小的一段尽 ...
- 【题解】Music Festival(树状数组优化dp)
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...
- HDU 4947 GCD Array 容斥原理+树状数组
GCD Array Time Limit: 11000/5500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...
- HDU 5869 Different GCD Subarray Query 树状数组+离线
Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...
- HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景
http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...
- 7月13日考试 题解(DFS序+期望+线段树优化建图)
T1 sign 题目大意:给出一棵 N 个节点的树,求所有起点为叶节点的有向路径,其 上每一条边权值和的和.N<=10000 水题.考试的时候毒瘤出题人(学长orz)把读入顺序改了一下,于是很多 ...
- 7月15日考试 题解(链表+状压DP+思维题)
前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...
- 3月21日考试 题解(数据结构+区间DP+贪心)
前言:T3写挂了,有点难受. --------------- T1 中位数 题意简述:给你一段长度为$n$的序列,分别输出$[1,2k-1]$的中位数$(2k-1\leq n)$. --------- ...
随机推荐
- PowerJob 的故事开始:“玩够了,才有精力写开源啊!”
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列.经过几番的努力和沟通,终于邀请到分布式任务调度与计算 ...
- LintCode笔记 - 8. 旋转字符串
这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 旋转字符串 中文English 给定一个字符 ...
- javascript基础(六): 获取节点实例 jquery获取当前节点的前一个节点
jquery获取当前节点的前一个节点步骤如下: 1.打开html开发工具,新建一来个html代码页面. 2.在html页面创建三个p标签,然后给这三个p标签设置不同的2113内容. 3.引入jquer ...
- 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透
前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...
- bzoj2132圈地计划
bzoj2132圈地计划 题意: 一块土地可以纵横划分为N×M块小区域.于第i行第j列的区域,建造商业区将得到Aij收益,建造工业区将得到Bij收益.而如果区域(i,j)相邻(相邻是指两个格子有公共边 ...
- 根据 Promise/A+ 和 ES6 规范,实现 Promise(附详细测试)
Promise 源码 https://github.com/lfp1024/promise promise-a-plus const PENDING = 'PENDING' const REJECTE ...
- 【mysql】- 锁篇(上)
回顾 问题 事务并发执行时可能带来各种问题,并发事务访问相同记录的情况大致可以划分为3种 读-读情况:即并发事务相继读取相同的记录 读取操作本身不会对记录有什么影响,并不会引起什么问题,所以允许这种情 ...
- Google公布编程语言排名,第一竟然是他?
没想到吧,Python 又拿第一了! 在 Google 公布的编程语言流行指数中,Python 依旧是全球范围内最受欢迎的技术语言! 01 为什么 Python 会这么火? 核心还是因为企业需 ...
- python dict乱码如何解决
定义字典并直接输出,结果输出结果中文是乱码展示 d={'name':'lily','age':18,'sex':'女','no':1121} print d 输出结果: {'age': 18, 'no ...
- nodejs--抓取页面的数据--图
感觉挺有意思,比php好玩 ----做个图留个 纪念