Link:

ARC 066 传送门

C:

如果存在可行方案则答案为$2^{n/2}$

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+,MOD=1e9+;
int n,x,res[MAXN]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&x);
int rk=(n-+x)/;
if(!res[rk+]) res[rk+]=i;
else if(!res[n-rk]) res[n-rk]=i;
else return puts(""),;
}
int res=;
for(int i=;i<=n/;i++) (res*=)%=MOD;
printf("%d",res);
return ;
}

Problem C

D:

挺不错的一道数位$dp$

由于无法直接计算$sum$和$xor$的对数,因此考虑枚举$a,b$,而将$sum,xor\le n$作为限制条件

又因为公式:$a+b=aXORb+2*(a\&b)$,所以$a+b\le aXORb$,只考虑$a+b$的限制即可

此时问题转化为对于每个$sum\le n$求$xor$的取值个数

这样就可以用$dp[i][s]$表示前$i$位确定,$a+b$的和为$s$的个数,每次分$a,b$在该位上总共有几个1转移

(按每位1的个数转移才不会考虑异或与和同时相同的情况!)

但这样复杂度是不对的,在枚举$s$上明显花费了不必要的时间

根据一般数位$dp$记录上限的思想,如果前$i$位的$n-s\ge 2$,这些数以后都保证合法,就能统一计算了

这样就从$dp[i][s]$变成了$dp[i][0/1/2]$

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
#define MAX_D 64
#define MOD ((ll)1e9 + 7)
ll N,dp[MAX_D][],res;int nxt; int main()
{
scanf("%lld",&N);
dp[MAX_D-][]=;
for(int i=MAX_D-;i>;i--)
for(int j=; j <= ; j++)
for(int k=;k<=;k++)
{
nxt=j*+((N>>(i-))&)-k;
if (nxt<) continue;
nxt=nxt>?:nxt;
(dp[i-][nxt]+=dp[i][j])%=MOD;
}
res=;
for (int i=;i<=;i++) (res+=dp[][i])%=MOD;
printf("%lld\n", res);
return ;
}

Solution A

从后往前用记忆化搜索的形式写起来更加方便

一开始将上限值就设为$n$,每次确定最后一位取几个以后去掉最后一位,不用考虑和的合法性了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MOD=1e9+;
map<ll,ll> dp;ll n; ll dfs(ll x)
{
if(dp.count(x)) return dp[x];
return dp[x]=(dfs(x>>)+dfs((x-)>>)+dfs((x-)>>))%MOD;
} int main()
{
scanf("%lld",&n);
dp[]=;dp[]=;
printf("%lld",dfs(n));
return ;
}

Solution B

E:

首先要观察出几点性质:

1、只有在减号后可能加括号

2、括号不可能嵌套超过两层,否则可以转化为只有两层的简化情况

这样就可以记录$dp[0/1/2]$分别表示当前还有几个左括号未匹配的最大值来$dp$了

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int n,x;char op;ll dp[],nxt[]; int main()
{
scanf("%d%d",&n,&dp[]);
dp[]=dp[]=-1ll<<;
for(int i=;i<n;i++)
{
scanf(" %c%d",&op,&x);
if(op=='-') x=-x;
nxt[]=dp[]+x,nxt[]=dp[]-x,nxt[]=dp[]+x;
dp[]=max(nxt[],max(nxt[],nxt[]));
if(op=='+') dp[]=max(nxt[],nxt[]),dp[]=nxt[];
else dp[]=dp[],dp[]=max(nxt[],nxt[]);
}
printf("%lld",dp[]);
return ;
}

Solution A

其实也可以不用$dp$,考虑如果在某个减号后加了第一个括号的最优解

发现此时能保证将下一个减号后的值都变为正贡献,但对当前位到下一个减号间的值是无能为力的

