日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

19香港补题(G)+cf思维

發布時間:2024/1/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

#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 f[N],ans[N],cnt; void dfs(int x,int val,int k) {ans[x]=val;if(k==1) return;if(val==1){for(int i=1;i<k;i++)f[++cnt]=cnt-1,ans[cnt]=1;return;}if(k%2){f[++cnt]=x;dfs(cnt,val/2,2);f[++cnt]=x;dfs(cnt,val/2,k/2);}else{if(k==2){f[++cnt]=x;dfs(cnt,val/2,1);f[++cnt]=x;dfs(cnt,val/2,1);}else{f[++cnt]=x;dfs(cnt,val/2,1);f[++cnt]=x;dfs(cnt,val/2,k-1);}} } void solve() {//cout<<(1<<29)<<endl; 536870912int k;cin>>k;if(k==1){cout<<2<<endl<<1<<endl<<1<<" "<<2<<endl;return;}else if(k==2){cout<<2<<endl<<1<<endl<<1<<" "<<1<<endl;return;}else{cnt=1;dfs(1,1<<29,k);cout<<cnt<<endl;for(int i=2;i<=cnt;i++) cout<<f[i]<<" ";cout<<endl;for(int i=1;i<=cnt;i++) cout<<ans[i]<<" ";cout<<endl;} } signed main() {//ios;//int T;cin>>T;//while(T--)solve();return 0; }

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,那我們去比較他們長度。

#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; void solve() {cin>>q;int f1=0,f2=0,s1=1,s2=1;while(q--){cin>>d>>k>>s;if(d==1) s1+=k*s.length();else s2+=k*s.length();for(int i=0;s[i];i++){if(s[i]!='a'&&d==1) f2=1;else if(s[i]!='a'&&d==2) f1=1;}if(f1) cout<<"YES"<<endl;else if(f2) cout<<"NO"<<endl;else{if(s1>=s2) cout<<"NO"<<endl;elsecout<<"YES"<<endl;}} } signed main() {ios;int T;cin>>T;while(T--)solve();return 0; }

假題思路:錯以為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。

void solve() {e.clear();cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=2;i<=n;i++)e.push_back({a[i-1]-a[i],i});sort(e.begin(),e.end());cout<<1<<" ";for(auto x:e) cout<<x.second<<" ";cout<<endl; }

總結

以上是生活随笔為你收集整理的19香港补题(G)+cf思维的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。