牛客周賽 Round 35(A,B,C,D,E,F,G)

這場簡單,甚至賽時90分鐘不到就AK了。比賽鏈接,隊友題解友鏈

剛入住學校監獄,很不適應,最近難受的要死,加上最近幾場CF打的都不順利,san值要爆掉了,只能慢慢補題了。

這場C是個滑動窗口,D是貪心,E是有點麻煩的構造,FG是數論。


A 小紅的字符串切割

思路:

記錄一下字符串長度,然后從中間拆開。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;string s;int main(){cin>>s;cout<<s.substr(0,s.length()/2)<<endl<<s.substr(s.length()/2);return 0;
}

B 小紅的數組分配

思路:

統計一下每個數字出現的次數,然后兩個兩個拿走,如果有一種數字剩下了奇數個,就說明這種數字不能平分給兩個數組,直接返回-1。

code:

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
const int maxn=1e5+5;int n,a[maxn];
map<int,int> mp;int main(){cin>>n;for(int i=1,t;i<=2*n;i++){cin>>t;mp[t]++;}for(int i=1;i<=n;i++){if(mp.begin()->second==1){cout<<-1<<endl;return 0;}a[i]=mp.begin()->first;mp.begin()->second-=2;if(mp.begin()->second==0)mp.erase(mp.begin());}for(int i=1;i<=n;i++)cout<<a[i]<<" ";puts("");for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}

C 小紅關雞

思路:

如果把雞窩的位置放在數軸上,那么我們其實就是要找一段長為 k k k 的區間,使得這個區間包含的雞窩(也就是數軸上的點)的個數最多。

這有點像滑動窗口。假設有個長為 k k k 的窗口,從最左邊的雞窩開始向右滑動,右端點每次移動到下一個雞窩,然后把左邊超出范圍的雞窩刪掉,考慮用雙端隊列維護這個過程,每滑動一次就記錄一下當前窗口中有多少雞窩,取最大的即可。

code:

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;int n,k;
int a[maxn];
deque<int> q;int main(){cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);int ans=0;for(int i=1;i<=n;i++){q.push_back(a[i]);while(a[i]-q.front()>k)q.pop_front();ans=max(ans,(int)q.size());}cout<<1.*ans/n;return 0;
}

D 小紅的排列構造

思路:

題意說白了就是修改數組中的某些數,讓 1 ~ n 1\sim n 1n 出現一次且僅一次。

貪心地來想,如果排列中的某個數在給出的數組中有的話,我們就可以保留其中一個。而多余的和超出范圍( > n \gt n >n)的數我們就需要把它修改成其他數。

所以做法就比較明確了,統計一下不符合條件的下標,然后再給它們分配排列中沒有用到的數字。

code:

#include <iostream>
#include <cstdio>
#include <set>
#include <vector>
using namespace std;int n;
vector<int> a;int main(){cin>>n;set<int> S;int cnt=0;for(int i=1,t;i<=n;i++){cin>>t;if(!S.count(t) && t<=n)S.insert(t);else {cnt++;a.push_back(i);}}cout<<cnt<<endl;int i=1;for(auto x:a){while(S.count(i))i++;cout<<x<<' '<<i<<endl;i++;}return 0;
}

E 小紅的無向圖構造

思路:

比較麻煩的一道構造。

先不考慮湊出 m m m 條邊,單純想怎么湊出滿足 a a a 數組。考慮一棵樹,深度其實就是它到根節點的距離,深度為 h h h 的點一定連著至少一個深度為 h ? 1 h-1 h?1 的點,并且它一定不能去連其他深度的點,否則它本身或者連接的另一個點的深度就會發生變化。

也就是說,至少要有 n ? 1 n-1 n?1 條邊才能保證圖聯通。并且對一個距離 1 1 1 號節點距離 a i a_i ai? 的點,至少要有一個距離為 a i ? 1 a_i-1 ai??1 的點給它連著。也就是不能斷層。

