最近VP了2021年的昆明区域赛,补几道题并总结一下教训

文章目录

  • 前言
  • A.AC
  • C. Cities
  • G.Gift
  • J.Parallel Sort
  • L.Simone and graph coloring
  • M.Stone Games

前言


本次总共写出来四题,其中HHH题大水题一个,III题是计算几何二维平面中的板子题而且以前写过,所以在还算比较快的时间开出来了,JJJ题强行当了一把ddlddlddl战神,样例都没测就交了,LLL题连结论都没有好好推出来,就让sglysglysgly上机写了个树状数组,稀里糊涂的过了


A.AC

反悔贪心
用c[i]c[i]c[i]表示将字符串第iii位和第i+1i+1i+1位分别变为aaa和ccc所需要的操作数,相邻的c[i]c[i]c[i]不能重复拿取,于是问题就转换成了种树
时间复杂度O(nlog(n))O(nlog(n))O(nlog(n))

#include<bits/stdc++.h>
#define fi first
#define gcd __gcd
#define se second
#define pb push_back
#define lowbit(x) x&-x
#define inf 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
#define lrb666 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<int,int> PII;
const int maxn=5e5+7;
int n,k,c[maxn],pre[maxn],nex[maxn],vis[maxn],ans=0,num=0,flag[maxn];
char s[maxn];
void del(int x)
{vis[x]=1;pre[nex[x]]=pre[x];nex[pre[x]]=nex[x];
}
int main()
{priority_queue<PII,vector<PII>,greater<PII>>q;scanf("%d%d",&n,&k);scanf("%s",s+1);for(int i=1;i<n;i++){if(s[i]=='a' && s[i+1]=='c') c[i]=0;else if(s[i]=='a' || s[i+1]=='c') c[i]=1;else c[i]=2;q.push({c[i],i});pre[i]=i-1;nex[i]=i+1;}c[0]=inf;c[n]=inf;while(!q.empty()){if(ans==n/2) break;while(vis[q.top().se]) q.pop();if(num+q.top().fi>k) break;int u=q.top().se;q.pop();num+=c[u];flag[u]++;c[u]=c[pre[u]]+c[nex[u]]-c[u];q.push({c[u],u});del(pre[u]);del(nex[u]);ans++;}for(int i=1;i<n;i++){if(!flag[i] ) continue;for(int j=i-flag[i]+1;j<i+1+flag[i];j+=2){s[j]='a';s[j+1]='c';}}printf("%d\n",ans);for(int i=1;i<=n;i++) printf("%c",s[i]);
}

C. Cities

对于一个长度为mmm且没有相同元素的区间,需要操作m−1m-1m−1次才可维护
对于一段颜色相同的区间,其意义完全等同于一个独立的点,于是贪心的将相同区间缩为一个点
考虑区间dpdpdp来维护答案,dp[l][r]dp[l][r]dp[l][r]表示将[l,r][l,r][l,r]颜色全部变为c[r]c[r]c[r]的最小操作次数
所以若区间[l,r][l,r][l,r]没有相同的元素,dp[l][r]=dp[l][r−1]+1dp[l][r]=dp[l][r-1]+1dp[l][r]=dp[l][r−1]+1
若rrr和kkk颜色相同,则有dp[l][r]=dp[l][k]+dp[k+1][r]dp[l][r]=dp[l][k]+dp[k+1][r]dp[l][r]=dp[l][k]+dp[k+1][r]
由于同一个数字出现的次数不超过151515次,所以时间复杂度O(n2∗15)O(n^2*15)O(n2∗15)

#include<bits/stdc++.h>
#define fi first
#define gcd __gcd
#define se second
#define pb push_back
#define lowbit(x) x&-x
#define inf 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
#define lrb666 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<int,int> PII;
const int maxn=2e5+7;
int n,a[5005],f[5005][5005],vis[5005],nex[5005];
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;i++){vis[i]=0;nex[i]=0;}for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]==a[i-1]){i--;n--;} }for(int i=1;i<=n;i++){f[i][i]=0;nex[i]=vis[a[i]];vis[a[i]]=i;}for(int len=2;len<=n;len++){for(int l=1;l+len-1<=n;l++){int r=l+len-1;f[l][r]=f[l][r-1]+1;for(int k=nex[r];k>=l;k=nex[k]){f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]);}}}printf("%d\n",f[1][n]);}
}

