【2022 CCPC 桂林站】

蒟蒻侥幸铜(打铁原地退役算了
赛前看着参赛队伍大名单就感觉够呛,不少985/211等强校一队,rank+=n。实际战况确实如此,一边开题一边感慨这么多细节怎么这么多队直接冲过去了…换来的就是无尽的焦急……

A - Lily

赛时2分钟有人过A,签到题,急速跟题,6分钟1A拿下。

题意

‘L’ 的左右两侧不能有 ‘C’。

题解

所有两侧(包括自身)没有 ‘L’ 的字符替换为 ‘C’。

代码

#include<bits/stdc++.h>
#define ll long long
#define L(i,j,k) for(ll i=j;i<=k;++i)
#define R(i,j,k) for(ll i=j;i>=k;--i)
using namespace std;
const ll N=1e6+10;ll n,m,k,p,t;
char s[N];void solve(){scanf("%lld",&n);scanf("%s",s+1);s[0]='.',s[n+1]='.';L(i,1,n){if(s[i-1]=='L'||s[i+1]=='L'||s[i]=='L');else s[i]='C';}L(i,1,n)printf("%c",s[i]);printf("\n");
}int main(){ll cas=1;while(cas--)solve();
}

M - Youth Finale

开完签到就在瞎晃,此时有队伍过了E,猜了个结论冲了一发成功WA掉,然后掉头开M。

题意

给定初始数组,有两种操作:1. 可以将最前面的元素移至最后;2. 将整个数组翻转。
给出冒泡排序的代码,要求每次操作后,输出当前数组进行冒泡排序的swap次数。

题解

可以发现冒泡排序的swap次数就是逆序对数量。
假设当前逆序对数量为ppp,当前第一个元素为a1a_1a1​,最后一个元素为ana_nan​。

  • 对于操作2,翻转整个数组,易得操作后的逆序对数 p′=n(n−1)2−pp'=\frac{n(n-1)}{2}-pp′=2n(n−1)​−p。
  • 对于操作1,如果当前操作2的数量为奇数,则等同于将最后一个元素移至最前面,p′=p−(a1−1)+(n−a1)p'=p-(a_1-1)+(n-a_1)p′=p−(a1​−1)+(n−a1​);如果当前操作2的数量为偶数,即将第一个元素移至最后面,p′=p−(n−an)+(an−1)p'=p-(n-a_n)+(a_n-1)p′=p−(n−an​)+(an​−1)。

代码

#include<bits/stdc++.h>
#define ll long long
#define L(i,j,k) for(ll i=j;i<=k;++i)
#define R(i,j,k) for(ll i=j;i>=k;--i)
using namespace std;
const ll N=1e6+10,inf=1e18;
ll dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};ll n,m,k,p,t,x,y,z;
ll ans;
ll a[N],tr[N];
char s[N];deque<ll>sq;void updata(ll i){while(i<=n){tr[i]++;i+=i&-i;}
}ll qry(ll i){ll res=0;while(i>0){res+=tr[i];i-=i&-i;}return res;
}void solve(){scanf("%lld%lld",&n,&m);k=0;L(i,1,n){scanf("%lld",&x);k+=x-1-qry(x);updata(x);sq.push_back(x);}bool fg=0;scanf("%s",s+1);printf("%lld\n",k);L(i,1,m){if(s[i]=='S'){if(!fg){ll x=sq.front();sq.pop_front();k-=x-1;k+=n-x;sq.push_back(x);}else{ll x=sq.back();sq.pop_back();k+=x-1;k-=n-x;sq.push_front(x);}}else{fg=!fg;}//printf("(%lld)",k);if(!fg){printf("%lld",k%10);}else printf("%lld",(n*(n-1)-k)%10);}
}int main(){ll cas=1;//scanf("%lld",&cas);while(cas--)solve();
}

C - Array Concatenation

过M后逛了圈榜,决定开C。C推麻了,规律都找到了,结果时间都浪费在,预处理开小了的bug上。

题意

给定一个数组 b={b1,b2,...,bn}b=\{b_1,b_2,...,b_n\}b={b1​,b2​,...,bn​},进行mmm次以下操作之一:

  1. 使 b′={b1,b2,...,bn,b1,b2,...,bn}b'=\{b_1,b_2,...,b_n,b_1,b_2,...,b_n\}b′={b1​,b2​,...,bn​,b1​,b2​,...,bn​},b=b′b=b'b=b′;
  2. 使 b′={bn,bn−1,...,b1,b1,b2,...,bn}b'=\{b_n,b_{n-1},...,b_1,b_1,b_2,...,b_n\}b′={bn​,bn−1​,...,b1​,b1​,b2​,...,bn​},b=b′b=b'b=b′;

求操作后的 bbb 数组的前缀和之和取模后的最大值。
即求 max⁡{∑i=1n′∑j=1ibj(mod(109+7))}\max \{ \sum_{i=1}^{n'}\sum_{j=1}^i b_j(mod\ (10^9+7))\ \}max{∑i=1n′​∑j=1i​bj​(mod (109+7)) }

题解

找规律!

  • 规律1:进行一次操作2后,后续无论进行什么操作,bbb 数组都一样;
  • 规律2:进一步总结,发现无论何时进行操作2后,对结果的影响都是一样的。

因此,答案只有两种情况,全是操作1的,以及进行过操作2的。O(m)O(m)O(m) 暴力求解即可。

代码

#include<bits/stdc++.h>
#define ll long long
#define L(i,j,k) for(ll i=j;i<=k;++i)
#define R(i,j,k) for(ll i=j;i>=k;--i)
using namespace std;
const ll N=1e6+10,inf=1e18,mod=1e9+7;
ll dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};ll n,m,k,p,t,x,y,z;
ll sm,sum,ans;
ll a[N],b[N],tr[N];
char s[N];deque<ll>sq;void solve(){scanf("%lld%lld",&n,&m);b[0]=1;L(i,1,2*m)b[i]=b[i-1]*2%mod;L(i,1,n)scanf("%lld",&a[i]),p+=a[i],k+=a[i]*(n-i+1)%mod;p%=mod,k%=mod;ans=0;ll x=2*n+1;L(i,1,m-1){x=(x*2+n*b[2*i]%mod)%mod;}ans=x*p%mod;L(i,1,m){k=(k+k+p*n%mod)%mod;p=p*2%mod;n=n*2%mod;}//k=(k*b[m]%mod+p*n%mod*(b[m]-1)%mod*b[m-1]%mod)%mod;ans=max(ans,k);printf("%lld\n",ans);
}int main(){ll cas=1;//scanf("%lld",&cas);while(cas--)solve();
}

E - Draw a triangle

过C后,一旁悟E的队友悟的差不多了,直接喂我扩欧解法,觉得没毛病直接开冲,但是不是用向量求解的,正负特判了好久。

题意

给定两个整数点,要求找出第三个整数点,使得够出的有效三角形面积最小。

题解

假设 x0<x1,y0<y1x_0<x_1\ ,y_0<y_1x0​<x1​ ,y0​<y1​,令 x2=x0+x,x′=x1−x0,y′=y1−y0x_2=x_0+x\ ,x'=x_1-x_0\ ,y'=y_1-y_0x2​=x0​+x ,x′=x1​−x0​ ,y′=y1​−y0​。
可以推出,要使三角形面积最小,即使 xy′modx′xy'\mod x'xy′modx′ 最小。
设 xy′=kx′+bxy'=kx'+bxy′=kx′+b,即 b=−kx′+xy′b=-kx'+xy'b=−kx′+xy′,由扩欧知,bmin=gcd(x′,y′)b_{min}=gcd(x',y')bmin​=gcd(x′,y′)。
利用扩欧 exgcdexgcdexgcd,求得一组(−k,x)(-k,x)(−k,x)的解,剩下得交给正负性判断就行了。

代码

#include<bits/stdc++.h>
#define ll long long
#define L(i,j,k) for(ll i=j;i<=k;++i)
#define R(i,j,k) for(ll i=j;i>=k;--i)
using namespace std;
const ll N=1e6+10,inf=1e18;
ll dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};ll n,m,k,p,t,x,y;
ll ans;
char s[N];ll cal(ll x0,ll y0,ll x1,ll y1,ll x2,ll y2){return abs((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0));
}ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1,y=0;return a;}ll r=exgcd(b,a%b,x,y);ll t=x;x=y,y=t-a/b*y;return r;
}void solve(){ll x0,y0,x1,y1,x2,y2,nx,ny;scanf("%lld%lld%lld%lld",&x0,&y0,&x1,&y1);ans=inf;L(i,0,3){x2=x0+dx[i];y2=y0+dy[i];ll x=cal(x0,y0,x1,y1,x2,y2);if(x<ans&&x>0){nx=x2,ny=y2;ans=x;}}L(i,0,3){x2=x1+dx[i];y2=y1+dy[i];ll x=cal(x0,y0,x1,y1,x2,y2);if(x<ans&&x>0){nx=x2,ny=y2;ans=x;}}if(x0==x1||y0==y1){printf("%lld %lld\n",nx,ny);return;}ll ex=abs(x1-x0),ey=abs(y1-y0);k=exgcd(-ex,ey,x,y);y-=y/(ex/k)*(ex/k);if(y<0)y+=abs(ex/k);double y3;if(x0<x1){x2=x0+y;y3=((x2-x0)*((double)(y0-y1))/(x0-x1))+y0;y2=y3;if(y3>0)if(y3-y2>0.5)y2++;if(y3<=0)if(y2-y3>0.5)y2--;}else{x2=x1+y;y3=((x2-x0)*((double)(y0-y1))/(x0-x1))+y0;y2=y3;if(y3>0)if(y3-y2>0.5)y2++;if(y3<=0)if(y2-y3>0.5)y2--;}ll x=cal(x0,y0,x1,y1,x2,y2);if(x<ans&&x>0){nx=x2,ny=y2;ans=x;}printf("%lld %lld\n",nx,ny);
}int main(){ll cas=1;scanf("%lld",&cas);while(cas--)solve();
}

