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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2020 China Collegiate Programming Contest Weihai Site补题部分

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2020 China Collegiate Programming Contest Weihai Site补题部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

A. Golden Spirit

簽到題,首先把所有老人帶到對岸,然后在對休息討論一下即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; int main() {IO;int T=1;cin>>T;while(T--){ll n,x,t;cin>>n>>x>>t;ll p=2*n*t;if(p-2*t>=x) cout<<2*p<<'\n';else{ll w=x-p+2*t;if(w>=t) {p+=t;cout<<2*n*t+p+max(0ll,x-2*n*t)<<'\n';}elsecout<<2*p+w<<'\n';}}return 0; }

C. Rencontre

大佬題解

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) //#pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; int n,m; int h[N],e[2*N],ne[2*N],idx; ll w[2*N]; int sz[N]; int can[N][4]; int cnt[4]; void add(int a,int b,ll c) {e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++; } ll res1,res2,res3; void dfs(int u,int fa) {for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;dfs(j,u);for(int k=1;k<=3;k++) can[u][k]+=can[j][k];res1+=w[i]*can[j][1]*(cnt[2]-can[j][2])+w[i]*can[j][2]*(cnt[1]-can[j][1]);res2+=w[i]*can[j][2]*(cnt[3]-can[j][3])+w[i]*can[j][3]*(cnt[2]-can[j][2]);res3+=w[i]*can[j][3]*(cnt[1]-can[j][1])+w[i]*can[j][1]*(cnt[3]-can[j][3]);} }int main() {IO;int T=1;//cin>>T;while(T--){memset(h,-1,sizeof h);cin>>n;for(int i=1;i<n;i++){int a,b;ll c;cin>>a>>b>>c;add(a,b,c),add(b,a,c);}for(int i=1;i<=3;i++){cin>>cnt[i];for(int j=1;j<=cnt[i];j++){int x;cin>>x;can[x][i]=1;}}dfs(1,-1);double d1=(double)res1/((double)cnt[1]*cnt[2]);double d2=(double)res2/((double)cnt[3]*cnt[2]);double d3=(double)res3/((double)cnt[1]*cnt[3]);double ans=(d1+d2+d3)/2;printf("%.9lf\n",ans);}return 0; }

自己非常害怕樹的問題,尤其是樹形dp之類的
總結:像這種考慮貢獻的可以嘗試逐點考慮或者逐邊考慮(本題)

D. ABC Conjecture

c=p1α1p2α2…pkαkc=p_1^{\alpha_1}p_2^{\alpha_2}\dots p_k^{\alpha_k}c=p1α1??p2α2??pkαk??
只要存在αi>1\alpha_i>1αi?>1就能夠滿足題意,如下嘗試構造一組ababab,不妨設αi>1\alpha_i>1αi?>1
a=p1α1…(piαi?1)…p1α1a=p_1^{\alpha_1}\dots (p_i^{\alpha_i-1})\dots p_1^{\alpha_1}a=p1α1??(piαi??1?)p1α1??
b=p1α1…[(pi?1)×piαi?1]…p1α1b=p_1^{\alpha_1}\dots [(p_i-1)×p_i^{\alpha_i-1}]\dots p_1^{\alpha_1}b=p1α1??[(pi??1)×piαi??1?]p1α1??
明顯上述a+b=ca+b=ca+b=c,且由于pi?1<pip_i-1<p_ipi??1<pi?,腦補一下rad(abc)<crad(abc)<crad(abc)<c一定成立

由于c范圍很大,如果你只會線性篩只需要先線性篩質數,然后試除法分解質因數,但是可能分解不徹底,對于分解之后剩下的部分只需要特判一下(由于(107)3>1018(10^7)^3>10^{18}(107)3>1018),如果存在大于10710^7107的質因數,該質因數的次冪最大是2。由此可特判

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=10000010; int cnt,prime[N]; bool st[N]; void init(int n) {for(int i=2;i<=n;i++){if(!st[i]) prime[++cnt]=i;for(int j=1;prime[j]<=n/i;j++){st[i*prime[j]]=1;if(i%prime[j]==0) break;}} } int main() {IO;int T=1;cin>>T;init(10000000);while(T--){ll c;cin>>c;bool ok=0;for(int i=1;i<=cnt;i++){ll p=prime[i];int s=0;if(c%p==0){while(c%p==0)c/=p,s++;}if(s>=2) ok=1;}ll x=sqrt(c);if(c>1&&1ll*x*x==c) ok=1;if(ok) cout<<"yes\n";else cout<<"no\n";}return 0; }

如果沒想到上述特判方法那么需要更快速的方法分解質因數,Pollard’s rho模板題?我想可能出題人本意不是這個,會的越多就能越暴力解決問題,降低思維難度!!!

總結:做題還是需要多想想,而且要相信對于自己現在的掌握的算法已經足夠解決一些題目。

G. Caesar Cipher

線段樹+hash
看到這個題想到hash了,不過由于hash需要取模而且題目中也需要取模自己就非常亂,根本不明白什么時候取哪個模😵

