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

1004 Dividing This Product

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的更多相关文章

  1. 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 ...

  2. (字符串处理)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)  ...

  3. Hdu 5451 Best Solver (2015 ACM/ICPC Asia Regional Shenyang Online) 暴力找循环节 + 递推

    题目链接: Hdu  5451  Best Solver 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 解题思路: x的取值为[1, 232],看到这个指数,我的心情是异常崩 ...

  4. 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的距离是多少? 解题思路: 直觉告诉我 ...

  5. Hdu 5452 Minimum Cut (2015 ACM/ICPC Asia Regional Shenyang Online) dfs + LCA

    题目链接: Hdu 5452 Minimum Cut 题目描述: 有一棵生成树,有n个点,给出m-n+1条边,截断一条生成树上的边后,再截断至少多少条边才能使图不连通, 问截断总边数? 解题思路: 因 ...

  6. 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 ...

  7. 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) ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. 设计模式 -- 代理模式 (Proxy Pattern)

    定义: 为其他对象提供一种代理以控制对这个对象的访问: 角色: 1,抽象主题类,(接口或者抽象类),抽象真实主题和代理的共有方法(如下Subject类): 2,具体实现的主题类,继承或者实现抽象主题类 ...

  2. Unity3DGUI:鼠标click

    Input函数监测鼠标操作 鼠标点击事件 鼠标双击事件

  3. MVC 的 视图中 @section 是什么作用?

    可以定义一个渲染块,这个渲染块可以在LayoutPage里面引用,使用Html.RenderSection("section名称"); 可以指定一个bool参数指定如果Conten ...

  4. Delphi水晶横向竖向打印

    最近做一个打印项目,本来报表已经设为横向打印了,可是运行程序,打印出来的是竖向的,非要在打印机里再设定为横向,郁闷了很久,看看UCrpe32的源码之后,由于我重新封装了TCrpe,在TCrpe的派生类 ...

  5. 关于scanf()函数的一点理解

    习惯了c++的cin.cout之后,也不怎么关注空格,反正cin.cout会自动处理.有一次实验,创建Huffman树,要求输入空格字符,当时就懵逼了.cin咋输入空格呢? 没办法,只能重新用scan ...

  6. MSMQ小Demo

    Demo基于http://www.cnblogs.com/zhili/p/MSMQ.html Server代码: using System.Messaging; using System.Text; ...

  7. CMA-连续内存分配

    CMA: Contignous Memory Allocator,连续内存分配,一般是分配给Camera,HDMI等使用,避免预留大块内存 1.声明连续内存 使用dma_contignous_rese ...

  8. OAuth2.0 工作流程

    重要术语   Authorization Server:授权服务器,能够成功验证资源拥有者和获取授权,并在此之后分发令牌的服务器: Resource Server:资源服务器,存储用户的数据资源,能够 ...

  9. 重点+超详细:ajax和json及案例

    不用jQuery的ajax流程 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "ht ...

  10. HDU2571 命运 动态规划

    好久没更新博客了. 校内练习的一道水题 HDU2571 命运. 简单DP. 穿过幽谷意味着离大魔王lemon已经无限接近了!  可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫 ...