19香港补题(G)+cf思维
算法方面,最近自己是有些進步;
但仍然有很多訓練時間浪費掉的,有些疲倦,但真的不想退役后才后悔當初要是怎么樣就會怎么樣。
我們距離區域賽的穩銅還是有些差距的,繼續努力吧。
專業學習方面,找對方法,靜下心來去學。雖然說大部分時間都要留給隊友一起訓練,但是總會有早起、零散的時間可以利用,提高效率,好吧!
不要跟個廢物一樣,懶惰、抱怨、怕麻煩、說廢話、遲疑不決、得過且過。最后不到一年,堅持下去,我相信自己可以實現很多事情,前提是先讓自己配得上。我想要的東西很貴,想見的人很遠。
G. Game Design
題意:構造一棵樹,每個葉子節點都會有怪獸,可選擇若干點上建造攻擊塔,每個攻擊塔的建造價值不同。要求構造的方式有k種,且每種方式的總價值相同,輸出構造的樹和每個點的權值大小。
思路:
1.思考了很久。設f(x)表示以x為根節點所貢獻的構造方法數 ,
得出公式:f(x)=f(v1) * f(v2) *...*f(v3)+1
2.若是從二叉樹的角度思考,便只需根據k分化后的奇偶性進行遞歸即可。
k為奇數:2*f(k/2)+1
k為偶數:1+f(k-1)此時k-1為奇數。
注意點:若val==1時,剩下k個點構造成一條鏈;若k ==2時,此時u所連兩個子節點為val/2
G. Orray
直接從排序規則入手。
#include <bits/stdc++.h> #define int long long #define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0); #define endl '\n' #define ULL unsigned long long #define down 0.996 using namespace std; const int N=3e5+5; const int inf=1e18; int n,a[N],ans; bool cmp1(int a,int b){return a>b;} bool cmp2(int a,int b){return (a|ans)>(b|ans);} void solve() {cin>>n;ans=0;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+n+1,cmp1);int num=min(n,30LL);for(int i=1;i<=num;i++){sort(a+i,a+n+1,cmp2);ans|=a[i];}for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl; } signed main() {ios;int T;cin>>T;while(T--)solve();return 0; }從二進制位入手:
#include <bits/stdc++.h> #define int long long #define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0); #define endl '\n' #define ULL unsigned long long #define down 0.996 using namespace std; const int N=3e5+5; const int inf=1e18; int n,a[N],p[N],cnt; bool vis[N]; vector<int>e[35]; map<int,int>mp; void solve() {mp.clear();cin>>n;for(int i=0;i<=n;i++) a[i]=p[i]=vis[i]=0;for(int i=0;i<=30;i++) e[i].clear();cnt=0;for(int i=1;i<=n;i++){cin>>a[i];for(int j=30;j>=0;j--)if((a[i]>>j)&1==1) e[j].push_back(i);}int g=0,id=0;for(int i=30;i>=0;i--){if(e[i].size()>0&&!mp[i]){int tmp=g|a[e[i][0]],id=e[i][0];//cout<<i<<" "<<tmp<<" "<<e[i][0]<<" "<<id<<endl;for(int j=1;j<e[i].size();j++){if((g|a[e[i][j]])>tmp)tmp=g|a[e[i][j]],id=e[i][j];}g=tmp,p[++cnt]=id;//cout<<g<<endl;for(int j=30;j>=0;j--)if((g>>j)&1==1) mp[j]=1;}} // for(int i=1;i<=cnt;i++) // cout<<p[i]<<" -- ";cout<<endl;for(int i=1;i<=cnt;i++){if(!vis[p[i]]){vis[p[i]]=1;cout<<a[p[i]]<<" ";}}for(int i=1;i<=n;i++)if(!vis[i]) cout<<a[i]<<" ";cout<<endl; } signed main() {ios;int T;cin>>T;while(T--)solve();return 0; }F. Smaller
讀錯題了,按照自己理解的題意做了另一個題。。。起碼一題當兩題做了;
原題思路:我只要保證a最小,b最大,若是a和b都只包含字符a,那我們去比較他們長度。
假題思路:錯以為s和t都要按照字典序最小排列,然后比較。
#include <bits/stdc++.h> #define int long long #define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0); #define endl '\n' #define ULL unsigned long long #define down 0.996 using namespace std; const double eps=1e-8; const double inf=1e18; const int mod=998244353; const int P=131; const int N=3e3+5; int q,d,k; string s; unordered_map<char,int>m1,m2; void solve() {m1.clear();m2.clear();m1['a']=m2['a']=1;cin>>q;while(q--){cin>>d>>k>>s;int f1=0,f2=0,f3=0;if(d==1){for(int i=0;i<s.length();i++)m1[s[i]]+=k;}else{for(int i=0;i<s.length();i++)m2[s[i]]+=k;}for(int i=25;i>=0;i--){if(m1[char('a'+i)]){f1=i;break;}}for(int i=25;i>=0;i--){if(m2[char('a'+i)]){f2=i;break;}}//cout<<f1<<" "<<f2<<endl;for(int i=0;i<26;i++){if(m1[char('a'+i)]==0&&f1==i&&f2>i)else if(m1[char('a'+i)]<m2[char('a'+i)]&&f1<=i)f3=1;else if(m1[char('a'+i)]>m2[char('a'+i)]&&f2>i)f3=1;if(f3) break;}if(f3)cout<<"YES"<<endl;elsecout<<"NO"<<endl;} } signed main() {//ios;int T;cin>>T;while(T--)solve();return 0; }B. Rebellion
總是會被一些簡單的的東西卡住
#include <bits/stdc++.h> #define int long long #define ios cin.tie(0),cout.tie(0),ios::sync_with_stdio(0); #define endl '\n' #define ULL unsigned long long #define down 0.996 using namespace std; const double eps=1e-8; const double inf=1e18; const int mod=998244353; const int P=131; const int N=3e5+5; int n,a[N];void solve() {cin>>n;int ans=0;for(int i=1;i<=n;i++)cin>>a[i];/*0應該放在前面,1應該放在后面若前面出現1 需要和 后面的0相抵消*/int r=n;for(int i=1;i<=n;i++){if(a[i]==0)continue;while(a[r]==1&&r>i)r--;if(r==i)break;a[i]=0,a[r]=1;ans++;}cout<<ans<<endl; } signed main() {//ios;int T;cin>>T;while(T--)solve();return 0; }C. Permutation Operations
題意:給定一個排列,要求每次選定一個后綴加上i (1~n),要求最后的排列結果為非遞減的。
思路:差分的思想,a[i]-a[i-1]的差值d[i]不會超過-a[i-1]。記錄下所有差值的地方,進行排序。
eg:a[i-1]-a[i]是負值已經滿足非遞減,若是正值,則加上i。
總結
以上是生活随笔為你收集整理的19香港补题(G)+cf思维的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css实现文字占两行
- 下一篇: RT_Thread好用吗? RT_Thr