看到正解后發現非常巧妙,由于每次只進行+1,而且對于65536取模,最終可以知道q次詢問后溢出數的總個數不會很多,由此每次進行區間+1后我們check一下是否有溢出的數,如果有直接單點修改即可,只需要多維護一個區間最大值mx。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=500010,P=131; const int mod1=1e9+7; const int mod2=65536; struct node {int l,r;ll lazy;ll hs,mx; }tree[N<<2]; ll p[N],one[N]; int n,q; void pushup(int u) {int len=tree[u<<1|1].r-tree[u<<1|1].l+1;tree[u].hs=(tree[u<<1].hs*p[len]%mod1+tree[u<<1|1].hs)%mod1;tree[u].mx=max(tree[u<<1].mx,tree[u<<1|1].mx); } void build(int u,int l,int r) {tree[u]={l,r,0};if(l==r){cin>>tree[u].hs;tree[u].mx=tree[u].hs;return;}int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u); } void pushdown(int u) {if(tree[u].lazy==0) return;int lenl=tree[u<<1].r-tree[u<<1].l+1;int lenr=tree[u<<1|1].r-tree[u<<1|1].l+1;tree[u<<1].hs=(tree[u<<1].hs+tree[u].lazy*one[lenl]%mod1)%mod1;tree[u<<1|1].hs=(tree[u<<1|1].hs+tree[u].lazy*one[lenr]%mod1)%mod1;tree[u<<1].mx+=tree[u].lazy;tree[u<<1|1].mx+=tree[u].lazy;tree[u<<1].lazy+=tree[u].lazy;tree[u<<1|1].lazy+=tree[u].lazy;tree[u].lazy=0; } void add(int u,int l,int r) {if(l<=tree[u].l&&tree[u].r<=r){tree[u].lazy++;tree[u].mx++;int len=tree[u].r-tree[u].l+1;tree[u].hs=(tree[u].hs+one[len])%mod1;return;}pushdown(u);int mid=tree[u].l+tree[u].r>>1;if(l<=mid) add(u<<1,l,r);if(r>mid) add(u<<1|1,l,r);pushup(u); } ll query(int u,int l,int r) {if(l<=tree[u].l&&tree[u].r<=r) return tree[u].hs;pushdown(u);int mid=tree[u].r+tree[u].l>>1;ll v=0;if(r<=mid) v=query(u<<1,l,r);else if(l>mid) v=query(u<<1|1,l,r);elsev=(query(u<<1,l,mid)*p[r-mid]%mod1+query(u<<1|1,mid+1,r))%mod1;return v; } void check(int u) {if(tree[u].mx<mod2) return;if(tree[u].l==tree[u].r) {tree[u].mx-=mod2;tree[u].hs-=mod2;return;}pushdown(u);if(tree[u<<1].mx>=mod2) check(u<<1);if(tree[u<<1|1].mx>=mod2) check(u<<1|1);pushup(u); } int main() {IO;int T=1;//cin>>T;while(T--){cin>>n>>q;p[0]=1;for(int i=1;i<=n;i++) p[i]=p[i-1]*P%mod1,one[i]=(one[i-1]*P%mod1+1)%mod1;build(1,1,n);while(q--){int op,l,r;cin>>op>>l>>r;if(op==1) {add(1,l,r);check(1);}else{int len;cin>>len;if(query(1,l,l+len-1)==query(1,r,r+len-1)) cout<<"yes\n";else cout<<"no\n";}}}return 0; }

H. Message Bomb

大佬題解
cnticnt_icnti?當前群消息個數,ansians_iansi?iii個人收到消息個數,用一個set記錄當前某人所在的群聊。
差分的思想:一個人加入群聊時減去該群聊之前的消息數,退出群聊時加上該群聊當前的消息數,最后加上未退出的群聊消息數

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) //#pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; int n,m,s; int cnt[N]; int ans[N]; set<int> g[N]; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n>>m>>s;while(s--){int op,x,y;cin>>op>>x>>y;if(op==1){g[x].insert(y);ans[x]-=cnt[y];}else if(op==2){g[x].erase(y);ans[x]+=cnt[y];}else{cnt[y]++;ans[x]--;}}for(int i=1;i<=m;i++) {for(auto t:g[i])ans[i]+=cnt[t];cout<<ans[i]<<'\n';}}return 0; }

L. Clock Master

篩素數+分組背包
#include<cmath>中的log()用不得!!!

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=30010; double f[N]; int prime[N],cnt; bool st[N]; double lg[N]; void init(int n) {for(int i=2;i<=n;i++){if(!st[i]) prime[++cnt]=i;for(int j=1;prime[j]<=n/i;j++){st[prime[j]*i]=1;if(i%prime[j]==0) break;}} } int main() {IO;int T=1;cin>>T;init(30000);for(int i=1;i<=30000;i++) lg[i]=log(i);for(int i=1;i<=cnt;i++){for(int j=30000;j>=0;j--){ll v=1;for(int k=1;;k++){v=v*prime[i];if(v>j) break;f[j]=max(f[j],f[j-v]+k*lg[prime[i]]);}}}while(T--){int b;cin>>b;printf("%.7lf\n",f[b]);}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的2020 China Collegiate Programming Contest Weihai Site补题部分的全部內容,希望文章能夠幫你解決所遇到的問題。

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