前言:考的一般般吧……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约分+动态规划+树状数组二维偏序)的更多相关文章

  1. 3月28日考试 题解(二分答案+树形DP+数学(高精))

    前言:考试挂了很多分,难受…… --------------------- T1:防御 题意简述:给一条长度为$n$的序列,第$i$个数的值为$a[i]$.现让你将序列分成$m$段,且让和最小的一段尽 ...

  2. 【题解】Music Festival(树状数组优化dp)

    [题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...

  3. HDU 4947 GCD Array 容斥原理+树状数组

    GCD Array Time Limit: 11000/5500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  5. HDU 5869 Different GCD Subarray Query 树状数组+离线

    Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...

  6. HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景

    http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...

  7. 7月13日考试 题解(DFS序+期望+线段树优化建图)

    T1 sign 题目大意:给出一棵 N 个节点的树,求所有起点为叶节点的有向路径,其 上每一条边权值和的和.N<=10000 水题.考试的时候毒瘤出题人(学长orz)把读入顺序改了一下,于是很多 ...

  8. 7月15日考试 题解(链表+状压DP+思维题)

    前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...

  9. 3月21日考试 题解(数据结构+区间DP+贪心)

    前言:T3写挂了,有点难受. --------------- T1 中位数 题意简述:给你一段长度为$n$的序列,分别输出$[1,2k-1]$的中位数$(2k-1\leq n)$. --------- ...

随机推荐

  1. 日期推算:datetime

    >>> import datetime >>> datetime.datetime.now() datetime.datetime(2020, 5, 20, 23, ...

  2. EntityFrameworkCore 开发实践问题及规范

    严重问题 客户端求值 如where条件包含的GetValueOrDefault()不能被翻译成sql语句 不规范代码段例子 public async Task<List<Person> ...

  3. Python pip 国内镜像大全及使用办法

    Python pip 国内镜像大全及使用办法 一.国内镜像 清华 https://pypi.tuna.tsinghua.edu.cn/simple 豆瓣 pip install -i http://p ...

  4. redis(三):Redis 命令(python)

    import redis from redis import StrictRedis redis=StrictRedis(host='localhost',port=6379,db=0,passwor ...

  5. 03-Python控制语句

    一.简介 通过一些语句来改变程序的执行顺序,这些语句被叫做控制语句,在python主要有if.for.while三种控制流语句. 二.if语句 用来检测一个条件是否成立,如果为真,则执行该语句(一般为 ...

  6. 使用OpenCV对图片进行特征点检测和匹配(C++)

    背景 最近从不同网站下载了非常多的动漫壁纸,其中有一些内容相同,但是大小.背景颜色.色调.主人公的位置不同(例子如下).正因为如此,基础的均方误差.直方图检测等方法很难识别出这些相似的图片. 思路 O ...

  7. 如何手写一个简单的LinkedList

    这是我写的第三个集合类了,也是简单的实现了一下基本功能,这次带来的是LinkedList的写法,需要注意的内容有以下几点: 1.LinkedList是由链表构成的,链表的核心即使data,前驱,后继 ...

  8. 不吹不擂,315 道 Python 面试题,欢迎挑战!

    各位大佬暂时先来315道题尝尝吧,后面有时间再继续补充. 有缘人如果看到这些题,不妨留言一下答案,来证明下你到底有多水,哈哈哈哈哈刀哈哈哈哈哈哈 第一部分 Python基础篇(80题) 1.为什么学习 ...

  9. CentOS开机启动不了修复

    1,如果启动时进度条,先修改为日志启动 启动后快速按任何键(Enter除外)进入如下界面 在按e进入 选择第二个选项卡 在按e进入将红色部分 rhgb quiet 删除,然后按Enter,在按b重启 ...

  10. ES6语法——Promise对象

    一.概念 Promise是异步编程的一种解决方案(解决回调地狱的问题),是一个能够获取异步操作信息的对象.Promise的内部保存着某个未来才会结束的事件(通常是一个异步操作) 二.特点 1.Prom ...