另外因為不允許重邊和自環,因此 m m m 太大的時候也是無解的。怎么找到這個最大值以及怎么構造呢?考慮深度為 h h h 的點一定只能連著深度為 h ? 1 h-1 h?1 h h h 的點,因此深度為 h h h 的點最多可以連出 s i z e h ? 1 ? s i z e h size_{h-1}*size_{h} sizeh?1??sizeh? C s i z e h 2 = s i z e h ? ( s i z e h ? 1 ) 2 C_{size_h}^2=\dfrac{size_{h}*(size_{h}-1)}2 Csizeh?2?=2sizeh??(sizeh??1)? 條邊,我們算出這個最大的可以連邊的數量,然后和 m m m 比較一下就知道有沒有解了。

那么怎么連邊呢。首先我們需要保證聯通,所以需要先把最低限度的邊連好。我們用個vector把每個深度的點存一下,然后深度為 h h h 的所有點先跟 深度為 h ? 1 h-1 h?1 的某個點連好邊。然后再去連沒有必要的邊,并記錄一下連了多少個,夠了后面就不用再連沒必要的邊了。

code:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;int n,m,d[maxn];
vector<int> a[maxn];int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>d[i];a[d[i]].push_back(i);}if(m<n-1){cout<<-1;return 0;}ll maxx=0,cnt=1;for(int i=1;a[i].size()!=0;i++){cnt+=a[i].size();maxx+=1ll*a[i-1].size()*a[i].size();maxx+=1ll*a[i].size()*(a[i].size()-1)/2;}if(maxx<m || cnt!=n){//m超出最大的邊數 或 出現斷層cout<<-1;return 0;}m-=n-1;vector<pair<int,int> > e;for(int i=1;a[i].size()!=0;i++){for(auto x:a[i])//必要的邊e.push_back(make_pair(a[i-1][0],x));for(int j=1;j<a[i-1].size() && m;j++){//非必要的邊 h-1 -> hfor(auto x:a[i]){e.push_back(make_pair(a[i-1][j],x));m--;if(!m)break;}}for(int j=0;j<a[i].size() && m;j++)for(int k=j+1;k<a[i].size() && m;k++){//非必要的邊 h -> he.push_back(make_pair(a[i][j],a[i][k]));m--;if(!m)break;}}for(auto x:e)cout<<x.first<<" "<<x.second<<endl;return 0;
}

F,G 小紅的子序列權值和

思路:

對一種選取方案,發現其實 1 1 1 對乘積的結果是沒有影響的,所以先不看 1 1 1,只看 2 2 2 3 3 3。假如 n n n 個數里一共有 a a a 2 2 2 b b b 3 3 3。某種選取方案有 x x x 2 2 2 y y y 3 3 3,那么總的因子個數就是 ( x + 1 ) ? ( y + 1 ) (x+1)*(y+1) (x+1)?(y+1)(乘積結果為 2 x ? 3 y 2^x*3^y 2x?3y,對一個因子,從 x x x 2 2 2 里可以選 0 ~ x 0\sim x 0x 2 2 2,從 y y y 3 3 3 里可以選 0 ~ y 0\sim y 0y 3 3 3,總的方案數就是 ( x + 1 ) ? ( y + 1 ) (x+1)*(y+1) (x+1)?(y+1)。這個結論可以推廣,對 n = p 1 c 1 ? p 2 c 2 ? ? ? p m c m n=p_1^{c_1}*p_2^{c_2}*\dots*p_m^{c_m} n=p1c1???p2c2?????pmcm?? 的因子個數就是 ∏ i = 1 m ( c i + 1 ) \prod_{i=1}^{m}(c_i+1) i=1m?(ci?+1))。而選到這個方案總的次數就是從 a a a 2 2 2 里選 x x x 2 2 2,以及從 b b b 3 3 3 里選 y y y 3 3 3,也就是選取 x x x 2 2 2 y y y 3 3 3 的方案的總貢獻是 C a x ? C b y ? ( x + 1 ) ? ( y + 1 ) C^x_a*C^y_b*(x+1)*(y+1) Cax??Cby??(x+1)?(y+1)

