CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)部分题解

茶颜悦色
题意

固定 k k k的矩形,能最多框住多少个点。

题解

假如我们固定一个矩形,以左下角为坐标。
这样子对于 ( a , b ) (a,b) (a,b),那么能够包括到这个点的矩形左下角的范围:
x ∈ ( a − k , a ) , y ∈ ( b − k , b ) x∈(a-k,a),y∈(b-k,b) x(ak,a),y(bk,b)
利用扫描线的思想,从 x x x轴扫过去,每次对 y y y上的区间加 1 1 1,表示正方形左下角为此点的时候有多少个点能获得,求全局最大即可。

#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn= 4e5+500;  //Êý¾Ý·¶Î§

struct node{
    int x,yl,yr,io;
    node(){}
    node(int _x,int _yd,int _yu,int _io):x(_x),yl(_yd),yr(_yu),io(_io){}
    friend bool operator < (node a,node b){return a.x<b.x;}
}line[maxn];

struct tree2{
    tree2 *lson,*rson;
    int x,lazy;
}dizhi[maxn<<2],*root=&dizhi[0];

int n,m,t=1,yy[maxn];

void push_up(tree2 *tree,int l,int r){
    tree->x=max(tree->lson->x,tree->rson->x);
}

void build(tree2 *tree,int l,int r){
    if(l==r){
        tree->x=tree->lazy=0;
        return ;
    }
    tree->lson=&dizhi[t++];
    tree->rson=&dizhi[t++];
    int mid=(l+r)>>1;
    build(tree->lson,l,mid);
    build(tree->rson,mid+1,r);
    push_up(tree,l,r);
}

void push_down(tree2 *tree,int l,int r){
    if(!tree->lazy)return ;
    tree->lson->x+=tree->lazy;
    tree->rson->x+=tree->lazy;
    tree->lson->lazy+=tree->lazy;
    tree->rson->lazy+=tree->lazy;
    tree->lazy=0;
}

void update(tree2 *tree,int l,int r,int x,int y,int d){
    if(x<=l&&r<=y){
        tree->x+=d;
        tree->lazy+=d;
        return ;
    }
    push_down(tree,l,r);
    int mid=(l+r)>>1;
    if(x<=mid)update(tree->lson,l,mid,x,y,d);
    if(y>mid)update(tree->rson,mid+1,r,x,y,d);
    push_up(tree,l,r);
}

int main(){
    cin>>n>>m;
    int cnt=0,len;
    FOR(i,1,n){
        int x,y;
        scanf("%d%d",&x,&y);
        line[++cnt]=node(x-m,y-m,y,1);
        yy[cnt]=y-m;
        line[++cnt]=node(x+1,y-m,y,-1);
        yy[cnt]=y;
    }
    sort(line+1,line+1+cnt);
    sort(yy+1,yy+1+cnt);
    len=unique(yy+1,yy+1+cnt)-yy-1;
    build(root,1,len);
    int ans=-1;
    for(int i=1;i<=cnt;i++){
        int x=lower_bound(yy+1,yy+1+len,line[i].yl)-yy;
        int y=lower_bound(yy+1,yy+1+len,line[i].yr)-yy;
        //cout<<line[i].x<<" "<<  x<<" "<<y<<endl;
        update(root,1,len,x,y,line[i].io);
        ans=max(ans,root->x);
    }
    cout<<ans<<endl;
}
飞行棋
题意

有个骰子有 k k k面,类似于飞行棋,如果到达距离超过和终点的距离就会往前几步。
求到达终点扔的次数的期望。

题解

本质很简单。
如果你到达的距离比 k k k小了,那么你有 1 k \frac{1}{k} k1的概率到达终点。
否则到达一个新点,新点一定还是满足比 k k k小,依然还是有 1 k \frac{1}{k} k1概率。
期望就是 k k k次。
所以 E n = 1 + ∑ x = n − k n − 1 1 k E x E_{n}=1+\sum_{x=n-k}^{n-1}\frac{1}{k}E_x En=1+x=nkn1k1Ex
每个可以直接到达终点的点有 1 k \frac{1}{k} k1的概率直接到达终点,所以期望加一。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值