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. jenkins 杀死衍生进程

    解决方法-1: 在execute shell输入框中加入BUILD_ID=DONTKILLME,即可防止jenkins衍生进程 解决方法-2: 修改/etc/sysconfig/jenkins配置,在 ...

  2. WinForms 实现气泡提示窗口(转载)

    [实例说明] 气泡提示因为他的美观又好被大多数用户所接收,用户所喜爱的就是程序员要实现的. 本实例实现了任务栏气泡提示,运行本实例,效果图如下所示: 单击提示.气泡提示就会显示,单击“关闭”气泡又会消 ...

  3. PAT乙级1027. 打印沙漏(20)

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两 ...

  4. scale-free network

    原文链接:http://lihailian.bokee.com/6013647.html 1.什么是无尺度现象? 统计物理学家习惯于把服从幂次分布的现象称为无尺度现象. 在做大量统计实验之前,科学家预 ...

  5. [DP之普通系列]

    noip快要来了 要练练dp 难度也挺接近 还是挺好的 [Usaco2013 Nov]Pogo-Cow 这一道题要下一段大于这一段 所以的话我们就要记录每一段的状态 F[i,j]=F[j,k]+A[i ...

  6. 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 转载

    最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在chrome,firefox,safari,opera,360浏览器(极速模式).搜狗浏览器等浏览器下均没 ...

  7. scala实现快速排序

    scala> def qSort(a: List[Int]): List[Int] = { | ) a | else qSort( a.filter(a.head > _ )) ++ | ...

  8. Saltstack 常用的模块及API

    Saltstack提供了非常丰富的功能模块,设计操作系统的基础功能,常用工具支持等, 官网模块介绍 http://docs.saltstack.com/ref/modules/all/index.ht ...

  9. meta小解

    meta是html中的一个辅助标签,位于<head>与<title>之间,它能提供用户不可见的信息,数据结构为键值对 meta标签格式<meta http-equiv/n ...

  10. Windows Shell(外壳)编程相关

    Windows Shell名字空间介绍: http://blog.csdn.net/kingcom_xu/article/details/18943 Windows Shell 外壳编程基础教程(C# ...