2015 ACM/ICPC Asia Regional Shenyang Online
1001 Traversal
1002 Best Solver
1003 Minimum Cut
类似于POJ 3417的做法。
考虑每条新边对树边的覆盖次数。
每条树边被覆盖的次数其实就是断裂这条树边后还需断裂的新边数。
定义dp[i]为节点i向树根方向的边被新边覆盖次数。离线LCA后树DP。
答案为dp[2]~dp[n]中的最小值+1。
# include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
using namespace std;
# define CLR(x) memset(x,,sizeof(x))
# define INF
const int maxn=+,maxm=+;
int tot[],h[][maxn],dp[maxn],pa[maxn];
bool vis[maxn]; struct node
{
int to,pre;
} edge[][maxm<<]; void add(int op,int from,int to)
{
tot[op]++;
edge[op][tot[op]].pre=h[op][from];
edge[op][tot[op]].to=to;
h[op][from]=tot[op];
} int Find(int x)
{
return pa[x]==x?x:pa[x]=Find(pa[x]);
} void LCA(int x,int f)
{
for(int i=h[][x];i;i=edge[][i].pre)
{
int to=edge[][i].to;
if(to==f) continue;
LCA(to,x);
pa[to]=x;
}
vis[x]=;
for(int i=h[][x];i;i=edge[][i].pre)
{
int to=edge[][i].to;
if(vis[to]) dp[Find(to)]-=;
}
return;
} void dfs(int pos,int f)
{
for(int i=h[][pos];i;i=edge[][i].pre)
{
int to=edge[][i].to;
if(to==f) continue;
dfs(to,pos);
dp[pos]+=dp[to];
}
for(int i=h[][pos];i;i=edge[][i].pre)
{
int to=edge[][i].to;
if(!vis[to]) continue;
dp[pos]++; dp[to]++;
}
vis[pos]=;
return;
} int main(void)
{
int T; cin>>T;
for(int kase=;kase<=T;kase++)
{
int n,m; scanf("%d%d",&n,&m);
CLR(tot); CLR(h); CLR(vis); CLR(dp);
for(int i=;i<n-;i++)
{
int a,b; scanf("%d%d",&a,&b);
add(,a,b); add(,b,a);
}
for(int i=n-;i<m;i++)
{
int a,b; scanf("%d%d",&a,&b);
add(,a,b); add(,b,a);
}
for(int i=;i<=n;i++) pa[i]=i;
LCA(,); dfs(,);
int ans=INF;
for(int i=;i<=n;i++) ans=min(ans,dp[i]);
printf("Case #%d: %d\n",kase,ans+);
}
return ;
}
Aguin
1005 Excited Database
把每条斜对角线看成一个点。主副两个方向分别建一颗线段树。
线段树的每个节点维护a[i]的和、i*a[i]的和、(2*n-i)*a[i]的和。
每次询问分别计算主副两个方向的增值。
询问的矩形拆成两个三角形和一个平行四边形。
三角形覆盖可以分别用i*a[i]与(2*n-i)*a[i]做差计算。
平行四边形覆盖直接用a[i]乘边长即可。