G.Gift

对于每个朋友,我们有三种选择,给他做蛋糕,给他送礼物,什么都不送
令dp[i][j][k]dp[i][j][k]dp[i][j][k]表示对于前iii个朋友,为其中的jjj个人准备礼物,在今年的第kkk天时可以收获的最大价值
给朋友iii做蛋糕 f[i][j][k]=max(f[i][j][k],f[i−1][j][k−c]+v)f[i][j][k]=max(f[i][j][k],f[i-1][j][k-c]+v)f[i][j][k]=max(f[i][j][k],f[i−1][j][k−c]+v)
给朋友iii送礼物 f[i][j][k]=max(f[i][j][k],f[i−1][j−1][k])f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k])f[i][j][k]=max(f[i][j][k],f[i−1][j−1][k])
什么都不送 f[i][j][k]=max(f[i−1][j][k],f[i][j][k])f[i][j][k]=max(f[i-1][j][k],f[i][j][k])f[i][j][k]=max(f[i−1][j][k],f[i][j][k])
对于送礼物得到的价值,只需要二进制暴力枚举即可
时间复杂度O(n∗m∗265+2m)O(n*m*265+2^{m})O(n∗m∗265+2m)

#include<bits/stdc++.h>
#define fi first
#define gcd __gcd
#define se second
#define pb push_back
#define lowbit(x) x&-x
#define inf 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
#define lrb666 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<int,int> PII;
const int maxn=2e5+7;
int n,m,w;
int f[2][20][400];
int year,month,day,c,v;
int d[12]={0,31,59,90,120,151,181,212,243,273,304,334};
int a[25],b[25],g[20];
struct node
{int day,c,v;
}peop[505];
bool cmp(node a,node b)
{return a.day<b.day;
}
int main()
{int T;scanf("%d",&T);while(T--){memset(f,-0x3f,sizeof(f));memset(g,0,sizeof(g));scanf("%d%d%d",&n,&m,&w);for(int i=1;i<=n;i++){scanf("%d-%d-%d",&year,&month,&day);scanf("%d%d",&c,&v);if(month==2 && day==29){i--;n--;continue;}peop[i]={d[month-1]+day,c,v};}for(int i=1;i<=m;i++) scanf("%d%d",&a[i],&b[i]);for(int i=0;i<(1<<m);i++){int u=0,val=0,pri=0;for(int j=1;j<=m;j++){if(i>>(j-1)&1) u++,val+=b[j],pri+=a[j];}if(pri>w) continue;g[u]=max(g[u],val);}sort(peop+1,peop+n+1,cmp);f[0][0][0]=0;for(int i=1;i<=n;i++){int dd=peop[i].day;for(int j=0;j<=m&&j<=i;j++){for(int k=0;k<=365;k++){int u=i%2;f[u][j][k]=max(f[u^1][j][k],f[u][j][k]);if(j>0)f[u][j][k]=max(f[u][j][k],f[u^1][j-1][k]);if(k>=peop[i].c && k<=dd){f[u][j][k]=max(f[u][j][k],f[u^1][j][k-peop[i].c]+peop[i].v);}}}}int ans=0;for(int j=0;j<=m;j++){for(int k=0;k<=365;k++){ans=max(ans,f[n%2][j][k]+g[j]);}}printf("%d\n",ans);}
}

J.Parallel Sort

由于是排列,所以肯定是一些数字的环组成的,对于一个环,要环上的点统一移动一步就可以归位
这只需要最多两次操作就可以实现
假设要把(1,2...,n)(1,2...,n)(1,2...,n)变成(2,3,...,n,1)(2,3,...,n,1)(2,3,...,n,1),只需要先变成(1,n,n−1,...,2)(1,n,n-1,...,2)(1,n,n−1,...,2),再变成(2,3,...,n,1)(2,3,...,n,1)(2,3,...,n,1)即可

