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>& ...
随机推荐
- MyEclipse中用Maven创建Web项目(亲测有效)
new --> other 1.Wizards: mvaen 2.Maven Project 3.Next Use Default Workspace Location 1.weba ...
- 自适应网页设计(Responsive Web Design)(转)
作者: 阮一峰 出处:http://www.ruanyifeng.com/blog/2012/05/responsive_web_design.html 随着3G的普及,越来越多的人使用手机上网. 移 ...
- 关于 视频同步vsync 信号在不同一时候钟域採样问题
今天调试 视频 4k(3840 x 1920)的vsync信号(时钟为 297Mhz) 进入 170Mhz 的时钟域, 发现输出来的信号信号抖动特别厉害.后来才发现这是不同一时候钟域 造成的影响. 快 ...
- android常用软件下载资源链接
最新内容请看:http://www.androiddevtools.cn/ https://github.com/inferjay/AndroidDevTools 官方adt下载地址:http://d ...
- 第一篇博客关于Log4net的配置记录
说明:本程序演示如何利用log4net记录程序日志信息.log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括M ...
- (七)《Java编程思想》——多态的缺陷
1.不能“覆盖”私有方法 package chapter8; /** * 不能"覆盖"私有方法 */ public class PrivateOverride { private ...
- 解决SQL Server 占用80端口
停用掉下面的服务就可以了:
- css margin重叠
父子元素margin(垂直方向)重叠 解决办法: 给子元素添加浮动属性,相应父元素添加必要的清浮动属性: 给父元素添加边缘属性,如padding.border: 同级元素margin(垂直方向)反向重 ...
- 如何在sqlserver建立新用户并关联相应的数据库
我们经常需要在数据库上建立有权限的用户,该用户只能去操作某个特定的数据库(比如该用户只能去读,去写等等),那么我们应该怎么在sqlserver上设置呢?下面的步骤有点长,只要一步一步跟着设置就行 方法 ...
- 在Java中兼容Windows和Linux的路径处理
Linux中的路径使用'/',而Windows下正好相反'\',Java提供了以系统属性的方式获取路径分隔符: System.getProperty("file.separator" ...