C.Chino with Queue

思路:裸的状压dp,大家可以搜索旅行商问题状压dp解法,和这个一样。

设d[ u ][ s ] 为 u 排在第一位,排队的人的集合为 s 所能得到的最优值,那么对于当前的d[ j ][ i ],我们找一个集合 i 中没有出现的同学 k,那么令 k 排在第一位得到转移方程:d[ k ][ s | (1<<k)]=max( d[ k ][ s | (1<<k)], d[ j ][ s ]+w[ k ][ k ]-w[ j ][ j ]+w[ j ][ k ] )。

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
const int maxn=1<<18;
int d[18][maxn],a[20][20];
void up(int &x,int y)
{x=max(x,y);
}
int main()
{int n,ans=0;cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++){cin>>a[i][j];if(i==j)d[i][1<<i]=a[i][j];}for(int i=1;i<(1<<n);i++)for(int j=0;j<n;j++){if(i==(1<<n)-1)ans=max(ans,d[j][i]);if(((1<<j)&i)){for(int k=0;k<n;k++)if(!((1<<k)&i)) up(d[k][i|(1<<k)],d[j][i]+a[k][k]-a[j][j]+a[j][k]);}      }printf("%d\n",ans);
}

E.Chino with Triangle

思路:由于树上每条边的距离都相等,我们反过来求不能组成三角形的概率,很容易想到,当三个点在树上同一条链上时,这三个点不能组成三角形,那么我树形dp,枚举每个点作为中间点所能得到非法三角形的概率即可。

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
const int maxn=1e5+10;
int d[maxn],n;
ll m;
db ans;
vector<int>G[maxn];
void dfs(int u,int fa)
{for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v==fa)continue;dfs(v,u);ans+=1.0*d[u]*d[v]/m;d[u]+=d[v];}d[u]++;ans+=1.0*(d[u]-1)*(n-d[u])/m;
}
int main()
{int u,v;scanf("%d",&n);m=1ll*n*(n-1)*(n-2)/6;for(int i=1;i<n;i++){scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);  }dfs(1,0);printf("%.10lf\n",1.0-ans);
}

G.Chino with Train to the Rabbit Town

思路:这个题和某道cf题相似,说白了,求最多有多少个不相交区间,区间异或=t,我们枚举区间右端点 r,假设我已经求了并保存了[ 1 , r],[ 2 ,r ],[ 3 , r ],,,,,[ r ,r ]的区间异或值,我现在枚举r+1,要重新更新前面 r 个区间异或值异或a [r+1] 去和 t 做对比,复杂度太大,我们可以反过来更新对比对象 t=r^a[r+1],这样就可以不用更新已经保存过的值了,那么新的 a[r+1] 就不是 a[r+1]了,是什么留给读者思考哦。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int vis[maxn];
int main()
{int n,x,t,s=0,ans=0,mx=0;scanf("%d%d",&n,&t);for(int i=1;i<=n;i++){scanf("%d",&x);t^=x;vis[s]=i;if(vis[t]>mx)ans++,mx=i,vis[t]=0;s^=x;}printf("%d\n",ans);
}

H.Chino with Ciste

思路:把(x ,y ,dir )看成一个状态去bfs搜索就行,可以直接用普通队列去搜索,复杂度n*m*4。

#include<bits/stdc++.h>
#define ll long long
#define db double
using namespace std;
const int maxn=2001;
int vis[maxn][maxn][4],n,m,sx,sy,tx,ty;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
char s[maxn][maxn];
struct node
{int x,y,w;node(int a,int b,int c){x=a,y=b,w=c;}
};
queue<node>q;
int check(int x,int y,int d)
{if(x<1||x>n||y<1||y>m||s[x][y]=='*'||vis[x][y][d])return 0;return 1;
}
int bfs()
{q.push(node(sx,sy,0));while(!q.empty()){node tmp=q.front();q.pop();for(int i=0;i<4;i++){int x=tmp.x,y=tmp.y;x+=dir[i][0];y+=dir[i][1];while(check(x,y,i)){vis[x][y][i]=1;if(s[x][y]=='T')return tmp.w;q.push(node(x,y,tmp.w+1));x+=dir[i][0];y+=dir[i][1];}}}return -1;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",s[i]+1);for(int j=1;j<=m;j++)if(s[i][j]=='S')sx=i,sy=j;else if(s[i][j]=='T')tx=i,ty=j;}int ans=bfs();if(ans==-1)puts("troil");else printf("%d\n",ans);
}

