[ARC 122]
最近状态差到爆炸.
\(AT\)连掉两把分,啥时候能上黄啊。
\(A\)
考虑直接动归。
把\(O(n^2)\)的动归后缀和优化成\(O(n)\)
A
#include<iostream>
#include<cstdio>
#define ll long long
#define N 100005
#define mod 1000000007
ll a[N],f[N],g[N],sf[N],sg[N];
ll n,ans,sum;
int main(){
scanf("%lld",&n);
for(int i = 1;i <= n;++i)
scanf("%lld",&a[i]),sum = (sum + a[i]) % mod;
//f:i为-时从i到n有多少种合法方案,g:这些合法方案的权数。
f[n] = 1,g[n] = (-2 * a[n] + mod) % mod;
f[n + 1] = 1;
sf[n] = 2,sf[n + 1] = 1,sg[n] = g[n];
for(int i = n - 1;i >= 2;--i){
f[i] = sf[i + 2];
g[i] = (f[i] * (-2 * a[i] + mod) % mod + sg[i + 2]) % mod;
sf[i] = (sf[i + 1] + f[i]) % mod;
sg[i] = (sg[i + 1] + g[i]) % mod;
}
// for(int i = n;i >= 2;--i)
// std::cout<<f[i]<<" "<<g[i]<<std::endl;
for(int i = n;i >= 2;--i)
ans = (ans + sum * f[i] % mod + g[i]) % mod;
ans = (ans + sum) % mod;
std::cout<<ans<<std::endl;
}
\(B\)
听说B是一个结论题,正解来看呢,应该是把\(n\)个可取值都试一遍,但是我写的模拟退火。
B
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cmath>
#define ll long long
#define N 100005
struct P{int x,y,w;}p[N];
ll n;
double ansx,ansy;
inline double find(double x){
double ans = 0;
for(int i = 1;i <= n;++i)
ans += (p[i].x + x - std::min((double)p[i].x,(double)(2 * x))) / (1.0 * n);
return ans;
}
int main(){
// freopen("q.in","r",stdin);
// freopen("q.out","w",stdout);
srand(273352);
scanf("%lld",&n);
for(int i = 1;i <= n;++i){
scanf("%d",&p[i].x);
ansx += p[i].x; }
ansx = (ansx) / (1.0 * n);
ansy = 0x7f7f7f7f;
double eps = 1e-15;
double T = 200;//初始温度
while(T > eps && ((double)(clock())/CLOCKS_PER_SEC)<1.9){//终止态
// std::cout<<T<<" "<<(rand() * 2 - RAND_MAX) * T<<std::endl;
double nowx = ansx + ((rand() * 2 - RAND_MAX + 1) * T);//在值域[ansx - t,ansx + t];中挑选一个随机数
long double z = find(nowx) - find(ansx);
if(z < 0)
ansx = nowx,ansy = std::min(ansy,find(nowx));
else
if(exp(-z / T) * RAND_MAX > rand())//随机接受
ansx = nowx;
T *= 0.997;//降温速率
// std::cout<<ansx<<std::endl;
}
printf("%.12lf\n",ansy);
}
\(C\)
考虑每一个数在\(fib\)数系下都有唯一分解。
做完了。
C
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
ll f[200],to[200],ti[200];
ll ans[200];
ll n;
ll k;
//0 1
//1 1
//1 2
//1 3
//4 3
//4 7
int main(){
scanf("%lld",&n);
ll q = n;
ll len = 1;
f[0] = 1,f[1] = 1;
while(f[len] <= n + 1){
f[++len] = f[len - 1] + f[len - 2];
}
for(int i = len;i >= 1;--i)
if(n >= f[i])
to[++to[0]] = i,n -= f[i];
std::sort(to + 1,to + to[0] + 1);
for(int i = 1;i <= to[0];++i)
ti[i] = to[to[0]] - to[i];
std::sort(ti + 1,ti + to[0] + 1);
ll s = to[to[0]];
ll x = 0,y = 0;
ll now = 1;
for(int i = 0;i <= s;++i){
if(i == ti[now]){
if(i & 1)
ans[++k] = 1,x += 1;
else
ans[++k] = 2,y += 1;
++now;
}
if(i & 1)
ans[++k] = 4,y += x;
else
ans[++k] = 3,x += y;
}
std::cout<<k<<std::endl;
if(x == q){
for(int i = 1;i <= k;++i)
std::cout<<ans[i]<<std::endl;
}
else{
for(int i = 1;i <= k;++i){
if(ans[i] <= 2)
std::cout<<3 - ans[i]<<std::endl;
else
std::cout<<7 - ans[i]<<std::endl;
}
}
}
\(D\)
考虑如果后手已经想好的每个数对,那么其实游戏进程没有差别。
所以这是一个假博弈。
我们考虑对每一位进行操作,如果这一位的\(0\),\(1\)的数量都是偶数,那么递归进子树操作。
否则则把左子树和右子树左右匹配,用\(01tire\)找出最小的匹配,因为再往下递归的所有对都小于这个匹配。
D
#include<iostream>
#include<cstdio>
#define ll long long
ll to[12000005][2];
ll cnt[12000005];
ll n;
ll dfncnt;
inline void insert(ll x){
ll u = 0;
cnt[u] ++ ;
for(int i = 29;i >= 0;--i){
int t = (x >> i) & 1;
if(!to[u][t])
to[u][t] = ++ dfncnt;
u = to[u][t];
cnt[u] ++ ;
}
}
ll ans = 0,tmp;
#define l(u) to[u][0]
#define r(u) to[u][1]
inline void find(ll p1,ll p2,ll now,ll dep){
// std::cout<<p1<<" "<<p2<<" "<<now<<" "<<dep<<std::endl;
if(dep == 0){
tmp = std::min(now,tmp);
return;
}
bool q = 0;
for(int i = 0;i <= 1;++i)
if(to[p1][i] && to[p2][i]){
q = 1;
find(to[p1][i],to[p2][i],now,dep - 1);
}
if(q)
return;
for(int i = 0;i <= 1;++i)
if(to[p1][i] && to[p2][!i]){
find(to[p1][i],to[p2][!i],now | (1 << (dep - 1)),dep - 1);
q = true;
}
}
inline void dfs(int u,int dep){
// std::cout<<u<<" "<<dep<<std::endl;
if(!to[u][1] && !to[u][0])
return;
if(cnt[l(u)] % 2 && cnt[r(u)]){
tmp = (1 << 30);
find(l(u),r(u),(1 << (dep - 1)),dep - 1);
ans = std::max(ans,tmp);
return ;
}
if(l(u))
dfs(l(u),dep - 1);
if(r(u))
dfs(r(u),dep - 1);
}
int main(){
scanf("%lld",&n);
for(int i = 1;i <= 2 * n;++i){
ll x;
scanf("%lld",&x);
insert(x);
}
dfs(0,30);
std::cout<<ans<<std::endl;
}
\(E\)
由于\(lcm(x,y) = \frac{x * y}{gcd(x,y)}\)
考虑最后一个数,那么有\(gcd(lcm(a_j),a_i) < a_i\)
即\(lcm(gcd(a_i,a_j)) < a_i\)这里是由于精度所以不能选择前一种(
然后依次从后向前选择就好了。
E
#include<iostream>
#include<cstdio>
#define ll long long
#define N 305
ll ans[N],a[N];
bool vis[N];
ll n;
inline ll g(ll a,ll b){return (b == 0) ? a : g(b,a % b);}
int main(){
scanf("%lld",&n);
for(int i = 1;i <= n;++i)
scanf("%lld",&a[i]);
for(int i = n;i >= 1;--i){
bool q;
for(int j = 1;j <= n;++j){
ll lcm = 1;
ll gcd = 1;
if(!vis[j]){
q = 1;
for(int k = 1;k <= n;++k){
if(!vis[k] && k != j){
gcd = g(a[k],a[j]);
lcm = lcm / g(gcd,lcm) * gcd;
if(lcm >= a[j]){
q = 0;
break;
}
}
}
if(q){
ans[i] = a[j];
vis[j] = 1;
break;
}
}
}
if(!q){
puts("No");
return 0;
}
}
puts("Yes");
for(int i = 1;i <= n;++i)
std::cout<<ans[i]<<" ";
}
[ARC 122]的更多相关文章
- ARC 122 简要题解
ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...
- RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例
测试环境: 操作系统 : Red Hat Enterprise Linux ES release 4 (Nahant Update 4) VMWARE 数据库 : O ...
- Convert BSpline Curve to Arc Spline in OpenCASCADE
Convert BSpline Curve to Arc Spline in OpenCASCADE eryar@163.com Abstract. The paper based on OpenCA ...
- 黑马程序员——ARC机制总结和用ARC建立模型
ARC 全称:Automatic Reference Counting 使用ARC 只需要在建立一个新的项目的时候把 下面的√打上 Xcode5以后都会默认建议开发者使用ARC机制 新的项目中如果有部 ...
- JSONKit在项目中使用设置(ARC与方法更新)
在项目中经常会遇到解析json的情况,如果有同学想要解析JSON,那么JSONKit可以是一个不错的选择. git中JSONKit 的地址为:https://github.com/johnezang/ ...
- MRC迁移ARC之__block
今日帮着同事把老项目从MRC迁移至ARC,大部分工作无非是删除release,[super dealloc]等方法,只要关闭了MRC编译选项后,编译器能自动帮你检查,block就有一些不一样了,发现许 ...
- Arc GIS engine10.2与VS2012的安装及匹配步骤
本文章已收录于: .embody { padding: 10px 10px 10px; margin: 0 -20px; border-bottom: solid 1px #ededed } ...
- 关于ARC下需要dealloc的相关内容
今天在项目中使用KVO添加观察者模式的时候,在返回上一级的时候竟然崩了.可是,看了很久,代码没有问题.最后,终于知道了需要添加dealloc 防止以后再出错,所以,便纪录下来.关于ARC下需要手动释放 ...
- iOS 中 ARC 项目 兼容 MRC
iOS 项目中MRC 和 ARC 项目的代码兼容问题: 1.ARC 项目中导入 MRC 第三方类的时候要在此类上添加 -objc-arc. 2.MRC 项目中导入 ARC 类的时候要在次类上添加 -f ...
随机推荐
- 【转】C语言 printf格式控制符 完全解析
printf的格式控制的完整格式:% - 0 m.n l或h 格式字符下面对组成格式说明的各项加以说明:①%:表示格式说明的起始符号,不可缺少.②-:有-表示左 ...
- Golang通脉之切片
因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ su ...
- 从零到熟悉,带你掌握Python len() 函数的使用
摘要:本文为你带来如何找到长度内置数据类型的使用len() 使用len()与第三方数据类型 提供用于支持len()与用户定义的类. 本文分享自华为云社区<在 Python 中使用 len() 函 ...
- python的虚拟环境Anaconda使用
Anaconda 使用conda常用命令 1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是否安装以及当前conda的版本. 2.conda常用的命令. 1)con ...
- [敏捷软工团队博客]Beta阶段发布声明
项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta阶段发布声明 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Bet ...
- 乘风破浪,遇见上一代操作系统Windows 10 - 抢鲜尝试安装新微软商店(Microsoft Store)
背景 在微软官方文章的<十一项关于微软商店新知>中提到: 新的微软商店现在可在Windows 11上找到,我们很高兴地分享,它将在未来几个月内提供给Windows 10客户!我们将很快分享 ...
- [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)
前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...
- STM32中AD采样的三种方法分析
在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式.三种方法按照处理复杂方法DMA模式处理模式效率最高 ...
- createContext 你用对了吗?
目录 前言 性能问题的根源 问题1(整体重复渲染):Provider组件包裹的子组件全部渲染 问题2(局部重复渲染):使用useContext导致组件渲染 解决方案 解决问题1 解决问题2 参考 前言 ...
- Django(71)图片处理器django-imagekit
介绍 ImageKit是用于处理图像的Django应用程序.如果需要从原图上生成一个长宽为50x50的图像,则需要ImageKit. ImageKit附带了一系列图像处理器,用于调整大小和裁剪等常见任 ...