如图假设要用一颗线段树求虚线框内副对角线方向的贡献。
拆成两个蓝三角和一个灰色平行四边形。
左上的蓝三角用i*a[i]处理。转化成一个大三角减去黄三角再减去两个绿色平行四边形。
右下同理用(2*n-i)*a[i]类似的处理。
中间平行四边形直接用a[i]乘矩形高。
主对角线方向的一样处理。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
#define now tree[op][pos]
#define ls tree[op][pos*2]
#define rs tree[op][pos*2+1]
#define maxn 400010
int n; struct node
{
int l,r;
LL a,ia,na,tag;
} tree[][maxn<<]; void build(int op,int pos,int l,int r)
{
now.l=l; now.r=r;
now.a=now.ia=now.na=;
if(l<r)
{
build(op,pos*,l,(l+r)/);
build(op,pos*+,(l+r)/+,r);
}
return;
} void pushdown(int op,int pos)
{
if(now.tag)
{
ls.tag+=now.tag;
ls.a+=(LL)(ls.r-ls.l+)*now.tag;
ls.ia+=(LL)(ls.l+ls.r)*(LL)(ls.r-ls.l+)/*now.tag;
ls.na+=(LL)(*n-ls.l-ls.r)*(LL)(ls.r-ls.l+)/*now.tag;
rs.tag+=now.tag;
rs.a+=(LL)(rs.r-rs.l+)*now.tag;
rs.ia+=(LL)(rs.l+rs.r)*(LL)(rs.r-rs.l+)/*now.tag;
rs.na+=(LL)(*n-rs.l-rs.r)*(LL)(rs.r-rs.l+)/*now.tag;
now.tag=;
}
return;
} void pushup(int op,int pos)
{
now.a=ls.a+rs.a;
now.ia=ls.ia+rs.ia;
now.na=ls.na+rs.na;
return;
} void update(int op,int pos,int l,int r)
{
if(now.l>=l&&now.r<=r)
{
now.tag++;
now.a+=(LL)(now.r-now.l+);
now.ia+=(LL)(now.l+now.r)*(LL)(now.r-now.l+)/;
now.na+=(LL)(*n-now.l-now.r)*(LL)(now.r-now.l+)/;
return;
}
pushdown(op,pos);
if(l<=(now.l+now.r)/) update(op,*pos,l,r);
if(r>=(now.l+now.r)/+) update(op,*pos+,l,r);
pushup(op,pos);
return;
} LL query(int op,int pos,char c,int l,int r)
{
if(l<=now.l&&r>=now.r)
{
if(c=='a') return now.a;
if(c=='i') return now.ia;
if(c=='n') return now.na;
}
LL ret=;
pushdown(op,pos);
if(l<=(now.l+now.r)/) ret+=query(op,pos*,c,l,r);
if(r>=(now.l+now.r)/+) ret+=query(op,pos*+,c,l,r);
return ret;
} int main(void)
{
int T; cin>>T;
for(int kase=;kase<=T;kase++)
{
int q;
scanf("%d%d",&n,&q);
printf("Case #%d:\n",kase);
build(,,,*n-);//-1
build(,,,*n-);//+n
for(int i=;i<q;i++)
{
int type;scanf("%d",&type);
if(type==)
{
int L,R;
scanf("%d%d",&L,&R);
update(,,L-,R-);
}
else if(type==)
{
int L,R;
scanf("%d%d",&L,&R);
update(,,L+n,R+n);
}
else
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
int w=y2-y1+,h=x2-x1+;
LL ans=;
if(w>=h)
{
ans+=query(,,'i',x1+y1-,x2+y1-);
ans-=query(,,'a',x1+y1-,x2+y1-)*(LL)(x1+y1-);
ans+=query(,,'n',x1+y2,x2+y2-);
ans-=query(,,'a',x1+y2,x2+y2-)*(LL)(*n-x2-y2);
ans+=query(,,'a',x2+y1-,x1+y2-)*(LL)h;
ans+=query(,,'i',x1-y2+n,x2-y2+n-);
ans-=query(,,'a',x1-y2+n,x2-y2+n-)*(LL)(x1-y2+n-);
ans+=query(,,'n',x1-y1+n+,x2-y1+n);
ans-=query(,,'a',x1-y1+n+,x2-y1+n)*(LL)(y1-x2+n-);
ans+=query(,,'a',x2-y2+n,x1-y1+n)*(LL)h;
}
else
{
ans+=query(,,'i',x1+y1-,x1+y2-);
ans-=query(,,'a',x1+y1-,x1+y2-)*(LL)(x1+y1-);
ans+=query(,,'n',x2+y1,x2+y2-);
ans-=query(,,'a',x2+y1,x2+y2-)*(LL)(*n-x2-y2);
ans+=query(,,'a',x1+y2-,x2+y1-)*(LL)w;
ans+=query(,,'i',x1-y2+n,x1-y1+n-);
ans-=query(,,'a',x1-y2+n,x1-y1+n-)*(LL)(x1-y2+n-);
ans+=query(,,'n',x2-y2+n+,x2-y1+n);
ans-=query(,,'a',x2-y2+n+,x2-y1+n)*(LL)(y1-x2+n-);
ans+=query(,,'a',x1-y1+n,x2-y2+n)*(LL)w;
}
printf("%I64d\n",ans);
}
}
}
return ;
}
Aguin
1006 Fang Fang
水题。有c从c开始。没c数f。
!!注意可能有cf以外的字符。
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
# define maxn
char s[maxn]; int main(void)
{
int T; cin>>T;
for(int kase=;kase<=T;kase++)
{
scanf("%s",s);
int m=strlen(s);
int ok=,pos=;
for(int i=;i<m;i++)
{
if(s[i]!='c'&&s[i]!='f') {ok=;break;}
if(s[i]=='c') pos=i;
}
int mode=,num=,ans=;
if(ok) for(int i=;i<m;i++)
{
if(s[(pos+i)%m]=='c')
{
if(mode==&&num<) {ok=;break;}
mode=; ans++;
num=;
}
else
{
if(mode==) num++;
else
{
if(num==) {ans++; num++;}
else num--;
}
}
}
if(mode==&&num<) ok=;
printf("Case #%d: %d\n",kase,ok?ans:-);
}
return ;
}
Aguin
1007 Matches Puzzle Game
1008 Hold Your Hand
1009 Stability
1010 Jesus Is Here
递推。中间过程会用到每个串的长度,串中c的个数,c到左右的距离和。步步取mod。
转移式见代码。
# include <iostream>
# include <cstdio>
using namespace std;
# define maxn
typedef long long LL;
const LL mod=;
LL ans[maxn],l[maxn],r[maxn];
LL cnt[maxn],len[maxn]; int main(void)
{
len[]=; len[]=; len[]=;
cnt[]=; r[]=;
for(int i=;i<=;i++)
{
len[i]=(len[i-]+len[i-])%mod;
cnt[i]=len[i-];
l[i]=(l[i-]+l[i-]+cnt[i-]*len[i-])%mod;
r[i]=(r[i-]+r[i-]+cnt[i-]*len[i-])%mod;
ans[i]=(ans[i-]+ans[i-]+cnt[i-]*cnt[i-]+cnt[i-]*r[i-]+cnt[i-]*l[i-])%mod;
}
int T; cin>>T;
for(int kase=;kase<=T;kase++)
{
int x; scanf("%d",&x);
printf("Case #%d: %d\n",kase,ans[x]);
}
return ;
}
Aguin
1011 Poker
1012 Largest Point
1013 Manors
2015 ACM/ICPC Asia Regional Shenyang Online的更多相关文章
- HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...
- (字符串处理)Fang Fang -- hdu -- 5455 (2015 ACM/ICPC Asia Regional Shenyang Online)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5455 Fang Fang Time Limit: 1500/1000 MS (Java/Others) ...
- Hdu 5451 Best Solver (2015 ACM/ICPC Asia Regional Shenyang Online) 暴力找循环节 + 递推
题目链接: Hdu 5451 Best Solver 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 解题思路: x的取值为[1, 232],看到这个指数,我的心情是异常崩 ...
- Hdu 5459 Jesus Is Here (2015 ACM/ICPC Asia Regional Shenyang Online) 递推
题目链接: Hdu 5459 Jesus Is Here 题目描述: s1 = 'c', s2 = 'ff', s3 = s1 + s2; 问sn里面所有的字符c的距离是多少? 解题思路: 直觉告诉我 ...
- Hdu 5452 Minimum Cut (2015 ACM/ICPC Asia Regional Shenyang Online) dfs + LCA
题目链接: Hdu 5452 Minimum Cut 题目描述: 有一棵生成树,有n个点,给出m-n+1条边,截断一条生成树上的边后,再截断至少多少条边才能使图不连通, 问截断总边数? 解题思路: 因 ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元
hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp
QSC and Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp
odd-even number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...
随机推荐
- 虚拟机在 OpenStack 里没有共享存储条件下的在线迁移[转]
原文链接:http://www.ibm.com/developerworks/cn/cloud/library/1508_wangyx_openstacklivemigrate/ 迁移(Migrati ...
- Chapter 17_2 备忘录函数
一项通用的编程技术:用空间换时间. 例如有一种做法就可以提高一些函数的运行速度,记录下函数计算的结果,当再次调用该函数时,便可以复用之前的结果. 比如,一个普通服务器,在它收到请求中包含Lua代码,会 ...
- from表单实现无跳转上传文件,接收页面后台数据。
本文基于我刚写的http://www.cnblogs.com/iwang5566/p/6287529.html进行了简单的扩展,实现页面无跳转表单数据提交,并接收后台返回的数据. 下载好,上一篇文章d ...
- Hibernate 注解说明
转:http://blog.csdn.net/u012312373/article/details/46566081 1.类级别注解 @Entity 映射实体类 @Table 映 ...
- Multidimensional Array And an Array of Arrays
One is an array of arrays, and one is a 2d array. The former can be jagged, the latter is uniform. T ...
- zTree 勾选checkbox
zTree 勾选checkbox var setting = { check: { enable: true// chkboxType : { "Y&quo ...
- APP性能测试工具
各种自动化工具作用: 自动化:appium 针对接口做压测:jmeter 执行一段脚本,随机乱点:monkey 如果有用loadrunner12的话 也可以用mobilerecoder录制脚本(lr1 ...
- 《JavaScript高级程序设计》读书笔记 ---创建对象
虽然Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用工厂模式的一种变体. 工厂模式工厂 ...
- XPath相关笔记
<?xml version="1.0" encoding="utf-8" ?> <employees> <employee o ...
- C#键盘事件处理
键盘事件是在用户按下键盘上的一个键的时候发生的,可分为两类.第一类是KeyPress事件,当按下的键表示的是一个ASCII字符的时候就会触发这类事件,可通过他的KeyPressEventArgs类型参 ...