[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 ...
随机推荐
- Vim合并行
日常常用到多行合并的功能,记录如下: 第一种, 多行合并成一行,即: AAAAABBBBBCCCCC 合并为:AAAAA BBBBB CCCCC 方法1: normal状态下 3J 其中的3是范围,可 ...
- 使用固件库点亮led灯
1. 项目 使用STM32F103VE的固件库实现流水灯设计. 2. 代码 由于这是基于野火的视频进行学习的,项目代码在上节基础上进行编写的. 点亮绿灯: main.c #include " ...
- 全连接层dense作用
参考来源
- VS2015+OpenCV+Qt
VS2015+OpenCV+Qt 01.OpenCV 下载 进入官网链接: https://opencv.org,下载所需要的版本: 下载完成后直接双击,选择解压路径,解压到响应的文件夹中: 若之后需 ...
- 第4次 Beta Scrum Meeting
本次会议为Beta阶段第4次Scrum Meeting会议 会议概要 会议时间:2021年6月4日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:对完成工作进行阶段性汇报:对下一 ...
- logstash处理多行日志-处理java堆栈日志
logstash处理多行日志-处理java堆栈日志 一.背景 二.需求 三.实现思路 1.分析日志 2.实现,编写pipeline文件 四.注意事项 五.参考文档 一.背景 在我们的java程序中,经 ...
- 基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中
基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中 一.背景 二.实现方案 1.基于@ComponentScan注解实现 2.基 ...
- RF射频传输,原理介绍,三分钟看懂!发射功率、接收灵敏度详解!
射频是什么? 官方说法:RF,Radio Frequency. (不懂的人,看了还是不懂,不过对于物联网行业的开发工程师.产品经理和项目经理,还是有需要对射频有个基础了解的.) 燚智能解读: 两个人, ...
- 第K个数 牛客网 程序员面试金典 C++ Python
第K个数 牛客网 程序员面试金典 C++ Python 题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测 ...
- hdu 5056 Boring count (类似单调队列的做法。。)
给一个由小写字母构成的字符串S,问有多少个子串满足:在这个子串中每个字母的个数都不超过K. 数据范围: 1<=T<= 1001 <= the length of S <= 10 ...