思路:首先顯然可以看出是列舉i個a,得到n-i個b,但組合數只有70,而且還有mod,那麼當然要通過逆元+費馬小定理來快速冪掉。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define rep(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define drep(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define ll long long
#define db double
#define inf 0x3f3f3f3f
#define inf 0x7fffffff
#define mcl(a,b) memset(a,b,sizeof(a))
#define sz(a) sizeof(a)
#define pb push_back
#define n 1000005
#define p 1000000007
int a,b,n;
bool check(int x)
return1;}
struct p40
return;
}dfs(x+1,sum+a);
dfs(x+1,sum+b);
}void solve()
}
void solve()
}cout
return res;
}ll fac[n];
void solve()
cout
[i][
j]表示上乙個截點的位置為
j ,當前的數字串為j+
1到i 。但這樣還不夠(只有70),還需要字尾陣列優化一下(kmp)。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define rep(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define drep(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define ll long long
#define db double
#define inf 0x3f3f3f3f
#define inf 0x7fffffff
#define mcl(a,b) memset(a,b,sizeof(a))
#define sz(a) sizeof(a)
#define pb push_back
#define n 3004
#define p 1000000007
int n;
char s[n];
int dp[n][n];
struct p80
void solve()
int ans=0;
rep(i,1,n)(ans+=dp[i][n])%=p;
cout}}
void solve()
rep(j,i+1,n)(dp[i][j]+=dp[i][j-1])%=p;
}ll ans=0;
rep(i,1,n)(ans+=dp[i][n])%=p;
cout
由鏈的情況——答案應為ma
x(a−
1,n−
b,mi
d(b−
a>>1)
)引發我們思考,將樹抽出一條鏈,也就是樹的直徑,那麼答案同理,即a左邊的所有點到a的最大距離,b右邊的所有點到b的最大距離,以及a,b之間的所有點到a,b的最小值的最大值。這裡兩邊的點都比較好處理,而中間的點需要再求出直徑上a,b之間的點到其子樹的每個點的距離,也就是ma
x(mi
n(di
s[to
p]−d
is[a
],di
s[b]
−dis
[top
])+d
ep[x
])
然而實現起來就比較困難了。
1.距離要倍增算,而且還要每個點向上跳和向下跳都要算出來。(蒟蒻我還沒來得及寫…)
2.也可以線段樹來維護。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define rep(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define drep(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define ll long long
#define db double
#define inf 0x3f3f3f3f
#define inf 0x7fffffff
#define mcl(a,b) memset(a,b,sizeof(a))
#define sz(a) sizeof(a)
#define pb push_back
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define family tree[p],tree[p<<1],tree[p<<1|1]
#define root 1,n,1
#define n 100000
int n,m;
int a[n],b[n];
int d[n],son[n],fa[n],top[n],sz[n];
vector
e[n];
void dfs1(int x,int f)
}void dfs2(int x,int tp)
}int lca(int a,int b)
void dfs(int x,int f)
}void solve()
index=0;
dfs(s,s);
rep(i,1,m)
}}p_list;
struct p30
printf("%d\n",ans);}}
}p30;
int mxval[n];
struct p100tree[n<<2];
void build(int l,int r,int p,int x)
int mid=(l+r)>>1;
build(lson,x),build(rson,x);
tree[p].mx=max(tree[p<<1].mx,tree[p<<1|1].mx);
} int query(int l,int r,int p)
}tree[2];
void dfs(int x,int f,int cost)
}int k;
void dfs(int x,int f,int cost)
}void setid()
link[++s]=a;
is_d[a]=1;
rep(i,1,s)
}void solve()else
if(id[a]0].query(id[a]+1,min(id[b],x),1)-id[a]+dis[a]);
if(max(id[a],x+1)1].query(max(id[a],x+1),id[b]-1,1)+id[b]+dis[b]);
printf("%d\n",ans);} }
}p100;
int main()
cin>>m;
rep(i,1,m)scanf("%d%d",&a[i],&b[i]);
// if(n<=2000)p30.solve();
// else if(p_list.check())p_list.solve();
// else p100.solve();
p100.solve();
return
0;}
小結:今天考得不是很好,第1題逆元沒想到,第3題鏈寫錯了…(**功底還要加強呀!) 2017 7 29 離線賽 總結
本著貪心的思想,我先斜著走到頂,然後直走到終點,顯然這是最優的,但是我忽視了斜著走的最後一步可以和直著走的第一步合併,我錯誤地把兩個過程分開了。假如我當時多找幾組資料來模擬說不定能找到這個錯誤,我也沒敲個暴力來對拍 因為暴力太長了 我得到的教訓是 不能肯定自己演算法的正確性是,不如敲個暴力對拍一下,...
離線賽20171006總結
這次考得還不錯,頗有些遺憾的是因為第一題我離正解已經很近了,可惜考試畢竟是考試,一開始的題目看錯沒看到相鄰的條件浪費了很多時間,到後來就沒有時間去寫正解了。這畢竟也是一種實力,不能說題目看錯失誤問題就不大。上次的考試兩個輸出只能模乙個沒看到導致少了70分。這種失誤還是太低階了,也太致命了。這種題目看...
2017 10 7離線賽總結
失分小結 估分 玄學 實際分數 300 收穫 寫題前仔細分析題目,好好思考 考試過程 第一題真的想不到,只好打個表,結果由於資料半天沒輸出來,心態 有前前後後折騰了半個小時 第二題先是打了個n n暴力,又調了半天,這時考試只剩下兩個小時 第三題思考了大約十分鐘,然後想到了正解,實現比較快,乙個小時就...