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. BootStrap--模态框中 上传图片

    问题:在模态框中添加图片并不会得到你上传图片的名称,无法存到数据 下面介绍两个方法,都是可以得到图片名称的. 第一种   前面如何加载模态框就不写了,上篇有写,这里只是为得到图片写的 //需要添加一个 ...

  2. [深入React] 7.组件生命周期

    生命周期一共分三段:初始化,运行中,销毁.按照顺序: 初始化 getDefaultProps():Object 全局只会调用一次,为当前类生成的默认props,会被父组件传入的同名props覆盖. g ...

  3. 使用JMeter做压力测试

    使用JMeter做压力测试 1.下载Jmeter 地址:http://jmeter.apache.org/download_jmeter.cgi 2.启动jmeter 运行bin/jmeter.bat ...

  4. jQuery之简单动画效果

    1. show()显示动画 语法:show(speed,callback) Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slow",&quo ...

  5. Java基础知识强化40:StringBuffer类之StringBuffer的替换功能

    1. StringBuffer的替换功能: public  StringBuffer   replace(int  start,  int  end, String  str): 2. 案例演示: p ...

  6. Shell-WEB目录监控

    #!/bin/sh #date:2015-12-08 #filename:check_webfile.sh #作者:李兴利 #Email:1162572407@qq.com #version:v1.1 ...

  7. linux伪文件与proc文件

    linux/unix系统的文件类型大致可分为三类:普通文件.目录文件和伪文件.常见的伪文件分别是特殊文件.命名管道及proc文件. 伪文件不是用来存储数据的,因此这些文件不占用磁盘空间,尽管这些文件确 ...

  8. DataGrid( 数据表格) 组件[8]

    本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于Panel(面板).Resizeable(调整大小).LinkButton(按钮).Pageination( ...

  9. ado.net 数据库连接的两方式种

    DataAdapter: string connectionString = "data source=127.0.0.1;Database=dong;user id=sa;password ...

  10. ASP.net 前台页面通过ID获取控件

    asp.net的服务器控件的ID通常只能在服务器端很好的识别,客户端需要通过ClientID获得控件 1.通过js获得   var controlID = "<%=controlID. ...