2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) 题解
题目链接:http://codeforces.com/gym/101147
2017/8/27日训练赛,题目情况9/11,Rank 4/79。
A. The game of Osho
题意:定义一个子游戏,B,N可以从N减掉B^k要求B^k小于等于N,当N变成0,该哪个人选,哪个人就输了,给出G个这样的游戏,问最后的输赢情况。
解法:组合游戏,SG打表发现规律,然后求Nim和判断即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
//int cal(LL b, LL g){
// if(g==0) return 0;
// bool h[10];
// memset(h,0,sizeof(h));
// LL bb=1;
// while(bb<=g){
// int t=cal(b,g-bb);
// if(t<10) h[t]=1;
// if(b==1) break;
// bb*=b;
// }
// for(int x=0;x<10; x++)
// if(!h[x]) return x;
//}
int main()
{
// for(int x=1; x<=5; x++){
// for(int y=1; y<=5; y++){
// printf("%d %d %d\n", x,y,cal(x,y));
// }
// }freopen("powers.in","r",stdin);int T;scanf("%d", &T);while(T--){int n;scanf("%d", &n);int ans = 0;for(int i=0; i<n; i++){int b,g;scanf("%d%d",&b,&g);if(b&1) ans^=g&1;else{if(g%(b+1)<=b-1) ans^=(g%(b+1))&1;else ans^=2;}}if(ans) puts("1");else puts("2");}return 0;
}
B. Street
题意:给了一个平面,然后给了一些矩形有靠左边界的,也有靠着右边界的,现在问要从高度为0跑到高度问n+1,最少需要多少距离,你在矩形里面和边缘走是不需要时间的,题目给的是矩形的长宽,和离底面的距离和往哪靠。
解法:讨论两个矩形的距离,这里要分3种情况,然后建图跑最短路,Floyd T了,改成Dij AC。
队友代码:
C. The Wall
留坑。
D. Popcorn
题意:求n个人选k个人的方法数。
解法:就是C(n,k)。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL C[22][22];
int main()
{freopen("popcorn.in", "r", stdin);memset(C, 0, sizeof(C));for(int i=0; i<=20; i++){C[i][0]=1;for(int j=1; j<=i; j++){C[i][j] = C[i-1][j-1]+C[i-1][j];}}int T,n,m;scanf("%d", &T);while(T--){scanf("%d %d", &n,&m);printf("%lld\n", C[n][m]);}return 0;
}
E. Jumping
题意:一个人可以从1-n的任意位置出发,每个位置有一个d[i]表示这个人在这个位置可以向左跳d[i],也可以向右调d[i],问这个人从每个位置出发最后到达n的步数,不能到达输出-1。
解法:我们直接把n点看成起点,做一个最短路或者BFS,就可以求出N点到每个点的最短路了,不能到达就是dis[i]=INF的时候。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+2;
int dis[maxn];
bool f[maxn];
vector <int> G[maxn];
int main()
{freopen("jumping.in","r",stdin);int T,n;scanf("%d", &T);while(T--){scanf("%d", &n);for(int i=1; i<=n; i++) G[i].clear();for(int i=1; i<=n; i++){int x;scanf("%d", &x);if(i-x>=1){G[i-x].push_back(i);}if(i+x<=n){G[i+x].push_back(i);}}memset(dis, 0x3f, sizeof(dis));memset(f, 0, sizeof(f));dis[n] = 0;queue <int> q;q.push(n);f[n] = 1;while(q.size()){int u = q.front();q.pop();for(int v : G[u]){if(!f[v]){dis[v] = dis[u]+1;f[v] = 1;q.push(v);}}}for(int i=1; i<=n; i++){if(dis[i] > n) dis[i] = -1;printf("%d\n", dis[i]);}}return 0;
}
F. Bishops Alliance
题意:给了一个n*n的棋盘(n<=100000),然后棋盘上有m个皇后,问把这些皇后放到一个对角线上,当且仅当a[i]和a[j]的横坐标之差between i and j is at least equal to pi2 + pj2 + C描述能力捉急),a[i]和a[j]才可以放到一个对角线上。问最多可以放的象棋的个数。
解法:把一条对角线的棋子取出来之后,就是判断满足这个关系的棋子的个数,可以发现这个类似于LIS的DP,dp[i] = max(dp[j])+1, 其中j<=x - p[i]*p[i] - C +1,然后求出最大值后再更新到x+p[i]*p[i]的位置就可以 了。
复杂度:O(nlogn)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
typedef long long LL;
struct node{int x,y,p;node(){}node(int x,int y,int p):x(x),y(y),p(p){}bool operator < (const node &rhs) const{return x<rhs.x;}
}a[maxn],b[maxn];
int C;
namespace BIT{int c[maxn];void init(){memset(c, 0, sizeof(c));}inline int lowbit(LL x){return x&-x;}void add(LL pos, int val){for(LL i=pos; i<maxn; i+=lowbit(i))c[i] = max(c[i], val);}void Clear(LL pos){for(LL i=pos; i<maxn; i+=lowbit(i))c[i] = 0;}int query(LL pos){pos = min(pos, (LL)maxn-1);int ret = 0;for(LL i = pos; i>0; i-=lowbit(i))ret = max(ret, c[i]);return ret;}
}
using namespace BIT;
vector <int> v1[maxn*2];
vector <int> v2[maxn*2];
int cal(vector <int> &v){int n = v.size();if(n == 0) return 0;for(int i=0; i<n; i++) b[i] = a[v[i]];sort(b, b+n);int ret = 0;for(int i=0; i<n; i++){LL pos = b[i].x - (LL)b[i].p*b[i].p - C + 1;int d = query(pos)+1;ret = max(ret, d);pos = b[i].x + (LL)b[i].p*b[i].p;add(pos, d);}for(int i=0; i<n; i++){LL pos = b[i].x + (LL)b[i].p*b[i].p;Clear(pos);}return ret;
}
int main()
{freopen("bishops.in","r",stdin);int T; scanf("%d", &T);while(T--){int n,m;scanf("%d %d %d", &n,&m,&C);init();for(int i=0; i<=n*2; i++){v1[i].clear();v2[i].clear();}for(int i=1; i<=m; i++){scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].p);v1[a[i].x+a[i].y].push_back(i);v2[a[i].x-a[i].y+n].push_back(i);}int ans = 0;for(int i=0; i<=n*2; i++){ans = max(ans, cal(v1[i]));ans = max(ans, cal(v2[i]));}printf("%d\n", ans);}return 0;
}
G. The Galactic Olympics
题意:抽象出来的题意:将p个物体划分成k个非空的可辨别的(可以理解为盒子有编号)集合的方法数。
解法:这个就是典型的第二类斯特林数。
第二类Stirling数 S(p,k)S(p,k)的一个组合学解释是:将p个物体划分成k个非空的不可辨别的(可以理解为盒子没有编号)集合的方法数。k!S(p,k)是把p个人分进k间有差别(如:被标有房号)的房间(无空房)的方法数。S(p,k)的递推公式是:S(p,k)=k*S(p-1,k)+S(p-1,k-1) ,1<= k<=p-1边界条件:S(p,p)=1 ,p>=0 S(p,0)=0 ,p>=1
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int dp[3005][3005];
const int mod = 1e9+7;int main()
{freopen("galactic.in", "r", stdin);dp[1][1] = 1;for(int i=2; i<=3000; i++){dp[i][i] = 1;for(int j=1; j<=i; j++){dp[i][j] = ((LL)j*dp[i-1][j]+dp[i-1][j-1])%mod;}}int T;scanf("%d", &T);while(T--){int n, k;scanf("%d %d", &n,&k);if(k > n){puts("0");}else{int ans = dp[n][k];for(int i=1; i<=k; i++)ans = (LL)ans*i%mod;ans %= mod;printf("%d\n", ans);}}return 0;
}
H. Commandos
题意:给了一个3维的楼房,里面有些地方有人质,现在警察在第10层(1,1)的位置,给了这些警察可以行走的限制,问最多可以救出多少人质。
解法:就是3维的数塔问题,直接DP即可。
#include <bits/stdc++.h>
using namespace std;
int dp[12][12][12];
int val[12][12][12];int main()
{freopen("commandos.in", "r", stdin);int T, n;scanf("%d", &T);while(T--){memset(dp, 0, sizeof(dp));memset(val, 0, sizeof(val));scanf("%d", &n);for(int i=0; i<n; i++){int f,x,y,h;scanf("%d %d %d %d", &f,&x,&y,&h);val[f][x][y] += h;}for(int f=10; f>=1; f--){for(int x=1; x<=10; x++){for(int y=1; y<=10; y++){dp[f][x][y] = max(dp[f][x][y], dp[f+1][x][y]);dp[f][x][y] = max(dp[f][x][y], dp[f][x-1][y]);dp[f][x][y] = max(dp[f][x][y], dp[f][x][y-1]);dp[f][x][y] += val[f][x][y];}}}printf("%d\n", dp[1][10][10]);}return 0;
}
I. On the way to the park
题意:平面上给了一些圆的信息,然后给了一个半径R,就是你可以确定一个大圆R,这个大圆是在X轴上移动的,问这个大圆最多包含多少小圆,求这些小圆的半径和。
解法:我们把那些不可能被包含的小圆忽略,然后让剩下的小圆和大圆作相切,可以求出在什么范围内大圆可以包含这个小圆,然后把左端点打一个-r[i]的标记右端点打一个r[i]标记,排序之后求和并且更新最大值就是答案了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
typedef long long LL;
int n,m;
int x[maxn],y[maxn],r[maxn];
pair <double,int> a[maxn*3];int main()
{freopen("walk.in","r",stdin);int T;scanf("%d", &T);while(T--){scanf("%d %d", &n,&m);int cnt = 0;for(int i=1; i<=n; i++){scanf("%d %d %d", &x[i],&y[i],&r[i]);if(y[i]<0) y[i]=-y[i];if(y[i]+r[i]>m) continue;int d = m-r[i];double dx=sqrt(1.0*d*d-1.0*y[i]*y[i]);a[++cnt] = make_pair(x[i]-dx, -r[i]);a[++cnt] = make_pair(x[i]+dx, r[i]);}LL sum=0,ans=0;sort(a+1,a+cnt+1);for(int i=1; i<=cnt; i++){sum += -a[i].second;ans = max(ans, sum);}printf("%lld\n", ans);}return 0;
}
J. Whistle's New Car
题意:给了n个点的图,图上每个点代表一个城市,并且拥有x[i]的值表示在这个城市可以加x[i]的油,定义城市i的吸引度为i有多少个子节点,只有在这个节点加油并且能跑到i点的节点个数,两个城市之间有边权代表路程。
解法:考虑到i点向上最远可以跑到哪个城市,在这个城市打上一个-1的标记,并且在当前点打上+1的标记,然后回溯的时候累加标记就可以 了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5+10;
typedef long long LL;
vector <pair<int,int> > G[maxn];
int x[maxn];
int dep[maxn];
int stk[maxn];
int ans[maxn];
void dfs(int u, int fa, int d){stk[d] = u;int L = -1, R = d;while(L < R){int mid = (L+R+1)/2;if(dep[stk[mid]]>=dep[u]-x[u]) R=mid-1;else L=mid;}if(L>=0) --ans[stk[L]];++ans[u];for(auto &p : G[u]){int v = p.first;if(v == fa) continue;dep[v] = dep[u] + p.second;dfs(v, u, d+1);ans[u] += ans[v];}
}int main()
{freopen("car.in", "r", stdin);int T,n;scanf("%d", &T);while(T--){scanf("%d", &n);for(int i=1; i<=n; i++){G[i].clear();scanf("%d", &x[i]);ans[i]=0;}for(int i=1; i<n; i++){int a,b,c;scanf("%d%d%d", &a,&b,&c);G[a].emplace_back(b,c);G[b].emplace_back(a,c);}dfs(1,0,0);for(int i=1; i<n; i++){printf("%d ", ans[i]-1);}printf("%d\n", ans[n]-1);}return 0;
}
K. Touristic Trip
留坑。
转载于:https://www.cnblogs.com/spfa/p/7444525.html
2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) 题解相关推荐
- 2018 ACM ICPC Arabella Collegiate Programming Contest A
Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your ...
- A - Multiplication Dilemma (思维)( 2018 ACM ICPC Arabella Collegiate Programming Contest)
滴答滴答---题目链接 Multiplication operation is not always easy! For example, it is hard to calculate 27 × 2 ...
- 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...
- 2019-2020 ACM ICPC Brazil Subregional Programming Contest E.Exhibition of Clownfish
我搬运我自己应该算原创吧 题目 题意 题解 题意 某水族馆有一种神奇的
- 2018 ACM-ICPC Syrian Collegiate Programming Contest(部分题解,待补)
传送门 2018 ACM-ICPC 叙利亚大学生程序设计竞赛 Problem A: Hello SCPC 2018! 签到题 Problem B: Binary Hamming 简单题 #includ ...
- The 19th Zhejiang Provincial Collegiate Programming Contest(部分题解)
在完成三道签到之后,分别对图论.前缀&二分.大模拟上面取得突破点,但其他题集没能得到突破,仍需多加练习. A - JB热爱数学 [题意] 给定两个数 a.b.求出让a变成b的最少次数. 能修改 ...
- The 18th Zhejiang Provincial Collegiate Programming Contest (ZJCPC)部分题解
F,G,J,L F - Fair Distribution G - Wall Game J - Grammy and Jewelry L - String Freshman F - Fair Dist ...
- (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...
- 2016 China Collegiate Programming Contest Final
2016 China Collegiate Programming Contest Final Table of Contents 2016 China Collegiate Programming ...
- 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc
2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 by xzc,zx,lj 先 ...
最新文章
- 和朋友聊天时好玩的加密小程序(第一版)
- java cocoon_Java-跳跃路线
- Spring远程调用技术1-RMI
- 青海行--(7月26日)翻越祁连山
- 局域网聊天程序 java MySQL_课内资源 - 基于JAVA的局域网聊天软件的设计与实现(仿制QQ)...
- js防止表单的重复提交
- linux定义数据结构压缩,Linux下数据结构学习笔记
- 宝宝胆小怎么办,家长怎么做?
- python从入门到精通需要多久-Python从入门到精通:一个月就够了
- GitHub又受攻击了
- 8.2 复用(protected+向上转型+final关键字+类的初始化)
- 证明神经网络的通用逼近定理_在您理解通用逼近定理之前,您不会理解神经网络。...
- webpack 无法加载文件 C:\Users\User\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本。
- GCJ-02火星坐标系和WGS-84坐标系转换关系
- mapping的介绍和实战
- exoplay切换全屏_Flutter 实现视频全屏播放逻辑及解析
- 图形界面 I: 图形界面的动画 (第三章)
- 介绍一个python工程师必须掌握的 CentOS 命令,nohup
- python pdf解密脚本(pikepdf模块)
- python处理MNIST数据集
热门文章
- 台式计算机不休眠,台式机如何设置不休眠
- c语言大计基题库,2016年大学计算机基础试题题库及答案
- 已解决:Torch not compiled with CUDA enabled
- Failed to process import candidates for configuration class [com.gsy.ServiceRibbonApplication]; nest
- 应用软件学习心得之mapgis功能学习
- RS232与TTL电平的区别
- 关于可见光摄像机与机器视觉的科普
- Monte Carlo算法
- 吐槽最新的chrome浏览器.
- Shiro记住我无效,被拦截;