B

  4D"部分和"问题,相当于2D部分和的拓展,我是分解成2D部分和做的:

  f[x1][y1][x2][y2]=true/false 表示 左上(x1,y1) 右下(x2,y2)的矩形是否是good rectangle;

  p1[][]x][y]表示右下为(x,y)的good rectangle有多少个,相当于一个[x][y]确定的2D前缀和;

  t[i][j][x][y]表示左上在矩形 (i,j) (x,y) 区域内 右下确定为(x,y)的方案数有多少个,可以o(1)计算:

  t[i][j][x][y]=p1[x][y][x][y]-

         p1[i-1][y][x][y]-

         p1[x][j-1][x][y]+

         p1[i-1][j-1][x][y];

  p2[x1][y1][x2][y2] 表示询问(x1,y1) (x2,y2) , 它恰好就是t[x1][y1][][] 在(x1,y1)确定下的2D前缀和.

  

 void init()
{
for (int i= ; i<=n ; i++ )
for (int j= ; j<=m ; j++ ) sum[i][j]=s[i][j]==''?:;
for (int i= ; i<=n ; i++ )
for (int j= ; j<=m ; j++ ) sum[i][j]=sum[i][j-]+sum[i][j];
for (int i= ; i<=m ; i++ )
for (int j= ; j<=n ; j++ ) sum[j][i]=sum[j-][i]+sum[j][i]; for (int x= ; x<=n ; x++ )
for (int y= ; y<=m ; y++ )
for (int i= ; i<=x ; i++ )
for (int j= ; j<=y ; j++ )
if (check(i,j,x,y)) f[i][j][x][y]=; for (int x= ; x<=n ; x++ )
for (int y= ; y<=m ; y++ )
{
for (int i= ; i<=x ; i++ )
for (int j= ; j<=y ; j++ )
p1[i][j][x][y] = p1[i][j-][x][y]+f[i][j][x][y];
for (int i= ; i<=y ; i++ )
for (int j= ; j<=x ; j++ )
p1[j][i][x][y] = p1[j-][i][x][y]+p1[j][i][x][y];
}
for (int x= ; x<=n ; x++ )
for (int y= ; y<=m ; y++ )
{
for (int i=x ; i<=n ; i++ )
for (int j=y ; j<=m ; j++ )
p2[x][y][i][j] = p2[x][y][i][j-] + getvar(x,y,i,j);
for (int i=y ; i<=m ; i++ )
for (int j=x ; j<=n ; j++ )
p2[x][y][j][i] = p2[x][y][j-][i] + p2[x][y][j][i];
}
}

C

  题目描述有点绕啊,原来d是最多单位时间走d步的意思, 不是每步走d...

  总之最后问题转化成区间最值问题,好在询问区间每次只有头尾不同,可以用单调队列优化.

D

  解决问题的关键是插入或删除一个点的同时维护连通块大小.

  先考虑一个静态的问题:对于给定的集合求size.

  如果按dfs序考虑,ans*2 = sigma(dist(order,order+1)) + dist(first,end)。

  现在动态考虑,如果插入的点i在u,v中间:

    add = dist(u,i) + dist(i,v) - dist(u,v)

  可以理解为,新增的代价是连接u,i的代价+连接i,v的代价,但要此前u,v已经连接了,所以要减去加入前连接(u,v)的代价.

  另外两种可能是:

  u不存在和v不存在,那么add = dist(*,i)  ( *表示u或者v);

  删除可以类似考虑.

  最后,问题转化为,动态求集合中比order[i]小的最大值和比order[i]大的最小值,用set或者树状数组都可以解决.

  

 #define maxn 100010