G - Group Homework

过E后,时间已经所剩无几,场上也只有G能开(L纳什被劝退了,但后续发现只是构造题)。G的树dp细节真多,码完但没时间debug了,寄。

题意

给定一棵树,要求选两条路径,两条路径的价值为路径上不重合的点的权值和,求最大价值。

题解

很明显,两条路径要么相交于一点,要么互不相交为最优解。对于前者,枚举哪个点作为相交点,计算四条链的最大权值;对于后者,枚举边 (u,fu)(u,f_u)(u,fu​)(fuf_ufu​ 是点 uuu 的父亲),考虑点 uuu 的子树中选择一条路径的最大权值,加上选择 fuf_ufu​ 作为第二条路径的一个点,或两条路径的 lcalcalca 为点 fuf_ufu​。

代码

#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define x0 fi
#define x1 se.fi
#define x2 se.se
#define th second.second
#define L(i,j,k) for(ll i=j;i<=k;++i)
#define R(i,j,k) for(ll i=j;i>=k;--i)
using namespace std;
const ll N=1e6+10,inf=1e18,mod=1e9+7;
ll dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};ll n,m,k,p,t,x,y,z;
ll sm,sum,ans;
ll a[N],b[N],dp[N];
char s[N];
pair<ll,ll>pr[N];
pair<ll,pair<ll,ll>>tp[N];struct edge{ll cnt,hed[N],to[N*2],nxt[N*2];void add(ll u,ll v){to[++cnt]=v,nxt[cnt]=hed[u],hed[u]=cnt;}void ADD(ll u,ll v){add(u,v);add(v,u);}
}eg;void dfs0(ll u,ll ac){auto tmp=make_pair(0,make_pair(0,0));for(ll i=eg.hed[u];i;i=eg.nxt[i]){ll v=eg.to[i];if(v!=ac){dfs0(v,u);ll val=tp[v].x0+a[v];if(val>=tmp.x0){tmp.x2=tmp.x1;tmp.x1=tmp.x0;tmp.x0=val;}else if(val>=tmp.x1){tmp.x2=tmp.x1;tmp.x1=val;}else if(val>tmp.x2){tmp.x2=val;}}}tp[u]=tmp;
}void dfs1(ll u,ll ac,ll val){dp[u]=val+a[u];for(ll i=eg.hed[u];i;i=eg.nxt[i]){ll v=eg.to[i];if(v!=ac){if(tp[v].x0+a[v]==tp[u].x0){dfs1(v,u,max(tp[u].x1+a[u],dp[u]));}else{dfs1(v,u,max(tp[u].x0+a[u],dp[u]));}}}
}void dfs2(ll u,ll ac){pair<ll,ll>tmp=make_pair(0,0);for(ll i=eg.hed[u];i;i=eg.nxt[i]){ll v=eg.to[i];if(v!=ac){dfs2(v,u);if(pr[v].fi>=tmp.fi){tmp.se=tmp.fi;tmp.fi=pr[v].fi;}else if(pr[v].fi>tmp.se){tmp.se=pr[v].fi;}}}ans=max(ans,tmp.fi+tmp.se);//printf("%lld: %lld\n",u,ans);for(ll i=eg.hed[u];i;i=eg.nxt[i]){ll v=eg.to[i];if(v!=ac){if(tp[v].x0+a[v]==tp[u].x0){ans=max(ans,pr[v].fi+tp[u].x1+dp[u]);ans=max(ans,pr[v].fi+tp[u].x1+tp[u].x2+a[u]);}else{ans=max(ans,pr[v].fi+tp[u].x0+dp[u]);if(tp[v].x0+a[v]==tp[u].x1){ans=max(ans,pr[v].fi+tp[u].x0+tp[u].x2+a[u]);}else{ans=max(ans,pr[v].fi+tp[u].x0+tp[u].x1+a[u]);}}//printf("%lld %lld: %lld\n",u,v,ans);}}ll val=tp[u].fi+a[u];if(tp[u].x1)val+=tp[u].x1;if(val>=tmp.fi){tmp.se=tmp.fi;tmp.fi=val;}else if(val>tmp.se){tmp.se=val;}pr[u]=tmp;
}void dfs3(ll u,ll ac){vector<ll> sv;sv.push_back(dp[u]-a[u]);for(ll i=eg.hed[u];i;i=eg.nxt[i]){ll v=eg.to[i];if(v!=ac){dfs3(v,u);sv.push_back(tp[v].x0+a[v]);}}sort(sv.begin(),sv.end());ll siz=sv.size();if(siz<4)return;ll res=0;R(i,siz-1,siz-4){res+=sv[i];}ans=max(res,ans);
}void solve(){scanf("%lld",&n);L(i,1,n)scanf("%lld",&a[i]);L(i,1,n-1){scanf("%lld%lld",&x,&y);eg.ADD(x,y);}dfs0(1,0);dfs1(1,0,0);dfs2(1,0);dfs3(1,0);// L(i,1,n)printf("%lld %lld %lld\n",tp[i].x0,tp[i].x1,tp[i].x2);// L(i,1,n)printf("%lld ",dp[i]);printf("\n");// L(i,1,n)printf("%lld %lld\n",pr[i].fi,pr[i].se);printf("%lld\n",ans);
}int main(){ll cas=1;//scanf("%lld",&cas);while(cas--)solve();
}

