【题目大意】

给出一个n重循环,每重循环有范围$[l, r]$,其中$l$,$r$可能是之前的变量,也可能是常数。求循环最底层被执行了多少次。

其中,保证每个循环的$l$,$r$最多有一个是之前的变量。设所有常数最大值为C。

$1 \leq n \leq 26, 1\leq C \leq 10^5$

【题解】

发现构成了一个森林。

树形dp,稍微推一些循环交换顺序等等的性质,然后乘在一起就行了。

大概设f[x,i]表示到了x这个点,x的取值为i,x的子树的执行次数。

转移用个前缀和优化即可。复杂度$O(nC)$

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int M = 1e5 + , N = ;
const int mod = ; int n;
int l[N], r[N]; char str[N];
inline void gin(int &x) {
scanf("%s", str);
if(!isdigit(str[])) x = -(str[] - 'a' + );
else {
x = ;
for (int i=; str[i]; ++i) x = (x<<) + (x<<) + str[i] - '';
}
} int head[N], nxt[M], to[M], tot = ;
inline void add(int u, int v) {
++tot; nxt[tot] = head[u]; head[u] = tot; to[tot] = v;
}
inline void adde(int u, int v) {
// cout << u << " --> " << v << endl;
add(u, v), add(v, u);
} int f[N][M], s[N][M];
// 到了x这个点,x的取值为i
inline void dfs(int x, int fa = ) {
for (int i=; i<=; ++i) f[x][i] = ;
for (int i=head[x]; i; i=nxt[i]) {
if(to[i] == fa) continue;
dfs(to[i], x);
int y = to[i];
for (int j=; j<=; ++j) {
if(l[y] < ) {
if(j <= r[y]) f[x][j] = 1ll * f[x][j] * (s[y][r[y]] - s[y][j-]) % mod;
else f[x][j] = ;
}
if(r[y] < ) {
if(l[y] <= j) f[x][j] = 1ll * f[x][j] * (s[y][j] - s[y][l[y]-]) % mod;
else f[x][j] = ;
}
if(f[x][j] < ) f[x][j] += mod;
}
}
for (int i=; i<=; ++i) {
s[x][i] = s[x][i-] + f[x][i];
if(s[x][i] >= mod) s[x][i] -= mod;
// if(i <= 100) cout << x << ' ' << i << ' ' << f[x][i] << endl;
}
} int main() {
// freopen("car.in", "r", stdin);
// freopen("car.out", "w", stdout);
cin >> n;
for (int i=; i<=n; ++i) {
gin(l[i]), gin(r[i]);
// cout << l[i] << ' ' << r[i] << endl;
if(l[i] < ) adde(-l[i], i);
if(r[i] < ) adde(-r[i], i);
} ll ans = , times;
for (int i=; i<=n; ++i) {
if(l[i] < || r[i] < ) continue;
dfs(i);
ans = ans * (s[i][r[i]] - s[i][l[i]-]) % mod;
}
ans = (ans + mod) % mod;
cout << ans; return ;
}

「6月雅礼集训 2017 Day4」暴力大神hxx的更多相关文章

  1. 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...

  2. 「6月雅礼集训 2017 Day4」寻找天哥

    [题目大意] 给出$n$个三维向量,设当前向量长度为$L$,每次沿着向量等概率走$[0,L]$个长度.一个球每秒半径增加1个长度,直到覆盖位置,每秒耗能为球体积,求总耗能的期望. 设最后半径为R,那么 ...

  3. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  4. 「6月雅礼集训 2017 Day11」delight

    [题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...

  5. 「6月雅礼集训 2017 Day11」jump

    [题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...

  6. 「6月雅礼集训 2017 Day11」tree

    [题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...

  7. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  8. 「6月雅礼集训 2017 Day8」route

    [题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...

  9. 「6月雅礼集训 2017 Day8」gcd

    [题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. ...

随机推荐

  1. Python基础1 Hello World!

    从今天开始和大家分享一下python最基础的知识,以便帮助初学者快速入门. 最最基础的当然是hello world 了,无论哪门语言都会从它开始... 简单的‘Hello World!’ 1. 直接运 ...

  2. 算法与数据结构5.1 Just Sort

    ★实验任务 给定两个序列 a b,序列 a 原先是一个单调递增的正数序列,但是由于某些 原因,使得序列乱序了,并且一些数丢失了(用 0 表示).经过数据恢复后,找 到了正数序列 b ,且序列 a 中 ...

  3. 深入理解Java对象序列化(转载)

    原文地址:http://developer.51cto.com/art/201202/317181.htm 1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般 ...

  4. iOS开发SDWebImage源码解析之SDWebImageManager的注解

    最近看了两篇博客,写得很不错,关于SDWebImage源码解析之SDWebImageManager的注解: 1.http://www.jianshu.com/p/6ae6f99b6c4c 2.http ...

  5. css深入理解之 border

    一 border-width不支持百分比值 1 不符合客观逻辑 2 w3成都一种约定吧 3 边框本身就像是一个包裹内容的界限 类似的还有outline,box-shadow text-shadow均不 ...

  6. wine update错误 "the cache has no package" error when wine update is available

    网址:https://bugs.launchpad.net/pipelight/+bug/1318321/

  7. opencv里vector的内存的申请和释放的问题

    改成: ); CvSeq * m_contour=; cvFindContours( &IPlImage(img), m_storage, &m_contour, ,)); //释放内 ...

  8. TCP标志位简析

    TCP标志位简析   TCP标志位  URG:此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据: ACK:此标志表示应答域有效, ...

  9. [C/C++] C++模板定义格式

    函数模板的格式: template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表) { //函数体 } 类模板的格式为: template<c ...

  10. Andorid API Package ---> android

    包名: android                                                        Added in API level 1  URL:http:// ...