前言:考的一般般吧……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. Layui文本框限制正整数

    <input type="text" name="Number" lay-verify="required|integer" plac ...

  2. flask 源码专题(七):threading.local和高级

    1.python之threading.local 当每个线程在执行 val.num=1 ,在内部会为此线程开辟一个空间,来存储 num=1 val.num,找到此线程自己的内存地址去取自己存储 num ...

  3. redis(十五):Redis 有序集合(sorted set)(python)

    #coding:utf8 import redis r =redis.Redis(host="23.226.74.190",port=63279,password="66 ...

  4. Unity- 小“东西”

    菜单栏遍历处理预制体工具 public class GameEditor : Editor { private static void ProcessPrefabs(Action<GameObj ...

  5. day2:Number,tuple,str,list,set,dict

    # ### Number ( int float bool complex) 1.int 整型 (正整数 0 负整数)intvar = 1print(intvar) # type 获取值的类型res ...

  6. redis未授权访问简单总结

    redis环境搭建 下载有漏洞的redis版本 wget http://download.redis.io/releases/redis-3.2.11.tar.gz 编译文件 make 进入src目录 ...

  7. OSCP Learning Notes - Kali Linux

    Install Kali Linux : https://www.kali.org/ Common Commands: pwd man ls ls -la cd mkdir rmdir cp mv l ...

  8. OneinStack - 自动编译环境安装脚本

    https://oneinstack.com/

  9. sqlserver安装出现找不到数据库引擎错误

    sqlserver安装出现找不到数据库引擎错误 问题的解决 第一次安装SQL server,发现它较于Oracle,都有安装卸载十分麻烦的特点.刚开始安装,就让我频繁遇到这个“找不到数据库引擎”的错误 ...

  10. 面试时谈得很好,为什么就是拿不到offer?

    招聘行业有个共识,那就是如果没有给通知一般就是没有通过, 有的学员会问,为什么不打电话通知一下呢? 我猜测,有一方面的原因是怕尴尬,虽然你不觉得尴尬,但是难保有的应聘者会情绪激动,问东问西. 比如你告 ...