1. 程式人生 > >省選前的CF題

省選前的CF題

有意 lap const code amp fir ati per ras

RT,即將退役的人懶得一篇篇寫題解,於是有了這個東西


CF1004E

樹上選一條不超過k個點的鏈,最小化其余點到鏈上點的最大距離

這個思路很有意思,不像平時一般的樹上問題,是從葉子開始一點點貪心合並直到合得只剩一條鏈,這條鏈就是最後的答案

用優先隊列完成,復雜度$O(n\log n)$

技術分享圖片
 1 #include<set>
 2 #include<queue>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace
std; 7 const int N=200005; 8 struct a{int pts,len;}; 9 bool operator < (a x,a y) 10 { 11 return x.len>y.len; 12 } 13 set<pair<int,int> > st[N]; 14 priority_queue<a> hp; 15 int n,k,t1,t2,t3,siz,ans; 16 int main() 17 { 18 scanf("%d%d",&n,&k),siz=n; 19
for(int i=1;i<n;i++) 20 { 21 scanf("%d%d%d",&t1,&t2,&t3); 22 st[t1].insert(make_pair(t2,t3)); 23 st[t2].insert(make_pair(t1,t3)); 24 } 25 for(int i=1;i<=n;i++) 26 if(st[i].size()==1) 27 hp.push((a){i,(*st[i].begin()).second});
28 while(hp.size()>2||k<siz) 29 { 30 a mn=hp.top(); hp.pop(),siz--,ans=mn.len; 31 int p=mn.pts,nxt=(*st[p].begin()).first; 32 st[nxt].erase(st[nxt].lower_bound(make_pair(p,0))); 33 if(st[nxt].size()==1) 34 hp.push((a){nxt,ans+(*st[nxt].begin()).second}); 35 } 36 printf("%d",ans); 37 return 0; 38 }
View Code

CF772D

題面看題吧

感覺這題沒啥意義,因為考場不太可能想出來

這個東西可以理解為十進制下的“與”(=。=???),記錄每個權值出現的次數,出現的和,出現的平方和,搞一個十進制FWT來做

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1e6+60,M=1e6,mod=1e9+7;
 6 int n,rd,a[N],b[N],c[N],f[N],pw2[N]; long long ans;
 7 void Add(int &x,int y)
 8 {
 9     x+=y;
10     if(x>=mod) x-=mod;
11 }
12 void Trans(int *arr,int typ)
13 {
14     if(~typ)
15     {
16         for(int i=1;i<M;i*=10)
17             for(int j=M-1;~j;j--)
18                 if(j/i%10) Add(arr[j-i],arr[j]);
19     }
20     else
21     {
22         for(int i=1;i<M;i*=10)
23             for(int j=0;j<M;j++)
24                 if(j/i%10) Add(arr[j-i],mod-arr[j]);
25     }
26 }
27 int main()
28 {
29     scanf("%d",&n),pw2[0]=1;
30     for(int i=1;i<=n;i++) pw2[i]=2ll*pw2[i-1]%mod;
31     for(int i=1;i<=n;i++)
32     {
33         scanf("%d",&rd);
34         a[rd]++,Add(b[rd],rd),Add(c[rd],1ll*rd*rd%mod);
35     }
36     Trans(a,1),Trans(b,1),Trans(c,1);
37     for(int i=0;i<M;i++)
38         if(a[i]) f[i]=(a[i]==1)?c[i]:1ll*pw2[a[i]-2]*(1ll*b[i]*b[i]%mod+c[i])%mod;
39     Trans(f,-1);
40     for(int i=0;i<M;i++) ans^=1ll*i*f[i];
41     printf("%lld",ans);
42     return 0;
43 }
View Code

CF咕德拜2017集合(霧

D.New Year and Arbitrary Arrangement

據yjc說是NOIP前留的題,然而我並不會,wsl

設$dp[i][j]$表示前綴中有i個a和j個ab的期望,在i+j>=k時到達邊界,用高中數學講的 等差數列*等比數列 算一算

答案是dp[1][0],因為dp[0][0]在沒有a的時候會自己轉移自己

代碼咕咕了

E.New Year and Entity Enumeration

省選前的CF題