J:异次元抓捕
在一个时间空间都无穷大的二维的平行宇宙中(为了简化问题,用网格表示空间)
小y因为偷取宝物被发现,开始了逃亡之旅,
小y可以在以自身为中心的边长为(2∗k+1) 的正方形网格中任意移动(1≤k≤1e5)(注意不可以不移动)
每次小y移动过后,追捕者会在空间中放下一个障碍物,拦截小y,(一个障碍物会占领一个1*1的网格)(障碍物不会出现在小y脚下))
由于小y有着高超的身法,小y可以在移动过程中越过障碍物,但是不能停留在有障碍物的地方。
(如图当k=1的时候,蓝色网格为小y的可移动范围)
小y和追捕者都聪明绝顶,小y知道所有障碍物的位置,追捕者也知道小y的位置
并且两者都会选择最优的策略,
如果最后小y被障碍物围住而无法再次移动,就会被抓住。
你需要判断小y是否会被抓住
如果小y会被抓住 , 输出YES
否则,输出NO
输入描述:
第一行包含一个正数t(1≤t≤1e5)------问题询问次数
每次询问输入一个整数k
输出描述:
对于每个测试用例
如果会被抓住,输出YES
否则,输出NO
示例1:
输入:
1. 2 2. 1 3. 617
输出:
1. YES 2. NO
思路:k==1时能抓到,输出YES,否则输出NO。
void solve() { int k; cin>>k; if(k==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; return ; }
K:奖励关
有一个可以无限重生的boss,开始时boss有1点生命值,当boss被击败后(血量小于等于0时),玩家可以获得1点积分,此后boss会复活并且血量翻倍(第一次复活是2,第二次是4,第三次是8,依次类推,复活之后boss满血),再次击败boss后可以再次获得1点积分。
boss不会行动,初始时玩家攻击力为1,玩家可以行动 n 个回合,对于每一个回合玩家可以选择下面三种操作的一个。
操作1:攻击 对boss攻击,boss降低的血量等于玩家的当前攻击力
操作2:攻击强化 攻击力永久 × 2
操作3:蓄力 下次攻击时,攻击力 × 8,可以叠加(两次蓄力后可以 × 64,但是攻击之后增益消失),只对第一次攻击有收益
示例:执行5次操作,分别为22311,那么第一次的攻击时攻击力是32,第二次的攻击时攻击力是4
输入描述:
第一行一个正整数 T(T≤105) 代表多组询问
接下来 T 行,每行一个正整数n(n≤1e9)代表此轮可以进行的操作数
输出描述:
T行,每行一个整数 ,输出玩家选择最优的操作方案可以获得的最大积分数
示例1
输入
1. 2 2. 1 3. 3
输出
1. 1 2. 2
备注:
当前攻击力等于 2^(i+3× j ),i表示已执行操作2的次数 ,jjj表示当前攻击与上一次攻击间隔间的操作3的次数
思路:仔细思考会发现,蓄力的收益在n较小时和强化一样,但是在n较大时强化的收益远远大于蓄力带来的,所以直接一直强化即可。
void solve() { int n,a=1,b=1,sum=0; cin>>n; cout<<(n+1)/2<<endl; return ; }
M:找孙子
ym 刚刚被他的儿子冷落了,他现在想要找他的孙子诉诉苦
给定一个有向无环图,请你找出对于每个节点,对于其作为爷爷节点时,存在多少对爷爷-孙子关系
爷爷-孙子关系的定义是,如果在有向无环图中存在有向边 (x, y)(x,y) 和 (y, z)(y,z), 那么称 zz 是 xx 的孙子, 有序对组 [(x, y), (y, z)] 称为一个爷爷-孙子关系
请注意: 对于相同的一对爷爷,孙子节点,可能存在不同的中间节点,使得爷爷-孙子关系数量大于一
输入描述:
第一行输入两个正整数 nn, mm, 数据保证 1<=n<=1e6,1≤m≤2×1e6
接下来 mm 行,每行两个正整数 uu, vv 表示存在一条有向边 (u, v)
数据保证不存在重边和自环
输出描述:
输出一行 nn 个数字,用空格分隔开,第 ii 个数字表示编号为 ii 的节点的孙子数量
示例1
输入
1. 5 10 2. 5 3 3. 2 3 4. 1 2 5. 4 1 6. 1 3 7. 4 2 8. 2 5 9. 4 3 10. 1 5 11. 4 5
输出
3 1 0 6 0
思路:分别用一维vector容器来遍历,二维vector容器储存孙节点个数(想着二维数组内存过不了,二维vector居然能过)
#include <bits/stdc++.h> #define int long long using namespace std; signed main() { int n,m; cin>>n>>m; vector<vector<int>> graph(n + 1); vector<int> grandchildren_count(n + 1, 0); for (int i=0;i<m;i++) { int u,v; cin>>u>>v; graph[u].push_back(v); } for (int i=1;i<=n;i++) { for (int j:graph[i]) { for (int k:graph[j]) { grandchildren_count[i]++; } } } for (int i=1;i<=n;i++) { cout<<grandchildren_count[i]<<" "; } return 0; }