Ryoku 的新年歡樂賽

2022-06-12 23:45:09 字數 3932 閱讀 2244

目錄洛谷 6034 ryoku 與最初之人筆記

洛谷 6035 ryoku 的逆序對

洛谷 6036 ryoku 愛學習

220菜雞苟且偷生進入前三十

有乙個\(n\)個點\(n\)條邊的無向連通圖,每條邊有長度和美觀度(美觀度各不相同),

若從點\(x\)出發,每次選擇美觀度最大的一條邊走,如果沒有未走過的點就瞬移到前乙個點,

問從每個點出發經過全部點的長度

如果沒有\(n\)條邊的限制就是乙個基環樹,那麼只會有一條邊而且必然是環上的邊不會被算上,

而且這條邊一定是與該點所在的樹的根節點所連線,

所以思路特別清晰,拓撲排序判環,然後對於環上的點選取美觀度小的一條環上邊不選,

那麼答案就是邊長度總和減去這條邊的長度,然後再把這個點的資訊複製到子樹上,

總時間複雜度\(o(n)\)

#include #include #include #define rr register

using namespace std;

const int n=1000011; long long sum; queueq;

struct nodee[n<<1];

int n,k=1,deg[n],ls[n],ans[n]; bool v[n];

inline signed iut()

inline void print(long long ans)

inline void dfs(int x,int now)

signed main(),ls[x]=k,sum+=w;

e[++k]=(node),ls[y]=k,deg[x]++,deg[y]++;

}for (rr int i=1;i<=n;++i) if (deg[i]==1) q.push(i);

while (q.size())

}for (rr int root=1;root<=n;++root)

if (!v[root])

p=e[p1].f

\[\sum_^n\sum_^n[i\equiv j\pmod ]

\]想要\(i\)和\(j\)在取模\(i\,xor\,j\)的情況下相等,不妨設\(i-x(i\,xor\,j)=j-y(i\,xor\,j)(x

那麼\((y-x)(i\,xor\,j)=j-i\)也就是\(i\,xor\,j|j-i\)

然而思路行不通了?

通過\(xor\)本質就是不退位的減法,所以\(i\,xor\,j\geq j-i\)

那麼兩個式子綜合起來就是\(i\,xor\,j=j-i\)

#include #define rr register

using namespace std;

typedef long long lll;

const lll mod=1e9+7;

lll n,ans,d[63],dig[63],dp[63],c[63][63],lenn;

inline lll mo(lll x,lll y)

inline void dfs(int len,bool limit,int now)

rr int mx=limit?dig[len]:1;

for (rr int i=0;i<=mx;++i)

if (limit&&i==mx) dfs(len-1,limit,now+i);

else

}signed main()

比完賽我去看出題人解題報告,怎麼這麼短

考慮一下組合數本質

\(c(n,0)*2^0+c(n,1)*2^1+c(n,2)*2^2+\cdots+c(n,n)*2^n=c(n,n)*2^0+c(n,n-1)*2^1+c(n,n-2)*2^2+\cdots+c(n,0)*2^n=(1+2)^n=3^n\)

所以可以把後面那一坨用簡單的單項式代替,時間複雜度\(o(log_2n)\)

#include #define rr register

using namespace std;

typedef long long lll;

const lll mod=1e9+7;

lll n,ans,p3[63],p2[63],len;

inline lll mo(lll x,lll y)

signed main()

ans=mo(ans,mo(mod-n%mod,p2[len]-1));//首先在前面分析說了要1到n都減去1,所以要減n,而且最後加上2的len次方-1是因為算上$n$自己

return !printf("%lld",ans);

}

給定乙個陣列\(b\),\(b_i=\sum_^n[b_i==-1]*(n-i+1)\)(早知道打表找規律了)

讓\(b_i=-1\)的位置變成0就能讓字典序最小,然後樹狀陣列+二分解決

#include #include #define rr register

using namespace std;

const int mod=1000000007,n=1000011;

int n,a[n],c[n],ans=1;

inline signed iut()

inline void print(int ans)

inline signed query(int x)

inline void add(int x)

signed main()

print(ans); if (!ans) return 0;

for (rr int i=1;i<=n;++i) c[i]=-i&i;

for (rr int i=1;i<=n;++i)

putchar(i==1?10:32),print(l),add(l);

}return 0;

}

題目一看到概率一般都是期望dp了,但是怎麼求這就是乙個問題

首先\(a^b\)把它變成常數\(a\)(毒瘤出題人多項式插值)

設\(dp[i]\)表示前\(i\)個知識的答案

不選\(i\)肯定要加上\((1-p[i])*dp[i-1]\)

但是選了\(i\)就很難計算,那得再開乙個

\(s[i]\)表示前\(i\)種知識選擇\(i\)的答案,

那麼\(s[i]=p[i]*(1-p[i-1])*w[i]*a^0+p[i]*p[i-1]*(1-p[i-2])*(w[i]+w[i-1])*a^1+\cdots\)

首先這一坨也是很難表示的,把有關\(w[i]\)的部分提出來就是

\[s[i]=p[i]*(1-p[i-1])*w[i]+p[i]*p[i-1]*(1-p[i-2])*w[i]*a+\cdots

\]然後沒有寫的部分正好還缺了\(s[i-1]*a\)

再把剛剛的結合一下可以得到

\[s[i]=p[i]*(s[i-1]*a+w[i]*((1-p[i-1])*a^0+p[i-1]*(1-p[i-2])*a^1+\cdots))

\]然而後面這一坨同樣可以用\(pr[i]\)表示

先把\(s[i]=p[i]*(s[i-1]*a+w[i]*pr[i])\)

那麼\(pr[i]=a*p[i-1]*pr[i-1]+1-p[i-1]\)

所以就可以\(o(n)\)解決了

#include #include #include #define rr register

using namespace std;

const int n=100011;

int n,w[n]; double ans,a,dp,dp,pr,pr,s,s,p,p;

inline double iut()else return ans1;

}signed main()

return !printf("%lf",dp);

}

迎新年賽歡樂賽題解

是博主在洛谷搞的邀請賽,雖然有些過時。t1 暴力呀,很水 懶得寫題解 然而不道為什麼沒人ac t2 純數學手法,找1 n中有幾個 5 這個因子 include using namespace std intmain cout return 0 t3 01揹包問題,然而要用高精度,沒人ac。沒高精度的...

寒假歡樂賽

狀態不好a.第一題 noip 2000 單詞接龍 description 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 只要有重合的內容,兩個單詞就能夠連線起來。在兩個單相連線時,其重...

水題歡樂賽 套路

套路是人類進步的階梯,我將不惜一切代價套路學習 費清澄 恩恩真是太對了 zqc是乙隻套路的犰 zqc有乙個套路題庫,當然,他為了讓這個套路題庫不被發現,給題庫加了密。這個題庫有很多密碼,你只有輸入套路密碼後,你才能看到題目,並且題目的質量和套路密碼的長度成正比.根據你獲取到的情報,套路密碼為兩個字串...