Codeforce 219 div1
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的更多相关文章
- Codeforce 222 div1
A 假设只有一个连通块,任选一个点入队,按bfs/dfs序删除即可. trick: 要考虑有多个连通块的情况,不一定无解. #define rep(i,n) for(int i=0 ; i<(n ...
- Codeforce 221 div1
A 只要打个表就能发现,1,6,8,9的所有排列就可以产生0~6的余数了... 所以...走不下去的时候一定要打表... #define rep(i,n) for(int i=0 ; i<(n) ...
- Codeforce 215 div1
C 把每个qi看成点,则问题转化为:求一个最大的k,遍历k个点的完全图需要的最小步数+1不超过n, (这里+1的原因是把起点加进去) 讨论k的奇偶: k为奇数,每个点度数为偶数,这是一个欧拉回路,步数 ...
- ACM思维题训练 Section A
题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...
- Codeforce Round #219 Div2
妈蛋,C题又没搞出来! 看上去很简单的一题 到是这次的题目意思都比较容易懂,C没弄出来时,回去看了下A,以为来不及了,没想到这次的手速还是可以的7分钟搞出来了,因为太简单- -! A:大于两倍的不行- ...
- Android Weekly Notes Issue #219
Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...
- CF#345 (Div1)
论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...
- 图论 SRM 674 Div1 VampireTree 250
Problem Statement You are a genealogist specializing in family trees of vampires. Vampire famil ...
- jq对象转为dom对象:$(".div1")[0] dom对象转为jq对象:$(dom对象)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
随机推荐
- 小结OC中Retain cycle(循环引用)
retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于 ...
- spring 学习2
package com.asm; //...省略导入的相关类 public class MessageController implements Controller { public ModelAn ...
- ASP.NET MVC4.0 部署
EntifyFramework 5.0.0 安装 http://www.nuget.org/packages/EntityFramework/5.0.0 1. 文章,部署前的配置 http://www ...
- synchronized 与 Lock 的那点事
最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...
- acd LCM Challenge(求1~n的随意三个数的最大公倍数)
Problem Description Some days ago, I learned the concept of LCM (least common multiple). I've played ...
- 用C/C++扩展你的PHP(转)
简 介 英文版下载: PHP 5 Power Programming PHP取得成功的一个主要原因之一是她拥有大量的可用扩展.web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到.PHP发 ...
- Java 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- 自定义控件 进度条 ProgressBar-2
使用 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bqt ...
- WEB 开发所用的网站
常用前端手册: http://caniuse.com/ http://www.w3school.com.cn/ http://www.runoob.com/ http://www.css88.com/ ...
- a标签的onclick和href事件的区别
在执行顺序上href是低于onclick的,那么这个会造成什么影响呢 <div onclick="a()"> <a href="#" oncl ...