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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2019CCPC网络预选赛 八道签到题题解

發布時間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2019CCPC网络预选赛 八道签到题题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 2019中國大學生程序設計競賽(CCPC) - 網絡選拔賽
    • 6702 &
    • 6703 array
    • 6704 K-th occurrence
    • 6705 path
    • 6706 huntian oy
    • 6707 Shuffle Card
    • 6708 Windows Of CCPC
    • 6709 Fishing Master

@

2019中國大學生程序設計競賽(CCPC) - 網絡選拔賽

CSDN

6702 &

\(1 and 1\)的話,\(c\)就必須為\(1\)。其他的貪心選\(0\).
注意c為正整數,0的話就取最低位1.

#include <iostream> #define ll long long using namespace std; void solve(ll a,ll b) {ll c=0;for(ll i=31;i>=0;--i) {bool k1=a&(1LL<<i),k2=b&(1LL<<i);if(k1==1&&k2==1) c|=1LL<<i;} if(c) return cout<<c<<"\n",void();for(ll i=31;i>=0;--i) {bool k1=a&(1LL<<i),k2=b&(1LL<<i);if(k1||k2) c=1LL<<i;} cout<<c<<"\n"; } int main() {int T;cin>>T;while(T --> 0) {ll a,b;cin>>a>>b;solve(a,b);}return 0; }

6703 array

修改操作其實是刪除操作。
考慮不刪除的話,就是把刪除的數字放入\(set\)
最終答案就是不刪除的\(ans\)\(set\)中符合條件的取個最小值。
方法一
建立主席樹維護區間和。
二分,主席樹\(check\)
復雜度\(O(nlog^2n)\),實測\(T\)飛。
方法二
主席樹上二分。
主席樹不變查詢區間和。然后找到第一個包含的滿足條件的子區間。
條件就是\(r-l+1 < e[rt].tot\),然后再在這個區間上查一次就行了。

復雜度都是\(O(nlogn)\)
問了個當場切的老哥的代碼,直接線段樹,也沒\(set\)直接改,我這里先\(Orz\)了。

#include <cstdio> #include <iostream> #include <cstring> #include <set> #define ls(x) e[x].l #define rs(x) e[x].r #define _ 100007 using namespace std; inline char nc() {static char buf[3000000], *p1 = buf, *p2 = buf;return p1 == p2 && (p2 = (p1 = buf) + fread (buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++; } inline int read() {int x=0,f=1;char s=getchar();for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';return x*f; } int n,m,a[_],cnt,rt[_]; set<int> dsr; struct node{int l,r,siz;}e[_*20]; void insert(int l,int r,int pos,int val,int x,int &y) {e[y=++cnt]=e[x];e[y].siz++;if(l==r) return;int mid=(l+r)>>1;if(pos<=mid) insert(l,mid,pos,val,ls(x),ls(y));else insert(mid+1,r,pos,val,rs(x),rs(y));} int lastans,flag; int ask(int l,int r,int x) {if(l==r) return l;int mid=(l+r)>>1;if(e[ls(x)].siz<mid-l+1) return ask(l,mid,ls(x));else return ask(mid+1,r,rs(x)); } void query(int l,int r,int L,int R,int x) {if(L<=l) {if(!flag&&e[x].siz!=r-l+1) {flag=1,lastans=min(lastans,ask(l,r,x));} return;}int mid=(l+r)>>1;if(L<=mid&&!flag) query(l,mid,L,R,ls(x));if(R>mid&&!flag) query(mid+1,r,L,R,rs(x)); } int main() {int T=read();while(T --> 0) {dsr.clear(),dsr.insert(0x3f3f3f3f);cnt=0;for(int i=1;i<=n;++i) rt[i]=0;for(int i=1;i<=cnt;++i) e[i]={};n=read(),m=read();for(int i=1;i<=n;++i) a[i]=read(),insert(1,n+1,a[i],a[i],rt[i-1],rt[i]);rt[n+1]=rt[n];lastans=0;for(int i=1;i<=m;++i) {int opt=read();if(opt==1) {int pos=read()^lastans;if(!dsr.count(a[pos])) dsr.insert(a[pos]);} else {int r=read()^lastans,k=read()^lastans;lastans=*dsr.lower_bound(k),flag=0;query(1,n+1,k,n+1,rt[r]);printf("%d\n",lastans);}}}return 0; }

6704 K-th occurrence

想了想,只會后綴數組+二分+主席樹,感覺有點恐怖就沒寫,最后還是寫了。
然后套了個后綴數組板子就過了,實現還是挺簡單的一點也不恐怖。
先對串串進行一遍后綴排序。
顯然符合條件的串是一個區間,用Lcp進行二分來找到邊界。
邊界長度不夠k就是-1,否則就查詢區間的第k小,用主席樹維護即可。

#include <bits/stdc++.h> using namespace std; const int _=2e5+7; int read() {int x=0,f=1;char s=getchar();for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';return x*f; } int n,Q,rt[_]; char s[_]; namespace SA {#define FOR(i,a,b) for(int i=a;i<=b;++i)#define ROF(i,a,b) for(int i=a;i>=b;--i)int sa[_],rk[_],c[_],x[_],height[_],st[_][21];void clear() {memset(sa,0,sizeof(sa));memset(rk,0,sizeof(rk));memset(c,0,sizeof(c));memset(x,0,sizeof(x));memset(height,0,sizeof(height));memset(st,0,sizeof(st));}void get_sa() {int m=300;FOR(i,1,n) ++c[rk[i]=s[i]];FOR(i,1,m) c[i]+=c[i-1];ROF(i,n,1) sa[c[rk[i]]--]=i;for(int k=1;k<=n;k<<=1) {int p=0;FOR(i,n-k+1,n) x[++p]=i;FOR(i,1,n) if(sa[i]>k) x[++p]=sa[i]-k;FOR(i,1,m) c[i]=0;FOR(i,1,n) ++c[rk[i]];FOR(i,1,m) c[i]+=c[i-1];ROF(i,n,1) sa[c[rk[x[i]]]--]=x[i],x[i]=0;swap(rk,x);rk[sa[1]]=1,p=1;FOR(i,2,n) rk[sa[i]]=(x[sa[i]]==x[sa[i-1]]&&x[sa[i]+k]==x[sa[i-1]+k]) ? p : ++p;if(p==n) break;m=p;}}void get_height() {FOR(i,1,n) rk[sa[i]]=i;int k=0;FOR(i,1,n) {k=k?k-1:0;int j=sa[rk[i]-1];while(s[i+k]==s[j+k]&&i+k<=n&&j+k<=n) k++;height[rk[i]]=k;}height[0]=0;FOR(i,1,n) st[i][0]=height[i];FOR(j,1,20) for(int i=1;i+(1<<j)-1<=n;++i)st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);}int LCP(int i,int j) {if(i-1==j) return n-sa[i-1]+1;int x=log2(j-i+1);return min(st[i][x],st[j-(1<<x)+1][x]);} } namespace TREE {#define ls(x) e[x].l#define rs(x) e[x].rstruct node {int l,r,siz;}e[_*32];int cnt;void insert(int l,int r,int L,int x,int &y) {e[y=++cnt]=e[x];e[y].siz++;if(l==r) return;int mid=(l+r)>>1;if(L<=mid) insert(l,mid,L,ls(x),ls(y));else insert(mid+1,r,L,rs(x),rs(y));}int query(int l,int r,int k,int x,int &y) {if(l==r) return l;int mid=(l+r)>>1,w=e[ls(y)].siz-e[ls(x)].siz;if(k<=w) return query(l,mid,k,ls(x),ls(y));else return query(mid+1,r,k-w,rs(x),rs(y));} } void solve(int S,int T,int k) {int L,R,l,r;l=1,r=SA::rk[S];while(l<=r) {int mid=(l+r)>>1;if(SA::LCP(mid+1,SA::rk[S])>=T-S+1) L=mid,r=mid-1;else l=mid+1;}l=SA::rk[S],r=n;while(l<=r) {int mid=(l+r)>>1;if(SA::LCP(SA::rk[S]+1,mid)>=T-S+1) R=mid,l=mid+1;else r=mid-1;}// cout<<SA::rk[S]<<"\n";// cout<<L<<" "<<R<<"\n";if(R-L+1<k) return puts("-1"),void();printf("%d\n",TREE::query(1,n,k,rt[L-1],rt[R])); } int main() {int T=read();while(T --> 0) {//clearmemset(rt,0,sizeof(rt));memset(TREE::e,0,sizeof(TREE::e));TREE::cnt=0;SA::clear();//initn=read(),Q=read();scanf("%s",s+1);n=strlen(s+1);SA::get_sa();SA::get_height();for(int i=1;i<=n;++i) TREE::insert(1,n,SA::sa[i],rt[i-1],rt[i]);//debug// puts("sa : ");// for(int i=1;i<=n;++i) cout<<SA::sa[i]<<" ";// puts("\nrk : ");// for(int i=1;i<=n;++i) cout<<SA::rk[i]<<" ";// cout<<"\n";// puts("LCP");// for(int i=1;i<=n;++i) {// for(int j=1;j<=n;++j) {// if(i>j) printf("0 ");// else printf("%d ",SA::LCP(i+1,j));// }// printf("\n");// }//querywhile(Q --> 0) {int l=read(),r=read(),k=read();solve(l,r,k);}}return 0; }

6705 path

類似于NOI2010超級鋼琴和十二省聯考的異或粽子。
往這里思考過,不知道咋的\(3s\)后就放棄了,也許是當時覺得不對?
現在一看很對啊。
首先我們每個點連出的邊按照權值排序。
用一個優先隊列維護每個點為起始點的沒被選中的最短路徑,每次堆上找到最小的,然后刪掉。
之后我們要加入兩條要成為最短的可能路徑。
1.\(t\)之后找一條最小的邊接上。
2.若與\(t\)相連的上一個點為\(s,<s,t>\)這條邊為第k大,則起點\(->s+k+1\)大邊。
路徑權值\(w\)對應著加加減減。
這里初始點不用記錄,只記錄\(s,t,k,w\)就行了。

#include <bits/stdc++.h> #define ll long long using namespace std; const int _=5e4+7; int read() {int x=0,f=1;char s=getchar();for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';return x*f; } int ask[_];ll ans[_]; struct node{int s,t,k;ll w;node(int a,int b,int c,ll x) {s=a,t=b,k=c,w=x;} }; bool operator < (node a,node b) {return a.w>b.w; } priority_queue<node> q; vector< pair<ll, int> > G[_]; int main() {int T=read();while(T --> 0) {int n=read(),m=read(),Q=read(),cnt=0,limit=0;while(!q.empty()) q.pop();for(int i=1;i<=n;++i) G[i].clear();for(int i=1;i<=m;++i) {int u=read(),v=read(),w=read();G[u].push_back(make_pair(w,v));}for(int i=1;i<=n;++i) {sort(G[i].begin(),G[i].end());if(G[i].size()) q.push(node(i,G[i][0].second,0,G[i][0].first));}for(int i=1;i<=Q;++i) ask[i]=read(),limit=max(limit,ask[i]);while(!q.empty()&&cnt<limit) {node u=q.top();q.pop();ans[++cnt]=u.w;if(u.k+1<(int)G[u.s].size())q.push(node(u.s,G[u.s][u.k+1].second,u.k+1,u.w-G[u.s][u.k].first+G[u.s][u.k+1].first));if(G[u.t].size()>0)q.push(node(u.t,G[u.t][0].second,0,u.w+G[u.t][0].first));}for(int i=1;i<=Q;++i) printf("%lld\n",ans[ask[i]]);}return 0; }

6706 huntian oy

\(gcd(i^a-j^a,i^b-j^b)=i-j(a,b互質)\)
\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i}(i-j)[(i,j)=1]\)
\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i}i-\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{i}j([(i,j)=1])\)
與他互質的和為\(\frac{n*\phi(n)}{2},因為i\)對應\(n-i\)
\(\sum\limits_{i=1}^{n}i*\phi(i)-\sum\limits_{i=1}^{n}(\frac{i*\phi(i)}{2}+[i==1])\)
\(\frac{(\sum\limits_{i=1}^{n}i*\phi(i))-1}{2}\)
用杜教篩來求\(i*\phi(i)\)的前綴和就行了。
\(f(x)=x*\phi(x)\)
\((f*g)(n)=\sum\limits_{d|n}g(d)*\phi(\frac{n}ozvdkddzhkzd)*\frac{n}ozvdkddzhkzd\)
顯然\(g(i)為id(i)\)最合適。
\((f*g)(n)=n*\sum\limits_{d|n}\phi(\frac{n}ozvdkddzhkzd)=n^2\)
\(g(1)S(n)=\sum\limits_{i=1}^{n}g(i)S(\frac{n}{i})-\sum\limits_{i=2}^{n}g(i)S(\frac{n}{i})\)
\(S(n)=\sum\limits_{i=1}^{n}i^2-\sum\limits_{i=2}^{n}iS(\frac{n}{i})\)

#include <bits/stdc++.h> #define ll long long using namespace std; const int _=5e6+7,mod=1e9+7,limit=5000000; int read() {int x=0,f=1;char s=getchar();for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';return x*f; } int inv_2,inv_6,vis[_],pri[_],cnt; ll phi[_]; int q_pow(int a,int b) {int ans=1;while(b) {if(b&1) ans=1LL*ans*a%mod;a=1LL*a*a%mod,b>>=1;} return ans; } void Euler() {vis[1]=phi[1]=1;for(int i=1;i<=limit;++i) {if(!vis[i]) pri[++cnt]=i,phi[i]=i-1;for(int j=1;j<=cnt&&pri[j]*i<=limit;++j) {vis[pri[j]*i]=1;if(i%pri[j]==0) {phi[i*pri[j]]=phi[i]*pri[j];break;} else phi[i*pri[j]]=phi[i]*(pri[j]-1);}}for(int i=2;i<=limit;++i) phi[i]=(phi[i-1]+1LL*phi[i]*i%mod)%mod; } unordered_map<int,int> ans_phi; int get(int n) {return 1LL*n*(n+1)/2%mod;} int solve_phi(int n) {if(n<=limit) return phi[n];if(ans_phi[n]) return ans_phi[n];ll tmp=1LL*n*(n+1)%mod*(2*n+1)%mod*inv_6%mod;for(int l=2,r;l<=n;l=r+1) {r=n/(n/l),tmp-=1LL*(get(r)-get(l-1))*solve_phi(n/l)%mod,tmp=(tmp%mod+mod)%mod;} return ans_phi[n]=tmp; } int main() {inv_2=q_pow(2,mod-2),inv_6=q_pow(6,mod-2);Euler();int T=read();while(T --> 0) {int N=read();int ans=1LL*(solve_phi(N)-1)*inv_2%mod;ans=(ans%mod+mod)%mod;printf("%d\n",ans);N=read(),N=read();}return 0; }

6707 Shuffle Card

想了半天也不會啊,平衡樹還很麻煩,不想寫。
其實倒著做就行了,用\(stack\)其實本質也是倒著做。

#include <bits/stdc++.h> using namespace std; const int _=2e5+7; int n,m,a[_],b[_],vis[_]; vector<int> ans; int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%d",&a[i]);for(int i=1;i<=m;++i) scanf("%d",&b[i]);for(int i=m;i>=1;--i) {if(vis[b[i]]) continue;vis[b[i]]=1;ans.push_back(b[i]);}for(int i=1;i<=n;++i) {if(vis[a[i]]) continue;ans.push_back(a[i]);}for(int i=0;i<n;++i) cout<<ans[i]<<" ";return 0; }

6708 Windows Of CCPC

這是\(yjg\)外出模擬賽的\(luogu\)原題啊,\(axm\)還拉我做過,把\(0,1\)改成了\(C,P\)了而已。
遞歸即可。
分成四塊,先遞歸第一塊,剩下的三塊復制第一塊的內容,然后第四塊取反。

#include <bits/stdc++.h> using namespace std; const int _=1207; int n,A[_][_]; void copp(int x,int y,int len) {for(int i=0;i<len;++i)for(int j=0;j<len;++j)A[x+i][y+j]=A[i][j]; } void print(int x) {for(int i=0;i<(1<<x);++i) {for(int j=0;j<(1<<x);++j)printf("%c",A[i][j]?'C':'P');printf("\n");} } void calc(int n) {if(n==0) return A[0][0]=1,void();calc(n-1);int len=1<<(n-1);copp(0,len,len);copp(len,len,len);for(int i=0;i<len;++i)for(int j=0;j<len;++j)A[len+i][j]=A[i][j]^1; } int main() {int T;cin>>T;while(T-->0) {int x;cin>>x;calc(x);print(x);} }

6709 Fishing Master

補充:看到zhihu好多全局釣魚的,其實不難吧。
考慮dp,不會。貪心。
首先一開始肯定要先捉一次魚。
發現捉魚分兩種種。
1.煮魚的時間內能去捉魚并且在鍋里魚沒熟之前回來。
2.煮魚的時間內能去捉魚并且在鍋里魚熟之后時候回來。
顯然1這種情況能干就干,相當于一開始就捉到了這些條。
剩下的捕魚就得是情況2了,因為剩下的煮魚時間都是小于捕魚時間的,當然是貪心的從煮魚時間大的開始捉。
發現這樣一定能安排上(先捉情況2,然后過程中能捉1就捉1)。
然后就做完了。