vector<int>e[maxn];
int n,k,sz,dep[maxn],bit[maxn<<|],
first[maxn],rmq[][maxn<<|],t; void dfs(int cur,int fa)
{
rmq[][++t]=cur;
first[cur]=t;
rep(i,(int)e[cur].size()) if(e[cur][i]!=fa)
{
dep[e[cur][i]]=dep[cur]+;
dfs(e[cur][i],cur);
rmq[][++t]=cur;
}
}
void initrmq()
{
for (int i= ; (<<i)<=t ; i++ )
for (int j= ; j+(<<i)-<=t ; j++ )
{
int a=rmq[i-][j];
int b=rmq[i-][j+(<<(i-))];
if (dep[a]<dep[b]) rmq[i][j]=a;
else rmq[i][j]=b;
}
}
int lca(int a,int b)
{
assert(a && b);
int l,r,len=;
l = min(first[a],first[b]);
r = max(first[a],first[b]);
while (<<(len+)<=(r-l+)) len++;
if (dep[rmq[len][l]]<dep[rmq[len][r-(<<len)+]])
return rmq[len][l];
else return rmq[len][r-(<<len)+];
}
int lowbit(int x) {return x&(-x);}
void ins(int x,int var)
{
for (int i=x ; i<=t ; i+=lowbit(i)) bit[i]+=var;
}
int query(int x)
{
int res=;
for (int i=x ; i> ; i-=lowbit(i)) res+=bit[i];
return res;
}
int range_sum(int l,int r){return query(r)-query(l-);}
int binsearchr(int l,int r)
{
while (l<=r)
{
if (range_sum(mid,r)) l=mid;
else r=mid-;
if (l+>=r)
{
if (range_sum(r,r)) return r;
if (range_sum(l,l)) return l;
return ;
}
}
return ;
}
int binsearchl(int l,int r)
{
while (l<=r)
{
if (range_sum(l,mid)) r=mid;
else l=mid+;
if (l+>=r)
{
if (range_sum(l,l)) return l;
if (range_sum(r,r)) return r;
return ;
}
}
return ;
}
int getdist(int u,int v) { return dep[u]+dep[v]-*dep[lca(u,v)]; }
int getsize()
{
int l = rmq[][binsearchl(,t)];
int r = rmq[][binsearchr(,t)];
assert(l && r);
int v = getdist(l,r);
return sz + v;
}
void add(int x)
{
int dfst = first[x];
int l = rmq[][binsearchr(,dfst-)];
int r = rmq[][binsearchl(dfst+,t)];
int v = ;
if (l) v += getdist(x,l);
if (r) v += getdist(x,r);
if (l && r) v -= getdist(l,r);
sz += v;
ins(dfst,);
}
void del(int x)
{
int dfst = first[x];
int l = rmq[][binsearchr(,dfst-)];
int r = rmq[][binsearchl(dfst+,t)];
int v = ;
if (l) v += getdist(x,l);
if (r) v += getdist(x,r);
if (l && r) v -= getdist(l,r);
sz -= v;
ins(dfst,-); }
int main()
{
// freopen("test.txt","r",stdin);
scanf("%d%d",&n,&k);
for (int i= ; i<n ; i++ )
{
int u,v;
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
dfs(,);
initrmq();
int ans=;
for (int l=,i= ; i<=n ; i++ )
{
add(i);
while (getsize()>(k-)*) del(l++);
ans = max(i-l+,ans);
}
printf("%d\n",ans);
return ;
}

E

  (反演。。。不会T-T)

  

Codeforce 219 div1的更多相关文章

  1. Codeforce 222 div1

    A 假设只有一个连通块,任选一个点入队,按bfs/dfs序删除即可. trick: 要考虑有多个连通块的情况,不一定无解. #define rep(i,n) for(int i=0 ; i<(n ...

  2. Codeforce 221 div1

    A 只要打个表就能发现,1,6,8,9的所有排列就可以产生0~6的余数了... 所以...走不下去的时候一定要打表... #define rep(i,n) for(int i=0 ; i<(n) ...

  3. Codeforce 215 div1

    C 把每个qi看成点,则问题转化为:求一个最大的k,遍历k个点的完全图需要的最小步数+1不超过n, (这里+1的原因是把起点加进去) 讨论k的奇偶: k为奇数,每个点度数为偶数,这是一个欧拉回路,步数 ...

  4. ACM思维题训练 Section A

    题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...

  5. Codeforce Round #219 Div2

    妈蛋,C题又没搞出来! 看上去很简单的一题 到是这次的题目意思都比较容易懂,C没弄出来时,回去看了下A,以为来不及了,没想到这次的手速还是可以的7分钟搞出来了,因为太简单- -! A:大于两倍的不行- ...

  6. Android Weekly Notes Issue #219

    Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...

  7. CF#345 (Div1)

    论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...

  8. 图论 SRM 674 Div1 VampireTree 250

    Problem Statement      You are a genealogist specializing in family trees of vampires. Vampire famil ...

  9. jq对象转为dom对象:$(".div1")[0] dom对象转为jq对象:$(dom对象)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

随机推荐

  1. memcached学习——分布式算法(Consistant hash + 虚拟节点)(三)

    1.取余算法 优点:数据分布均匀缺点:当服务器动态的添加.删除节点或者某台server down掉,会导致命中率超大幅度下降,甚至导致服务不可用 2.Consistant Hash算法:一致性哈希算法 ...

  2. SpringMVC拦截器(实现登录验证拦截器)

    本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...

  3. iOS、mac开源项目及库(感谢原作者的分享)

    目录 模糊效果 富文本 表相关 HUD与Toast 其他UI 其他动画 网络测试 网络聊天 Model 数据库 PDF 摄像照相视频音频处理 消息相关 消息推送服务器端 版本新API的Demo 测试及 ...

  4. VMware上实现LVS负载均衡(NAT)

    本文LVS的实现方式採用NAT模式.关于NAT的拓扑图请參照我的上一篇文章.本文纯粹实验.NAT在生产环境中不推荐使用.原因是Load Balancereasy成为瓶颈! 1.VMware9上安装Ce ...

  5. udp 不需要 listen

    accept()不是监听,accept()是接受新连接.listen()是进入监听状态,表示愿意接收连接请求.listen之后有连接请求就将其放到队列中,accept()时把新连接请求从队列中取出,建 ...

  6. 酷Q机器人,QQ机器人使用教程

    软件介绍: 酷Q,软件酷Q机器人是一款基于webqq开发的一款自动接收.处理qq消息的软件. 改程序使用易语言编写,精简大量不必要代码,减小了软件体积,优化程序速度,使得酷Q更加轻巧好用. 在消息处理 ...

  7. Java基础知识强化60:经典查找之二分查找

    1. 二分查找       二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 比较 ...

  8. Web前端开发面试题赋答案

    第一部分:用CSS实现布局 让我们一起来做一个页面 首先,我们需要一个布局. 请使用CSS控制3个div,实现如下图的布局. 第二部分:用javascript优化布局 由于我们的用户群喜欢放大看页面 ...

  9. php模块memcache和memcached区别分析

    zm总结:尽量使用memcached就好了 1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcac ...

  10. 基于java callable及future接口解决生产者消费者问题

    这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者- ...