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. spring注解理解

    步骤一:编写web.xml文件,主要代码如下:<servlet> Java代码 <servlet-name>spmvc</servlet-name> <ser ...

  2. 认识ptrace函数

    认识ptrace函数 这是man对于ptrace这个系统调用的解释 http://man7.org/linux/man-pages/man2/ptrace.2.html #include <sy ...

  3. js解析json,js转换json成map,获取map的key,value

    json串格式 { "10.10.11.1": { "target_1": "34.2", "target_3": &q ...

  4. 华为OJ:2041 放苹果

    这道题难点不在于代码怎么写,而是思路怎么想. 感觉一般这样的题要么你理好一个思路要么你最后总结出一个公式,要么你自己模拟它的运作方式,用迭代,或者递归的方式来做. 有点像我们曾经学的排列组合. 对于m ...

  5. setTimeout 理解

    1.定义简介 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式.   function foo(){}; var id = setTimeout(foo,1000); //返回一 ...

  6. Centos 下mysql安装配置

    一.编译安装MySQL前的准备工作 安装编译源码所需的工具和库 yum install gcc gcc-c++ ncurses-devel perl 安装cmake,从http://www.cmake ...

  7. rhel Linux系统yum的配置

    yum是一个很方便的linux系统软件管理工具,但是很多新手还是不会配置yum,下面详细的介绍下yum的配置方法,其实很简单. 1.首先确保系统ISO镜像已经成功挂载,可以用df -h命令查看.2.创 ...

  8. 网页CSS1

    样式的属性 1,背景与前景 background-color: //背景的颜色 background-image:url //背景图片 background-attachment:fixed; //背 ...

  9. 网页HTML1

    表格表单 表格, <tabale>    -------表格 <tr>            --------------行 <td>             -- ...

  10. DataBase First创建数据库

    Entity Framework:ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,并提供了三种模式,分 ...