【2022 CCPC 桂林站 日志】部分题解相关推荐

  1. 2022 CCPC桂林站 D Alice‘s Dolls 题解

    题目链接:https://codeforces.com/gym/104008/problem/D 题意:抽一次有 ppp 的概率抽到东西,(1−p)(1-p)(1−p) 的概率抽不到,对于所有的 1≤ ...

  2. 勇夺四冠,风行游艇在2022 CCPC专业站中展现超群实力

    8月28日,经过激烈角逐,为期三天的2022 CCPC中国量产车大赛专业站圆满落幕,在强敌环伺的赛事中,风行游艇脱颖而出,强势摘得四个比赛项目小组第一名,再次印证了卓越的产品实力. 征战2022 CC ...

  3. CCPC 桂林站总结

    2018 CCPC 桂林站 总结 这次到了桂林,又是打铁,差点出了H就能铜了,比去年杭州不丢人一点,但是我的心比去年还痛. 赛前 坐火车20小时左右才到的桂林,舟车劳顿,到桂林前一晚中途醒来好几次(特 ...

  4. 2022年ccpc桂林站

    A. Lily 题目链接:Problem - A - Codeforces 样例一输入: 5 ..L.. 样例一输出: C.L.C 样例二输入: 2 .. 样例二输出: CC 简化题意:给定一个只含有 ...

  5. 2018 CCPC 桂林站小结

    第三次现场赛,金了 热身赛 4道题,我一上来就扑在概率上无法自拔,最终也没搞出来,写出一个自积分的函数无可奈何.狂WA不止的一道题,全队看了好几遍代码也不知道错在哪里,结束后发现隔壁AC该题的队伍留在 ...

  6. 2021第7届中国大学生程序设计竞赛CCPC桂林站, 签到题5题

    文章目录 A.Hero Named Magnus I. PTSD G. Occupy the Cities E. Buy and Delete D.Assumption is All You Need ...

  7. 2022 CCPC补题(更新中...)

    2022 CCPC补题(更新中-) 看着学校的佬参加了CCPC和ICPC,自己作为一名准ACMer,就来把一些签到题做一下. ps:恭喜我校的梭哈队获得银牌. 第一场 链接: 2022 CCPC桂林 ...

  8. 2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树)

    2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树) 之前一直对线段树有种恐惧感,感觉十分晦涩难懂,但是我还是得迎男而上!这题必须补!我说的!耶稣都留不住! 题目 h ...

  9. 【开赛啦!邀你来战 】2022年“桂林银行杯”数据建模大赛暨全国大学生数学建模竞赛广西赛区热身赛

    2022年"桂林银行杯"数据建模大赛 大赛背景 桂林银行股份有限公司(以下称"桂林银行"),以金融成就美好生活为使命,以承接国家和地方发展战略为己任,服务地方经 ...