I. Chino with Rewrite

思路:先离线建树,然后树剖,线段树保存区间或值,再然后重新按顺序查询,操作1,先用并查集判环,如果无环,线段树更新两个点的权值,操作2,直接查询两个点路径的权值或即可。

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int id[maxn],cnt,top[maxn],p[maxn],a[maxn];
int size[maxn],f[maxn],son[maxn],dep[maxn];
vector<int>G[maxn];
ll sum[maxn*4];
void dfs1(int u,int fa,int deep)
{size[u]=1;dep[u]=deep;f[u]=fa;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v==fa)continue;dfs1(v,u,deep+1);size[u]+=size[v];if(!son[u]||size[v]>size[son[u]])son[u]=v;}
}
void dfs2(int u,int root)
{top[u]=root;id[u]=++cnt;if(!son[u])return;dfs2(son[u],root);for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v==f[u]||v==son[u])continue;dfs2(v,v);}
}
void update(int o,int l,int r,int k,ll v)
{if(l==r){sum[o]=v;return;}int ls=o*2,rs=o*2+1,m=(l+r)/2;if(k<=m)update(ls,l,m,k,v);else update(rs,m+1,r,k,v);sum[o]=sum[ls]|sum[rs];
}
ll query(int o,int l,int r,int ql,int qr)
{if(l>=ql&&r<=qr)return sum[o];int ls=o*2,rs=o*2+1,m=(l+r)/2;ll res=0;if(ql<=m)res|=query(ls,l,m,ql,qr);if(qr>m)res|=query(rs,m+1,r,ql,qr);return res;
}
ll qu_path(int x,int y)
{ll ans=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);ans|=query(1,1,cnt,id[top[x]],id[x]);x=f[top[x]];}if(id[x]>id[y])swap(x,y);ans|=query(1,1,cnt,id[x],id[y]);return ans;
}
int Count(ll x)
{int res=0;while(x){if(x&1)res++;x/=2;}return res;
}
int find(int x)
{if(p[x]!=x)p[x]=find(p[x]);return p[x];
}
int op[maxn*3],x[maxn*3],y[maxn*3];
int main()
{int n,q,u,v;scanf("%d%d",&n,&q);for(int i=1;i<=n;i++){p[i]=i;scanf("%d",&a[i]);}for(int i=1;i<=q;i++){scanf("%d%d%d",&op[i],&x[i],&y[i]);if(op[i]==1){u=find(x[i]),v=find(y[i]);if(u!=v){p[u]=v;G[x[i]].push_back(y[i]);G[y[i]].push_back(x[i]);}}}dfs1(1,0,1);dfs2(1,1);for(int i=1;i<=n;i++)p[i]=i;for(int i=1;i<=q;i++){if(op[i]==1){u=find(x[i]),v=find(y[i]);if(u!=v){p[u]=v;a[x[i]]=a[y[i]]=(a[x[i]]+a[y[i]])/2;update(1,1,n,id[x[i]],1ll<<a[x[i]]);update(1,1,n,id[y[i]],1ll<<a[y[i]]);}}else{u=find(x[i]);v=find(y[i]);if(u!=v){puts("-1");continue;}ll ans=qu_path(x[i],y[i]);printf("%d\n",Count(ans));}}
}

