標籤:樹形dp,字首和
暴力大神hxx
題目描述
最近連續幾場考試,hxx作為暴力組大神,連續用暴力a了幾道神題,令某些寫正解的大神很不爽。但是當大神們去詢問hxx暴力的方法的時候,hxx每次都會機智地說:「多重迴圈擺在這裡了,我怎麼知道為啥不超時!」機智的hxx可能通過某種方法隱藏他的高超暴力手段。作為大神的你趕快去揭穿他。但是他確實把多重迴圈擺在那裡了。一種可行的揭穿手段是直接計算他程式的迴圈次數。現在給你他的主要複雜度所在的迴圈。如下:
for(int a=x[1];a<=y[1];a++)
for(int b=x[2];b<=y[2];b++)
… for(int z=x[26];z<=x[26];z++)
乙個計算語句
(x[i],y[i];可能是乙個常數,也可能是之前出現過的迴圈變數,但是對於同一層迴圈的起始和終止點,至少有乙個是常數)
你需要計算那個計算語句被執行了多少次?由於答案有點大所以(ans%12015858)
輸入格式
第一行乙個數n 表示有幾重迴圈
接下來n行表示第 i行的x[i]和y[i]
輸出格式(car.out)
乙個數,表示本題的答案。
樣例輸入:
3 1 100
a 100
20 b
樣例輸出
243540
資料範圍:
對於 20% 的資料:1 ≤ n, xi, yi ≤ 20。
另 10% 的資料: yi為常數
對於 50% 的資料:1 ≤ xi, yi ≤ 1 000。(包括以上)
對於 100% 的資料:1 ≤ n ≤ 26,1 ≤ xi, yi ≤ 100 000
p.s.(
此題是送分題哦,大家盡情的虐吧!
ac了的同學,可以來想想這個資料範圍。由於某種原因所以沒有出在題目裡面。
n<=100;xi,yi<=10^18;資料都保證合法
)考試的時候沒有手玩出來,這題爆零了qwq
第i層迴圈和i-1層直接相關,和之前的層數間接相關
可以想到樹形dp
f[x][i]表示第x層迴圈取值為i時的計算結果
對於迴圈l,r中存在變數的,可以建邊,將那個變數所在迴圈向這層迴圈建邊
轉移詳見dfs過程
但是還要加入字首和優化,否則會tle
#include
#include
#include
#include
#include
#include
#define rep(i,a,b) for(ll i=a;i<=b;i++)
#define dep(i,a,b) for(ll i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#define reg(x) for(int i=last[x];i;i=e[i].next)
using
namespace
std;
inline ll read()
while(ch>='0'&&ch<='9')
return x*f;
}const
int maxn=1e5+6,p=12015858;
ll f[27][maxn],n,last[maxn],cnt=0,l[maxn],r[maxn];
ll ans=1;
char ch[10];
bool vis[maxn];
struct edgee[maxn<<1];
void insert(ll u,ll v);last[u]=cnt;
}void dfs(int x)//該層迴圈已經超出範圍
if(!r[e[i].to])f[x][k]=1ll*f[x][k]*(f[e[i].to][k]-f[e[i].to][l[e[i].to]-1])%p;
else f[x][k]=1ll*f[x][k]*(f[e[i].to][r[e[i].to]]-f[e[i].to][k-1])%p;
}f[x][k]=(f[x][k]+p)%p;
}rep(i,1,maxn-1)f[x][i]=(f[x][i]+f[x][i-1])%p;//字首和累和
}int main()
rep(i,1,n)
if(!vis[i])
cout
<<(ans+p)%preturn
0;}
雅禮國慶集訓
灑落君臣契,飛騰戰伐名。杜甫 公安縣懷古 noip 前的乙個月。這浸滿熱血的虔信,真的會化作墓碑嗎?或許明日我們不再是戰友,但人生終將有無數個此時。define f z,u,v for int z u des z v z des z z struct bnd struct tup template ...
雅禮集訓 2017 價
傳送門 乙個不太顯然的最小割做法。我們這麼連邊 源點向藥物連 infty p i 容量的邊,藥物向它對應的藥材連 infty 容量的邊,藥材向匯點連 infty 容量的邊。用源點的流量減去最小割,再負回來就可以求出答案了。怎麼理解呢?割掉一條邊表示不選其對應的藥物或藥材,我們發現最後的方案一定是完美...
雅禮集訓Day4
今天炸的1p。t1,給你100次詢問,每次l,r,選 l,r 中的若干數進行異或,求有多少種結果,1 l r 1e18.做法 暴力很顯然是將l,r這些數加入線性基,然後算一下線性基里有多少個數。我們可以考慮線性基的每一位最早在多久被加入。這個就可以看l了,它二進位制的最高位很顯然是一開始就加入線性基...