最新文章

  1. python监控端口_python3 端口监控
  2. 男生的哪个“不要”是真的不要?
  3. BCC实例(如何修改NS解析方式为百度智能云解析) - 解答篇
  4. 装修要找大品牌还是游击队,还是包工头?
  5. 位数(digits)的处理
  6. jQuery Mobile事件,开发全解+完美注释
  7. Linux操作系统-----应用开发概述
  8. 电视家3.0怎么安装到电视上?常用三种方法介绍
  9. 全方面对比流行报表开发工具,哪一个才是你的菜?
  10. XSS 防御方法总结
  11. cmd静默运行_如何在Win10上静默运行批处理文件
  12. validation--数据校验
  13. Window-10 Hyper-V 安装 Windows 10
  14. 杨辉三角 帕斯卡三角形(C语言)
  15. 连花清瘟胶囊新冠应用 大健康医药·李喜贵:微量元素作用解密
  16. 利用cookie收取Hotmail信件
  17. 【虹科方案】新能源车测试-雷诺Kangoo电动汽车充电故障诊断
  18. AARRR模型——激活:获客红海背后的蓝海(下)
  19. Onvif认证测试1--Device test tool
  20. Windows下安装OMNET++仿真工具

热门文章

  1. NSA/SA手机都是真5G 用户已购5G手机不受明年政策影响
  2. 编程题——扑克牌大小
  3. DSF框架使用(DAO、序列化、注解、服务接口、服务代理)
  4. python写代码没思路_如何训练自己的编程思路
  5. 20条技巧,让Chrome超越Firefox (2010-11-16更新)
  6. matlab绘图z=sin(x_如何用matlab的plot命令画出y=sin(1/x)的图形
  7. 安恒堡垒机使用手册_齐治堡垒机简易使用手册
  8. 看完面经,他拿出一打大厂offer玩起了斗地主,人生不过是如此枯燥乏味....
  9. 国泰航空免费赠送11万余张出境机票,海外目的地包括美国、加拿大、英国、法国等...
  10. golang编辑器查看git哪一行是谁修改的,什么时候修改的方法