赛时这题浪费挺长时间的,在数字和数字下标里迷得云里雾里,赛后看题解没想到这么简单

L.Simone and graph coloring

该题最大颜色数等价于求一个最长的下降子序列
所以用树状数组或者二分去写即可

#include<bits/stdc++.h>
#define fi first
#define gcd __gcd
#define se second
#define pb push_back
#define lowbit(x) x&-x
#define inf 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
#define lrb666 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<int,int> PII;
const int maxn=1e6+7;
int a[maxn],col[maxn],ans,n,tre[maxn];
void update(int x,int num)
{for(;x<=n;x+=lowbit(x)) tre[x]=max(tre[x],num);
}
int query(int x)
{int res=0;for(;x;x-=lowbit(x)) res=max(res,tre[x]);return res;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d",&n);ans=0;for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) tre[i]=0;for(int i=n;i>=1;i--){col[i]=query(a[i]-1)+1;update(a[i],col[i]);ans=max(ans,col[i]);}printf("%d\n",ans);for(int i=1;i<=n;i++) printf("%d ",col[i]);puts("");}
}

M.Stone Games

对于区间[L,R][L,R][L,R]无法相加构造出来的最小整数sumsumsum,建立权值线段树,假设当前可以构造出来的一个整数为sumsumsum,通过查询小于sum+1sum+1sum+1的数字的数字和,则可以不断维护新的sumsumsum不断更新答案,对于多个[L,R][L,R][L,R]区间上的查询,只需要主席树即可
时间复杂度O(q∗log(n)2)O(q*log(n)^2)O(q∗log(n)2)

#include<bits/stdc++.h>
#define fi first
#define gcd __gcd
#define se second
#define int long long
#define pb push_back
#define lowbit(x) x&-x
#define inf 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
#define lrb666 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<int,int> PII;
const int maxn=1e6+7;
int n,q,cnt;
int a[3*maxn],root[3*maxn];
vector<int>v;
int tr[maxn*4*20],lch[maxn*4*20],rch[maxn*4*20],sum[maxn*4*20];
int build(int l,int r)
{int pos=++cnt;lch[pos]=0,rch[pos]=0,sum[pos]=0;if(l<r){int mid=l+r>>1;lch[pos]=build(l,mid);rch[pos]=build(mid+1,r);}return pos;
}
int update(int pre,int l,int r,int x,int v)
{int pos=++cnt;lch[pos]=lch[pre],rch[pos]=rch[pre],sum[pos]=sum[pre]+v;if(l<r){int mid=l+r>>1;if(x<=mid) lch[pos]=update(lch[pre],l,mid,x,v);else rch[pos]=update(rch[pre],mid+1,r,x,v);}return pos;
}
int query(int x,int y,int l,int r)
{if(l==r) return sum[y];int mid=l+r>>1;if(x<=mid) return query(x,lch[y],l,mid);else return query(x,rch[y],mid+1,r)+sum[lch[y]];
}
int find(int num)
{return lower_bound(v.begin(),v.end(),num)-v.begin();
}
signed main()
{scanf("%lld%lld",&n,&q);for(int i=1;i<=n;i++) {scanf("%lld",&a[i]);v.pb(a[i]);v.pb(a[i]+1);v.pb(a[i]-1);}sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());int sz=v.size();for(int i=1;i<=n;i++){int x=find(a[i]);root[i]=update(root[i-1],0,sz-1,x,a[i]);}int ans=0;while(q--){int l1,r1,l,r;scanf("%lld%lld",&l1,&r1);l=min((l1+ans)%n+1,(r1+ans)%n+1);r=max((l1+ans)%n+1,(r1+ans)%n+1);int num=0;while(1){int x=find(num+1);int cal=query(x,root[r],0,sz-1)-query(x,root[l-1],0,sz-1);if(cal<=num) {ans=num+1; break;}num=cal;}printf("%lld\n",ans);}
}

希望周日的昆明加油

