2017 11 03離線賽總結

2021-08-10 07:48:57 字數 4409 閱讀 7635

思路:首先顯然可以看出是列舉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暴力,又調了半天,這時考試只剩下兩個小時 第三題思考了大約十分鐘,然後想到了正解,實現比較快,乙個小時就...