2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛) CEGHI 题解相关推荐

  1. 2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛)

    A.Chino with Geometry 思路:简单数学.过点A作直线BC的垂线交于点F,然后根据勾股定理就可以化简出 $ |BD| \times |BE| = |AB|^2 - r^2$ .注意要 ...

  2. Chino with Triangle ( 西工大程序设计创新实践基地春季选拔赛)树形dp

    https://ac.nowcoder.com/acm/contest/553/E 题意,是中文,没有什么读不懂的. 做法,肯定是树形dp,如果想到,正难则反,一条链上的不可以组成三角形,这道题就不难 ...

  3. 大学生程序设计创新实践基地2022年冬季校赛(NPU ACM Winter Contest)

    大学生程序设计创新实践基地2022年冬季校赛(NPU ACM Winter Contest) 总述 总体考察对于板子的熟练变换,以及考察离谱地使用python和对getchar()以及EOF的基础掌握 ...

  4. 西北工业大学计算机专业课考什么,2019西北工业大学计算机考研初试科目、参考书目、招生人数...

    原标题:2019西北工业大学计算机考研初试科目.参考书目.招生人数 本文将由新祥旭徐老师全方位的对西北工业大学计算机专业考研进行解析,主要有以下几个板块:学院介绍,专业情况介绍,2019录取情况分析, ...

  5. 801计算机专业基础西北工业大学,2019西北工业大学研究生入学考试大纲801计算机专业基础...

    2019西北工业大学研究生入学考试大纲801计算机专业基础 题号:题号:<计算机专业基础><计算机专业基础>考试大纲考试大纲注:以下五部分内容只选择两部分进行答题注:以下五部分 ...

  6. CVPR 2019 | 西北工业大学开源拥挤人群数据集生成工具,大幅提升算法精度

    点击我爱计算机视觉标星,更快获取CVML新技术 近年来,因为拥挤人群计数在视频监控.公共安全方面的应用广泛,引起了不少学者的关注. 简单说来这个任务就是给定图像,返回该图像所描述场景中有多少人. 这可 ...

  7. 北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛(重现赛)题解

    题目链接: 北京信息科技大学第十三届程序设计竞赛暨ACM选拔赛(重现赛)_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ大学ACM校赛新生赛是面向ACM/ICPC/CCP ...

  8. CDOJ 第七届ACM趣味程序设计竞赛第三场(正式赛) 题解

    宝贵资源 题目连接: http://acm.uestc.edu.cn/#/problem/show/1265 题意 平面上给n个点(n<=1000),要求找一个面积最小的正方形,将所有的点都囊括 ...

  9. 2023年高校“产教融合”新工科人工智能领域高质量创新人才培养研讨会暨创新创业学院、创新创业教育实践基地建设交流会成功

    ​ 2023年高校"产教融合"新工科人工智能领域高质量创新人才培养研讨会暨创新创业学院.创新创业教育实践基地建设交流会在西安建国饭店成功举办! 本次会议由中国智慧工程研究会教育数字 ...

  10. 武汉市博士后创新平台认定政策(实践基地+科研工作站申报条件奖励补贴)

    这篇简单介绍两种武汉市博士后创新平台的建设政策,分别是武汉市博士后创新实践基地政策以及武汉市博士后科研工作站政策,针对大家比较关心的认定申报条件以及奖励补贴两方面做具体分析讲述,其他需要了解的或者想要 ...

最新文章

  1. ISE 14.7 调试错误笔记
  2. 利用矩阵奇异值分解(SVD)进行降维
  3. python 办公_python 让办公变得自动化
  4. 《算法竞赛入门经典》第一章1.5
  5. CodeForces - 1295C Obtain The String(dp预处理+贪心)
  6. 矩阵相乘Java版(第一个java程序)
  7. 用python numpy实现幻方
  8. Android 应用开发---6.ViewPager+Fragment的基本使用
  9. js日历控件源代码下载
  10. 关于Ubuntu python程序利用lixb264生成h264格式的视频相关问题
  11. PLSQL 免费下载安装
  12. linux rpm -qa|grep -i mysql_【LINUX】linux中rpm是什么意思
  13. 2022.4.24腾讯笔试记录
  14. 虚拟机去虚拟化教程,过游戏检测,不全你打我
  15. 你知道PMU与PMU的区别吗?
  16. [第23课] 期望值E(X)
  17. 计算机三级网络技术小技巧,计算机三级PC技术过关心得技巧
  18. 怎么引流微信 ,QQ,抖音,淘宝,微博,Facebook好友
  19. 音乐基础理论 第一章
  20. android 音乐 简书,Android音频开发(7):音乐可视化-FFT频谱图

热门文章

  1. 2022 年第十二届 MathorCup 高校数学建模挑战赛C题解析
  2. SQL面试题:删除表中指定字段的重复数据,只保留最大的id数据
  3. 热点|国家动物健康与食品安全创新联盟成立科技创新赋能委员会 并首发动物源食品信任追溯平台...
  4. 【PyCharm 使用指南】之汉化插件(官方提供)
  5. EPT DATA数据库能查到1998-2013年工业企业数据库
  6. 极速PDF编辑器提示缺少字体如何解决
  7. android录屏软件大全,安卓免费录屏软件哪个好用 免费长时间录屏软件推荐
  8. 千兆8光8电宽温环网工业以太网交换机8光8电全千兆二层管理型宽温工业级环网交换机 光纤自愈环网工业交换机
  9. 常见绿盟扫描主机漏洞及修复方案
  10. springmvc如何进行json格式转换及 json化日期格式