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. Java 彩色图转灰度图

    1. 方法1 BufferedImage grayImage = new BufferedImage(width, height, colorImage.TYPE_BYTE_GRAY); Graphi ...

  2. 【IIS】windows2008 ii7 设置访问网站提示帐号密码登录

    3个步骤: 1.添加windows身份验证: windows2008默认是不启用的,需要我们自己去启动,在管理工具 - 服务器管理- 角色 ,拉下去,下面有个[添加角色服务],安全性- Windows ...

  3. MySql 安装过程(摘自网络)

    下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下! 打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩, 运行“setup.exe”,出现如下界面 ...

  4. Openjudge-NOI题库-垂直直方图

    题目描述 Description 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数.严格地按照输出样例来安排你的输出格式. ...

  5. 防范CSRF(一)

    CSRF是跨网站伪造请求的缩写.大致的攻击流程是,黑客获得浏览器向服务器发送的请求,然后对请求进行修改,让服务器执行指定的操作. 防范方式可以使用微软提供的解决方案. View放置Html.AntiF ...

  6. workerman简单例子

    workerman下载地址 http://www.workerman.net/ html <!DOCTYPE html> <html> <head> <tit ...

  7. power oj 2480 放积木[二进制状压DP]

    题目链接[https://www.oj.swust.edu.cn/problem/show/2480] 题意:中文题目. 题解:二进制状态转移+坏点判断. #include<cstdio> ...

  8. mysql innodb存储引擎和myisam引擎

    InnoDb存储引擎面向在线事务处理,其特点是行锁设计.支持外键.并支持Oricle似得非锁定读(所谓非锁定读是如果数据库实例读取的行正在进行更新或删除操作当前读取不会等待当前锁的释放而是读取当前行的 ...

  9. Acer VN7 Win10小键盘修改

    由于 Home End 正常位置太远, NumberLock 容易误按, 故设置win10 键位映射如下图

  10. C语言 · 区间K大数查询

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...