这样枚举第一个括号的位置对答案更新即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
char op[MAXN];
int n,dat[MAXN],nxt[MAXN],fst;
ll suf[MAXN],cur,res=-1ll<<; int main()
{
scanf("%d%d",&n,&fst);
for(int i=;i<n;i++)
scanf(" %c%d",&op[i],&dat[i]);
cur=n;
for(int i=n-;i;i--)
{
suf[i]=suf[i+]+dat[i];
if(op[i]=='-') nxt[i]=cur,cur=i;
}
cur=;
for(int i=;i<n;i++)
if(op[i]=='-')
res=max(res,cur-suf[i]+*suf[nxt[i]]),cur-=dat[i];
else cur+=dat[i];
res=max(res,cur);
printf("%lld",res+fst);
return ;
}

Solution B

F:

[ARC 066] Tutorial的更多相关文章

  1. AtCoder Regular Contest

    一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ...

  2. HTML5 Canvas Arc Tutorial

    HTML5 Canvas Arc Tutorial HTML5 Canvas Arc Tutorial  

  3. [Hive - Tutorial] Built In Operators and Functions 内置操作符与内置函数

    Built-in Operators Relational Operators The following operators compare the passed operands and gene ...

  4. 【转】Enable ARC in a Cocos2D Project: The Step-by-Step-How-To-Guide Woof-Woof!

    On April 5, 2012, in idevblogaday, by Steffen Itterheim http://www.learn-cocos2d.com/2012/04/enablin ...

  5. GDI+ Tutorial for Beginners

    原文 GDI+ Tutorial for Beginners GDI+ is next evolution of GDI. Using GDI objects in earlier versions ...

  6. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.7 Adding a wms layer

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.7 Adding a wms layer 前言 Add OGC WMS Layers( ...

  7. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents 一.前言 当在m ...

  8. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a  raster layer 一.前言 MapServer不仅支持 ...

  9. Instruments Tutorial for iOS: How To Debug Memory Leaks【转】

    If you're new here, you may want to subscribe to my RSS feed or follow me on Twitter. Thanks for vis ...

随机推荐

  1. 【51NOD】1096 距离之和最小

    [算法]数学 [题解] 其实就是求中位数,奇数个点就是最中间的点,偶数个点就是最中间两个点和它们之间的区域皆可(所以偶数不必取到两点正中央,取两点任意一点即可). 我们可以想象现在x轴上有n个点,我们 ...

  2. Spring Session加Redis(山东数漫江湖)

    session是一个非常常见的概念.session的作用是为了辅助http协议,因为http是本身是一个无状态协议.为了记录用户的状态,session机制就应运而生了.同时session也是一个非常老 ...

  3. POJ 1064 Cable master (二分查找)

    题目链接 Description Inhabitants of the Wonderland have decided to hold a regional programming contest. ...

  4. 类图(Class Diagram)

    类图(Class Diagram): 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 类一般由三部分组成: 类名(Class):每个类都必须 ...

  5. bootstrap-table组合表头

    1.效果图 2.html代码 <table id="table"></table> 3.javascript代码 $("#table") ...

  6. servlet线程不安全

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAE9CAIAAABY1Yv/AAAgAElEQVR4nOy9eVxN2/8/viuaU5kqZW

  7. Part2-HttpClient官方教程-Chapter1-基础

    前言 超文本传输协议(HTTP)可能是当今Internet上使用的最重要的协议.Web服务.网络支持的设备和网络计算的增长继续扩展了HTTP协议在用户驱动的Web浏览器之外的作用,同时增加了需要HTT ...

  8. postman测试express restful接口

    安装express及postman var express = require('express') var app = express(); var calculation = require('. ...

  9. Java面试基础知识1

    1.动态绑定是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 2.在将超类转换为子类之前,应该使用instanceof进行检查. 3.包含一个或者多个抽象方法的类本身必须被声 ...

  10. Linux 入门记录:一、命令行 Bash 的基本操作

    为了以后长期的线上测试和服务器的性能考量,要用 Linux 服务器了.昨晚装了个 CentOS 6.9,今天开始学学 Linux 基础,扫扫盲.ok,小本本记 ing... 一.Shell简介 She ...