目錄洛谷 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有乙個套路題庫,當然,他為了讓這個套路題庫不被發現,給題庫加了密。這個題庫有很多密碼,你只有輸入套路密碼後,你才能看到題目,並且題目的質量和套路密碼的長度成正比.根據你獲取到的情報,套路密碼為兩個字串...