茶颜悦色
题意
固定 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∈(a−k,a),y∈(b−k,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=n−kn−1k1Ex
每个可以直接到达终点的点有
1
k
\frac{1}{k}
k1的概率直接到达终点,所以期望加一。