玲珑杯 ACM Round #12
A
=w=
B
占坑
C
题意:有长度为n的序列A和长度为n的序列W,以及一个G,对于Ui,1<=Ui<=Wi,求Σgcd(Ai,Ui)=G的方案数,n<=1e3,Ai<=1e5,Wi<=1e5,G<=1e3
分析:递推
f(i,j)表示前i位,当前和为j的方案数
f(i,j)=Σf(i-1,j-gcd(Ai,k))
这样直接搞是会TLE
注意到我们如果对于一个Ai能预处理求出gcd(Ai,k)的所有种类和个数,那么时间就允许了
考虑Ai、Wi,首先筛出Ai的所有因子,然后use[x]表示gcd为x出现了几次,这个可以根据容斥直接暴力得出
D
占坑
E
题意:有一个n个节点的树(n<=1e5),每个节点都有颜色,每种颜色最多有20个点。一条可行路径上的点所有颜色都不同,求这样可行路径的条数。
分析:dfs序+线段树+扫描线
注意每种颜色最多有20个点
首先求出dfs序
那么可以枚举两两相同颜色的点,考虑有多少条路径存在这两个点
很明显这是一个容斥问题,但这容斥不好求
有一个很神奇的idea,就是通过dfs序,可以知道这些路径的起点和终点都是dfs序对应的一段区间,可以映射到平面的一块矩形
那么问题就是求这些矩形的面积并!
注意这里其实是求点矩阵的并,可以不用乘上两条边的距离,直接按x方向求出当前y方向的有多少个位置点的覆盖数>=1
至于这个用线段树维护,维护mi[k]和num[k]表示最小值和与最小值相同的位置数量
注意此题刚开始遍历图要写非递归,不然要爆栈
#include<cstring>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=1e5,inf=1e9;
int n,q,cnt=,t=,MAX=;
int deep[maxn+],fa[maxn+][],head[maxn+];
int L[maxn+],R[maxn+];
int mi[maxn*+],lazy[maxn*+],num[maxn*+];
vector<int> g[maxn+];
vector<int> color[maxn+];
stack<int> s;
struct wjmzbmr
{
int y1,y2;
};
vector<wjmzbmr> inc[maxn+],dec[maxn+];
void dfs(int k,int last)
{
/* L[k]=++t;
deep[k]=deep[last]+1;
fa[k][0]=last;
for(int i=0;i<g[k].size();++i)
if(g[k][i]!=last) dfs(g[k][i],k);
R[k]=t;*/
while(!s.empty()) s.pop();
memset(head,,sizeof(head));//head[i]表示第i个点当前遍历到了第几个相邻点
s.push();
s.push();
while(s.size()>)
{
int k=s.top();
s.pop();
int last=s.top();
s.push(k);
if(!head[k])
{
L[k]=++t;
deep[k]=deep[last]+;
fa[k][]=last;
}
if(head[k]<g[k].size())
if(g[k][head[k]]==last) ++head[k];
if(head[k]==g[k].size())
{
R[k]=t;
s.pop();
}
else
s.push(g[k][head[k]++]);
}
}
int lca(int x,int y)
{
if(deep[x]<deep[y]) swap(x,y);
int d=deep[x]-deep[y];
for(int i=;i>=;i--)
if((<<i)&d) x=fa[x][i];
for(int i=;i>=;i--)
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
if(x==y)return x;else return fa[x][];
}
int low(int u,int v)
{
int d=deep[v]-deep[u]-;
for(int i=;i>=;i--)
if((<<i)&d) v=fa[v][i];
return v;
}
void insert(int x1,int x2,int y1,int y2)
{
if(x1>x2||y1>y2) return;
//printf("%d %d %d %d\n",x1,x2,y1,y2);
inc[x1].push_back({y1,y2});
dec[x2+].push_back({y1,y2});
}
void build(int k,int l,int r)
{
if(l>r) return;
if(l==r)
{
num[k]=;
return;
}
num[k]=r-l+;
int mid=(l+r)>>;
build(k+k,l,mid);
build(k+k+,mid+,r);
}
void pushdown(int k)
{
int l=k+k,r=k+k+;
lazy[l]+=lazy[k],mi[l]+=lazy[k];
lazy[r]+=lazy[k],mi[r]+=lazy[k];
lazy[k]=;
}
void update(int k)
{
int l=k+k,r=k+k+;
mi[k]=min(mi[r],mi[l]);
num[k]=;
if(mi[l]==mi[k]) num[k]+=num[l];
if(mi[r]==mi[k]) num[k]+=num[r];
}
void add(int k,int l,int r,int x,int y,int num)
{
if(l>r||r<x||l>y) return;
if(x<=l&&r<=y)
{
lazy[k]+=num;
mi[k]+=num;
return;
}
if(l==r) return;
int mid=(l+r)>>;
pushdown(k);
add(k+k,l,mid,x,y,num);
add(k+k+,mid+,r,x,y,num);
update(k);
}
int query()
{
if(mi[]) return ;else return num[];
}
int main()
{
/*int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));*/
freopen("ce.in","r",stdin);
//freopen("ce.out","w",stdout);
scanf("%d",&n);
// printf("ok");
for(int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=;i<=n;++i)
{
int x;
scanf("%d",&x);
color[x].push_back(i);
cnt=max(cnt,x);
}
dfs(,);
for(int k=;k<=;++k)
for(int i=;i<=n;++i)
fa[i][k]=fa[fa[i][k-]][k-];
for(int c=;c<=cnt;++c)
{
for(int i=;i<color[c].size();++i)
for(int j=i+;j<color[c].size();++j)
{
int u=color[c][i],v=color[c][j];
if(deep[u]>deep[v]) swap(u,v);
if(lca(u,v)!=u) insert(L[u],R[u],L[v],R[v]),insert(L[v],R[v],L[u],R[u]);
else
{
int x=low(u,v);
insert(,L[x]-,L[v],R[v]);
insert(R[x]+,n,L[v],R[v]);
insert(L[v],R[v],,L[x]-);
insert(L[v],R[v],R[x]+,n);
}
}
}
build(,,n);
long long ans=;
for(int i=;i<=n;++i)
{
for(int j=;j<inc[i].size();++j) add(,,n,inc[i][j].y1,inc[i][j].y2,);
for(int j=;j<dec[i].size();++j) add(,,n,dec[i][j].y1,dec[i][j].y2,-);
ans+=1LL*query();
}
printf("%lld\n",(ans-n)/);
return ;
}
玲珑杯 ACM Round #12的更多相关文章
- 玲珑杯 ACM Round #10
A 题意:给长度为n的序列染黑白色,要求连续的黑的格子数量<=a,连续的白的格子数量<=b,问方案总数,有多个询问 分析:递推 注意数据范围,是可以O(n)做的,所以可以直接递推 B 题意 ...
- 【Henu ACM Round #12 E】Thief in a Shop
[链接] 我是链接,点我呀:) [题意] n个物品,每个物品都有无限个. 第i个物品的价格是一样都,都是ai 让你从中选出恰好k个物品 问你选出的物品的总价值 有多少种不同的可能. [题解] 可以用f ...
- 【Henu ACM Round #12 D】 Longest Subsequence
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 记录每个数字出现的次数cnt[x]; (大于1e6的直接忽略) 另外用一个数组z[1e6] 然后for枚举x 第二层for枚举x的倍 ...
- 【Henu ACM Round #12 C】 Alice, Bob, Two Teams
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑任意两个字符串(a,b) 假设a在b的前面 那么如果a+b>=b+a 这里的+表示字符串的链接 那么显然需要交换a,b的位 ...
- 【Henu ACM Round #12 B】 Alice, Bob, Two Teams
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个前缀和 和 一个后缀和. (即前i个字符A所代表的数字的和以及前i个字符B所代表的数字的和.. 然后枚举前i个字符翻转. 求B对 ...
- 【Henu ACM Round #12 A】 Grandma Laura and Apples
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 知道题意之后就是一个模拟的过程了. 用int now记录当前苹果的个数.bool flag记录是否有小数(即半个苹果) (这样处理为 ...
- “玲珑杯”ACM比赛 Round #12题解&源码
我能说我比较傻么!就只能做一道签到题,没办法,我就先写下A题的题解&源码吧,日后补上剩余题的题解&源码吧! A ...
- “玲珑杯”ACM比赛 Round #18
“玲珑杯”ACM比赛 Round #18 Start Time:2017-07-15 12:00:00 End Time:2017-07-15 15:46:00 A -- 计算几何你瞎暴力 Time ...
- “玲珑杯”ACM比赛 Round #19题解&源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】
A -- simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 SAMPLE INPUT ...
随机推荐
- web项目无法部署到eclipse配置的本地tomcat
一.发现问题 在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并 ...
- 239 Sliding Window Maximum 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位.例如,给定 nums = [1,3,-1,-3, ...
- Hadoop的数据采集框架
问题导读: Hadoop数据采集框架都有哪些? Hadoop数据采集框架异同及适用场景? Hadoop提供了一个高度容错的分布式存储系统,帮助我们实现集中式的数据分析和数据共享.在日常应用中我们比如要 ...
- JavaScript 兼容新旧版chrome和firefox的桌面通知
1.新/旧版本的chrome和firefox都可支持,IE下不支持因此设置为了在最小化窗口处闪烁显示提示文字. 2.设置为提示窗口显示5秒即关闭. 3.可设置图标和点击提示窗口要跳转到的页面(见输入参 ...
- mybatis使用中类属性名和数据库表字段名问题
起初我以为上述二者必须一致,后来发现也是可以像Hibernate那样在xml文件中进行映射的. <mapper namespace="com.tenghu.mybatis.model. ...
- 百度地图API在vue-cli中路径错误的问题
在使用百度地图的时候,需要使用自定义的icon图片,百度的案例中使用的是线上地址,但当替换为本地图片路径的时候,错误出现了 这是本地图片地址 ) // 设置覆盖物大小 ); 这里有一点需要注意,这里路 ...
- phpstudy初级总结
1.问题一 问题症状:访问http://localhost/phpMyWind/install/不出现安装或登录页面 考虑一下情况: 1.是否打开了PHPstudy, (当Apache不能启用时,考虑 ...
- Android常见问题总结(二)
1.布局文件LinearLayout线性布局添加内容报错. 解决方法: 线性布局LinearLayout中包裹的元素多余1个需要添加android:orientation属性. 2.android 的 ...
- python __slots__ 详解(上篇)
转自:http://blog.csdn.net/sxingming/article/details/52892640 python中的new-style class要求继承Python中的一个内建类型 ...
- Java 基础入门随笔(11) JavaSE版——继承、覆盖、抽象类
1.面向对象的特征二:继承 定义: 指一个对象直接使用另一对象的属性和方法. 继承好处: 1.提供代码的复用性. 2.让类与类直接产生了关系,给第三个特征多态提供了前提. java中支持单继承.不直接 ...