#include <iostream> #include <algorithm> #define ll long long using namespace std; const int _=2e5+7; ll n,m,t[_]; int main() {std::ios::sync_with_stdio(false);ll T;cin>>T;while(T --> 0) { cin>>n>>m;for(ll i=1;i<=n;++i) cin>>t[i];sort(t+1,t+1+n);ll ma=0,ans=0;for(ll i=1;i<=n;++i) ma+=t[i]/m;for(ll i=1;i<=n;++i) ans+=t[i];ans+=m;if(ma>=n-1) {cout<<ans<<"\n";} else {ll need=n-1-ma;for(ll i=1;i<=n;++i) t[i]-=t[i]/m*m;sort(t+1,t+1+n);for(ll i=n;i>=1;--i) {need--;ans+=m-t[i]; if(!need) break;}cout<<ans<<"\n";} } }

轉載于:https://www.cnblogs.com/dsrdsr/p/11406004.html

總結

以上是生活随笔為你收集整理的2019CCPC网络预选赛 八道签到题题解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 污网站免费在线观看 | 精品国产一区二区三区久久久久久 | 亚洲熟女综合一区二区三区 | 中文字幕在线播放 | 日韩美女国产精品 | 国产日韩精品一区二区三区在线 | 草久久久 | 国产亚洲精久久久久久无码苍井空 | 黄色片网战 | 日韩黄色免费电影 | 亚洲热热 | 日本www网站 | 福利电影一区二区三区 | 四虎国产精品永久在线国在线 | 国产91av在线 | 亚洲狼人综合 | 巨乳中文字幕 | 亚洲激情一区二区三区 | 91视频二区| 中文字幕一区二区三区四区五区 | 五月依人网 | 欧美在线免费观看视频 | 欧美一区二区视频在线 | av成人在线免费观看 | 亚洲自拍偷拍综合 | jizz成熟丰满老女人 | 欧美综合视频在线观看 | 伊人久久大香线蕉av色婷婷色 | 亚洲欧洲av在线 | 手机av免费在线 | 国产欧美日韩亚洲 | 一区二区三区高清在线观看 | 亚洲av综合色区无码一区 | 国产麻豆精品久久一二三 | 欧美性免费| 日韩高清av在线 | 国产老头和老头xxxx× | 天堂а√在线最新版中文在线 | 成人一区在线观看 | 欧美午夜久久 | 中文字幕在线色 | 不卡影院一区二区 | 91福利在线视频 | 久久三级网站 | 中文字幕在线播放不卡 | 国产性生活片 | 男女在线观看视频 | 成人超碰| 七七久久 | 日本久久爱 | 69xxx免费视频 | 久久久久女教师免费一区 | 日本三级理论片 | 老妇裸体性激交老太视频 | 成人吃奶视频 | 8x8x永久免费视频 | 欧美理伦片在线播放 | 亚洲精品国产精品国自产网站 | 午夜做爰xxxⅹ性高湖视频美国 | 午夜久久一区 | 性折磨bdsm欧美激情另类 | 最新不卡av| 在线观看日韩国产 | 色综合久久88 | 蜜臀网在线| 黄网地址| 91九色中文 | 男人深夜影院 | 用力使劲高潮了888av | 日韩午夜激情视频 | 美女少妇毛片 | 国产精品久久久久无码av | 久久瑟瑟| 99re热这里只有精品视频 | 亚洲狠狠丁香婷婷综合久久久 | a免费视频 | 国产美女永久无遮挡 | 欧美影院一区 | 宅男噜噜噜66一区二区 | 国产精品一卡二卡 | 公交顶臀绿裙妇女配视频 | 欧美亚一区二区三区 | 日韩免费观看一区二区 | 国产精品网页 | 五月天婷婷爱 | 好吊日av | 波多野结衣电影免费观看 | 黄污视频网站 | 玖草在线 | 色综合一区二区 | 激情狠狠 | www夜片内射视频日韩精品成人 | 国产精品嫩草影院av蜜臀 | 免费小视频在线观看 | 亚洲av无码国产精品久久 | 成人福利网站在线观看 | 亚洲天堂黄 | 成人xx视频 | 日本一区二区三区久久久久 |