最后對每個選取方案,我們可以往里面添加 n ? a ? b n-a-b n?a?b 1 1 1 中的任意個,也就是最后結果乘以 2 n ? a ? b 2^{n-a-b} 2n?a?b,最后再減掉一個 什么都不選 的方案就行了。答案為: 2 n ? a ? b ? ∑ x = 0 a ∑ y = 0 b C a x ? C b y ? ( x + 1 ) ? ( y + 1 ) ? 1 2^{n-a-b}*\sum_{x=0}^{a}\sum_{y=0}^{b}C^x_a*C^y_b*(x+1)*(y+1)-1 2n?a?b?x=0a?y=0b?Cax??Cby??(x+1)?(y+1)?1 O ( n ) O(n) O(n) 預處理一下階乘和階乘的逆元,就可以 O ( n 2 ) O(n^2) O(n2) 進行累加,可以過 F 題。

其實你會發現 C a x C^x_a Cax? ( x + 1 ) (x+1) (x+1) 這個部分和 y y y 沒有一點關系,所以可以提出來,同理 C b y C^y_b Cby? ( y + 1 ) (y+1) (y+1) 這個部分和 x x x 沒有一點關系,所以可以提出來。于是就得到了: 2 n ? a ? b ? ∑ x = 0 a C a x ? ( x + 1 ) ? ∑ y = 0 b C b y ? ( y + 1 ) ? 1 2^{n-a-b}*\sum_{x=0}^{a}C^x_a*(x+1)*\sum_{y=0}^{b}C^y_b*(y+1)-1 2n?a?b?x=0a?Cax??(x+1)?y=0b?Cby??(y+1)?1兩個部分分開計算,時間復雜度 O ( n ) O(n) O(n),可以通過 G 題。

