最近状态差到爆炸.

\(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. PyCharm永久破解方法,2021最新版本!!!

    1,下载破解补丁(已更新到2021.1版本): 关注微信公众号<程序员的时光>,回复破解补丁即可: 下载补丁文件 jetbrains-agent.jar 和importat.txt文件并将 ...

  2. 【UE4 C++】Input 输入事件绑定

    轴映射与动作映射 编辑器设置input+代码实现具体动作 void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInp ...

  3. px,dp sp是像素、尺寸、尺寸

    px:即像素,1px代表屏幕上一个物理的像素点:px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同,如下图所示(图片来自android developer guide, ...

  4. 从零开始的DIY智能浇水应用

    前言 作为一个新世纪打工人,平常也会去养一些花草,来给我的房间增加点绿色和活力,但是常常因为工作忙而忘记一些事情.,毕竟我大部分的时间都是陪伴着电脑的(严正声明:我不是个单身狗!!! (¬◡¬)✧), ...

  5. linux中dd命令

    转载:https://www.runoob.com/linux/linux-comm-dd.html Linux dd 命令用于读取.转换并输出数据. dd 可从标准输入或文件中读取数据,根据指定的格 ...

  6. 汇编--LDR

    转载:https://my.oschina.net/zengsai/blog/23733 ARM LDR 伪指令的格式: LDR Rn, =expr 如果name是立即数的话LDR R0,=0X123 ...

  7. single-number leetcode C++

    Given an array of integers, every element appears twice except for one. Find that single one. Note: ...

  8. 第01课 OpenGL窗口(2)

    下一段包括了所有的绘图代码.任何您所想在屏幕上显示的东东都将在此段代码中出现.以后的每个教程中我都会在例程的此处增加新的代码.如果您对OpenGL已经有所了解的话,您可以在 glLoadIdentit ...

  9. Spring Cloud Alibaba环境搭建

    前言:Spring Cloud Alibaba是目前主流的分布式微服务架构,本文主要讲解了在IDEA中如何搭建Spring Cloud Alibaba环境,以及介绍Spring Cloud Aliba ...

  10. 八. Go并发编程--errGroup

    一. 前言 了解 sync.WaitGroup的用法都知道 一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问 ...