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 ...
随机推荐
- 常用的html标签大全
html标签大全 一.文字 1.标题文字 <h#>..........</h#> #=1~6:h1为最大字,h6为最小字 2.字体变化 <font>........ ...
- 关于 Unchecked cast from Iterator to Iterator String 提示
遇到个这个提示:Unchecked cast from Iterator to Iterator String Iterator<String> keys = data.keys(); 修 ...
- CodeForces 707C Pythagorean Triples
数学,构造. 这题比较有意思,一开始没发现结论写了一个最坏复杂度为$O({10^9})$暴力居然能$AC$,正因为如此,我才发现了规律. 一开始是这么想的: 先假设$n$为直角边,设斜边长度为$c$, ...
- SAP HANA 创建属性视图
[Step By Step]SAP HANA创建属性视图(Attribute View) Demo Instruction: 从一张用户信息表中组合出相信地址. 1. 在modeler窗口中,找到相应 ...
- python hmac-sha1
def getSignature(Token,paramss1): s = getParam(paramss1) print(s) # for k, v in paramss1.items(): # ...
- 关于function
场景:让用户输入一个数字,程序由1+2....一直累加到用户输入的数字为止 #!/bin/bashPATH=$PATH:~/scriptexport PATH #chech whether the i ...
- javascript keycode
keycode 8 = BackSpace BackSpacekeycode 9 = Tab Tabkeycode 12 = Clearkeycode 13 = Enterkeyc ...
- SQL优化 总结 精简
索引: 考虑在 where 及 order by 涉及的列上建立索引 经常同时存取多列,且每列都含有重复值可考虑建立组合索引,且查询越频繁的字段放前面 按需使用聚集与非聚集索引,聚集不适合频繁更新.适 ...
- laravel php artisan migrate 数据迁移时出现的[HY000][1045]错误
(zz找了块一个小时才发现)主要的错误在于.env文件和database.php的配置不匹配. 1.找到.env文件 2.更改数据库表账密 3.改database.php的数据库账密 4.完成
- 【第五篇】Volley代码修改之图片二级缓存以及相关源码阅读(重写ImageLoader.ImageCache)
前面http://www.cnblogs.com/androidsuperman/p/8a157b18ede85caa61ca5bc04bba43d0.html 有讲到使用LRU来处理缓存的,但是只是 ...