code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll mod=1e9+7;ll n,a,b;
ll fac[maxn],ifac[maxn];ll qpow(ll a,ll b){b%=mod-1;ll base=a%mod,ans=1;while(b){if(b&1){ans*=base;ans%=mod;}base*=base;base%=mod;b>>=1;}return ans;
}
ll inv(ll x){return qpow(x,mod-2);}
ll C(int a,int b){//C_a^b return fac[a]*ifac[b]%mod*ifac[a-b]%mod;
}int main(){cin>>n;fac[0]=ifac[0]=1;for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;ifac[n]=inv(fac[n]);for(int i=n;i>=1;i--)ifac[i-1]=ifac[i]*i%mod;a=b=0;for(int i=1,t;i<=n;i++){cin>>t;if(t==2)a++;else if(t==3)b++;}ll t1=0,t2=0;for(int y=0;y<=b;y++){t1=(t1+C(b,y)*(y+1))%mod;}for(int x=0;x<=a;x++){t2=(t2+C(a,x)*(x+1))%mod;}ll ans=t1*t2%mod;cout<<(qpow(2,n-a-b)*ans%mod-1+mod)%mod;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718362.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718362.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718362.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

冒泡排序 和 qsort排序

目錄 冒泡排序 冒泡排序部分 輸出函數部分 主函數部分 總代碼 控制臺輸出顯示 總代碼解釋 冒泡排序優化 冒泡排序 主函數 總代碼 代碼優化解釋 qsort 排序 qsort 的介紹 使用qsort排序整型數據 使用qsort排序結構數據 冒泡排序 首先&#xff0c;我先介紹我的冒泡…

模糊搜索小案例

C#窗體實現數據錄入與模糊搜索小案例 記錄一下 主要代碼 private void button1_Click(object sender, EventArgs e){string name textBox1.Text;string hometown textBox4.Text;string school textBox6.Text;string sex textBox5.Text;string lat textBox3.Text;string …

c#打印BarTend標簽提示:具名數據源沒有cuckoo*具名數據(解決)

c#打印BarTend標簽提示&#xff1a;具名數據源沒有cuckoo*具名數據&#xff08;解決&#xff09; 今天咕咕更新打印模板的時候遇到的問題&#xff0c;就是在模版中配置了字段名&#xff0c;但是啟動c#應用&#xff0c;后端發送json數據打印的時候c#報錯提示&#xff0c;沒有在…

python 小游戲《2048》字符版非圖形界面

參考鏈接&#xff1a; 閑談2048小游戲和數組的旋轉及翻轉和轉置 目錄 2048 一、方陣類 二、隨機插入1或2 三、 合并和遞增 四、 判斷和移動 五、 鍵盤控制 完整源代碼 玩法過程 2048 上回說到2048小游戲中數組的各種旋轉、翻轉的方法&#xff0c;就是為代碼編程作準…

第十六天-爬蟲selenium庫

目錄 1.介紹 2.使用 selenium 1.安裝 2.使用 1.測試打開網頁&#xff0c;抓取雷速體育日職乙信息 2.通過xpath查找 3.輸入文本框內容 send_keys 4.點擊事件 click 5.獲取網頁源碼&#xff1a; 6.獲取cookies 7.seleniumt提供元素定位方式&#xff1a;8種 8.控制瀏覽…

Spring Security OAuth2如何自定義返回的 Token 信息

文章目錄 Spring Security OAuth2如何自定義返回的 Token 信息定制不透明令牌的信息Springsecurity-oauth2之TokenEndPoint參考Spring Security OAuth2如何自定義返回的 Token 信息 Spring Boot+OAuth2,如何自定義返回的 Token 信息? 參考URL: https://www.jianshu.com/p/b7…

【Go】指針的聲明和初始化

package mainimport "fmt"func main() {// 聲明一個整數變量var num int 42// 聲明一個指向整數的指針變量&#xff0c;并將其初始化為指向整數變量的地址var ptr *int &num// 打印整數變量的值和指針變量的值&#xff08;即整數變量的地址&#xff09;fmt.Pri…

2024第24屆中國國際工業博覽會新能源與智能網聯汽車展電池制造展館

2024第24屆中國國際工業博覽會新能源與智能網聯汽車展電池制造展館 時間&#xff1a;2024年9月24日-28日 地點&#xff1a;國家會展中心&#xff08;上海&#xff09; 主辦單位&#xff1a;工業和信息化部、國家發展和改革委員會、科學技術部、商務部、中國科學院、中國工程…

【游記】GDOI2024

GDOI2024游記 老年退役選手。NOIP 218 分&#xff0c;GDOI 純純旅游。 Day -5 周日返校&#xff0c;開始停課。 開始攢 rp。 Day -4 模擬賽&#xff0c;犯困&#xff0c;啥也不會。 下午打球。 Day -3 模擬賽&#xff0c;不困&#xff0c;還是啥也不會。 下午打球。 …

CSS3單獨制作移動端頁面布局方式(流式布局、flex彈性布局)

目錄 1. 流式布局(百分比布局)2. flex彈性布局(強烈推薦)2.1 介紹2.2 Flex容器常見屬性2.2.1 flex-direction2.2.2 justify-content2.2.3 flex-wrap2.2.4 align-items2.2.5 align-content2.2.6 flex-flow 2.3 Flex項目常見屬性2.3.1 flex2.3.2 align-self和order 1. 流式布局(百…

銀河麒麟之Workstation安裝

一、VMware Workstation簡介 VMware Workstation是一款由VMware公司開發的虛擬化軟件&#xff0c;它允許用戶在一臺物理計算機上運行多個操作系統&#xff0c;并在每個操作系統中運行多個虛擬機。VMware Workstation提供了一個可視化的用戶界面&#xff0c;使用戶可以輕松創建、…

程序環境和預處理(2)

文章目錄 3.2.7 命名約定 3.3 #undef3.4 命令行定義3.5 條件編譯3.6 文件包含3.6.1 頭文件被包含的方式3.6.2 嵌套文件包含 4. 其他預處理指令 3.2.7 命名約定 一般來講函數和宏的使用語法很相似&#xff0c;所以語言本身沒法幫我們區分二者&#xff0c;那我們平時的一個習慣是…

linux條件判斷之if-then

if..then是最常見的條件判斷語句&#xff0c;簡而言之&#xff0c;就是當符合某個條件判斷的時候&#xff0c;就予以進行某項工作。 1.if-then格式 if-then格式1&#xff1a; if [ 條件判斷表達式 ];then 當條件判斷表達式成立時&#xff0c;需執行的命令 fi if-then格式2…

Redis安全加固策略:綁定Redis監聽的IP地址 修改默認端口 禁用或者重命名高危命令

Redis安全加固策略&#xff1a;綁定Redis監聽的IP地址 & 修改默認端口 & 禁用或者重命名高危命令 1.1 綁定Redis監聽的IP地址1.2 修改默認端口1.3 禁用或者重命名高危命令1.4 附&#xff1a;redis配置文件詳解&#xff08;來源于網絡&#xff09; &#x1f496;The Beg…

驅動開發面試復習

創建字符設備 1 創建設備號 alloc_chrdev_region 2.創建cdev cdev_init 3.添加一個 cdev,完成字符設備注冊到內核 cdev_add 4.創建類 class_create 5.創建設備 device_create 1.內核空間與用戶空間數據 copy_from_user 和copy_to_user 倆個函數來完成。 copy_from_user 函數…

618快遞準點到達,別忘了感謝它!

進入6月以來&#xff0c;全國快遞日均業務量飛速上漲。 雖然618大促是電商的主場&#xff0c;但作為不可或缺的物流環節&#xff0c;為了這場年中大考&#xff0c;快遞企業在此期間也使盡渾身解數&#xff0c;競相比拼配送速度。那么&#xff0c;為了更快的時效&#xff0c;快遞…

uniapp 的video播放如何實現小窗功能

在頁面中使用<video>組件來展示視頻&#xff0c;并設置好相應的屬性和事件監聽&#xff1a; <video src"video.mp4" play"onVideoPlay" pause"onVideoPause"></video>在頁面的data中定義一個變量來表示是否開啟小窗模式&#…

【Wio Terminal】使用WiFi(3)- Wi-F的高級使用

使用WiFi&#xff08;3&#xff09; Wi-F的高級使用HTTPClient 的使用HTTP GETHTTPs GETHTTP POSTWebServerHTTP Authentication Web ServerDNSServermDNSmDNS-SDWiFiManager Wi-F的高級使用 本節介紹了一些WiFi的高級庫用法&#xff0c;如HTTPClient、DNSServer和WebServer庫…

美國亞利桑那州立大學宣布與OpenAI建立合作伙伴關系!

美國亞利桑那州立大學 (Arizona State University) 在官網宣布—— 將與OpenAI建立合作伙伴關系&#xff01; 該校也成為了第一個與OpenAI合作的高等教育機構。 來源&#xff1a;亞利桑那州立大學官網 亞利桑那州立大學校長表示&#xff1a; “我們認識到人工智能系統將持續…

高并發IO底層原理淺析(四)

Java NIO中的Selector&#xff08;選擇器&#xff09;是一個用于檢測多個非阻塞通道&#xff08;Channel&#xff09;是否準備就緒進行讀寫操作的關鍵組件&#xff0c;它實現了I/O多路復用技術。在單個線程中&#xff0c;Selector可以監聽和管理多個Channel上的事件&#xff0c…