2020ICPC昆明题解相关推荐

  1. 【超好懂的比赛题解】2020ICPC澳门站 个人题解

    title : 2021ICPC澳门站 个人题解 date : 2022-10-6 tags : ACM,题解,练习记录 author : Linno 2020ICPC澳门站 个人题解 题目链接:ht ...

  2. 2020ICPC·小米 网络选拔赛第一场 全部题解

    整理的算法模板合集: ACM模板 目录 题目传送门 题目总体情况 A.Intelligent Warehouse B.Intelligent Robot C.Smart Browser D.Route ...

  3. 第46届ICPC东亚洲区域赛(昆明)B Blocks题解

    特此声明:该文章中的代码和解法均来自博主cup-pyy,我只是对其代码添加了详细注解,以及部分思路的详细化,原文链接见:这里 二维平面转为一维 注意我们最多含有22个坐标,但是实际上只会有21*21个 ...

  4. 【ICPC】2022 昆明站 B题 题解

    题目大意 给定一个W∗HW*HW∗H的方格矩阵.和nnn的小方格阵,每个覆盖了左下角为 xi1,yi1x_{i1},y_{i1}xi1​,yi1​,右上角为xi2,yi2x_{i2},y_{i2}xi ...

  5. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  6. Cities(2020昆明C)

    Cities(2020昆明C) 题意: 给定长度为n的序列a[],一次操作你可以选择一个数值相同的连续区间,将这个区间的数值修改为其他数. 问多少进行多少次操作能使得区间所有数相同. n<=50 ...

  7. 2021 ICPC 昆明(22-4-17) C L E | 第46届ICPC亚洲区域赛(昆明)

    ICPC 2021 昆明 传送门 补题计划 CLE, C - Cup of Water prob : 在0-V内随机取数灌满1升水的期望操作次数 idea1: 首先将题给的"在0-V内随机取 ...

  8. 2020icpc上海(重温经典)

    2020icpc上海(重温经典) 导语 涉及的知识点 题目 B D G H I M 参考文献 导语 涉及的知识点 思维,几何,搜索 链接:第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海 ...

  9. “华为杯”大连理工大学第15届大学生程序设计大赛(验题人题解)

    M:A+B 临时加的签签到到题 L:数学 代进去求一下,签到题 #include<bits/stdc++.h> using namespace std; typedef long long ...

最新文章

  1. HDFS组件性能调优:数据平衡
  2. SpringMVC 国际化
  3. 【译】Introducing scrcpy
  4. 算法 深度优先,广度优先
  5. 使用Httpclient来替代客户端的jsonp跨域解决方案
  6. Object类中的两个方法——wait和notify使用总结
  7. java导出pdf 含图片_java 生成PDF含图片和中文件实现代码
  8. python的while和for循环
  9. python入门23 pymssql模块(python连接sql server增删改数据 )
  10. python IDE比较与推荐
  11. IDEA中import自己的python包方法
  12. 解决python2.7.9以下版本requests访问https的问题
  13. Win10在使用setuna2时,启动截屏后屏幕会放大的问题。
  14. 智能化施工(综合管线)
  15. at24c256读写linux,AT24C256写不进去
  16. 坯子库无法一键安装插件没用_坯子插件库的下载地址、安装以及运用办法
  17. 将Excel数据批量生成条形码
  18. 沉睡者 - 怎么样可以在网络上挣钱,告诉你网上挣钱的5种方法!
  19. Python Post提交简单案例,文本内容在线语音合成
  20. 基于pytorch卷积人脸表情识别--毕业设计

热门文章

  1. DOM元素的特性和属性
  2. 《30天精通iPhone手机编程》-Day20-DJ混音器
  3. 结合电压与电流定律进行总体分析
  4. jpf、gif、wav等用txt打开,首行乱码格式
  5. “乐百氏杯”院际足球赛今日半决赛 工商法学挺进决赛
  6. php fieldset,html fieldset标签的用法详解
  7. unity 内嵌网页简单流程(3D WebView 3.14.1)
  8. POI之SXSSFWorkbook大量数据导出至excel有关内存溢出
  9. GMAT数学拿不到50/51的人都点开这篇文章!
  10. (遇到问题)ubuntu遇到文件夹带锁如何去除,已解决