最近状态差到爆炸.

\(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]的更多相关文章

  1. ARC 122 简要题解

    ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...

  2. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

  3. 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 ...

  4. 黑马程序员——ARC机制总结和用ARC建立模型

    ARC 全称:Automatic Reference Counting 使用ARC 只需要在建立一个新的项目的时候把 下面的√打上 Xcode5以后都会默认建议开发者使用ARC机制 新的项目中如果有部 ...

  5. JSONKit在项目中使用设置(ARC与方法更新)

    在项目中经常会遇到解析json的情况,如果有同学想要解析JSON,那么JSONKit可以是一个不错的选择. git中JSONKit 的地址为:https://github.com/johnezang/ ...

  6. MRC迁移ARC之__block

    今日帮着同事把老项目从MRC迁移至ARC,大部分工作无非是删除release,[super dealloc]等方法,只要关闭了MRC编译选项后,编译器能自动帮你检查,block就有一些不一样了,发现许 ...

  7. Arc GIS engine10.2与VS2012的安装及匹配步骤

      本文章已收录于:   .embody { padding: 10px 10px 10px; margin: 0 -20px; border-bottom: solid 1px #ededed } ...

  8. 关于ARC下需要dealloc的相关内容

    今天在项目中使用KVO添加观察者模式的时候,在返回上一级的时候竟然崩了.可是,看了很久,代码没有问题.最后,终于知道了需要添加dealloc 防止以后再出错,所以,便纪录下来.关于ARC下需要手动释放 ...

  9. iOS 中 ARC 项目 兼容 MRC

    iOS 项目中MRC 和 ARC 项目的代码兼容问题: 1.ARC 项目中导入 MRC 第三方类的时候要在此类上添加 -objc-arc. 2.MRC 项目中导入 ARC 类的时候要在次类上添加 -f ...

随机推荐

  1. 【c++ Prime 学习笔记】第10章 泛型算法

    标准库未给容器添加大量功能,而是提供一组独立于容器的泛型算法 算法:它们实现了一些经典算法的公共接口 泛型:它们可用于不同类型的容器和不同类型的元素 利用这些算法可实现容器基本操作很难做到的事,例如查 ...

  2. sqlmap--tamper使用技巧

    apostrophemask.py 适用数据库:ALL 作用:将引号替换为utf-8,用于过滤单引号 使用脚本前: tamper("1 AND '1'='1") 使用脚本后: 1A ...

  3. UML快速概述 - All you need to know about UML

    UML 是统一建模语言的缩写,就像使用一组图表来可视化软件建模的蓝图(或设计计划).它不仅可以让您彻底评估整个概念,还可以确保团队中的每个人都在同一页面上.   UML 图可以组织成两个不同的组. 结 ...

  4. BUAA 2020 软件工程 个人博客作业

    BUAA 2020 软件工程 个人博客作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 ...

  5. 阿里Nacos部署

    Nacos的部署 一.单机部署 **4.修改 Nacos 存储为 Mysql** 二.集群部署 1.机器部署列表 2.修改 `nacos/conf/application.properties`中的端 ...

  6. 使用nexus搭建一个docker私服

    使用nexus搭建docker私服 一.需求: 二.实现步骤 1.编写`docker-compose`文件,实现`nexus`的部署 2.修改/usr/lib/systemd/system/docke ...

  7. Noip模拟59 2021.9.22

    新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...

  8. 绑定socket描述符到一个网络设备

           网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题:           在多 IP/网卡主机上,UDP ...

  9. 【Java】IO流

    File类 介绍 File类的一个对象,代表一个文件或一个文件目录 File类声明在java.io包下 File类中涉及关于文件或文件目录的创建.删除.重命名.修改时间.文件大小等方法,并未涉及到写入 ...

  10. idea Mark Directory as 的几种文件类型

    1. Source roots (or source folders) 源文件夹 通过为该类别分配文件夹,可以告诉IntelliJ IDEA该文件夹及其子文件夹包含应在构建过程中进行编译的源代码. 2 ...