[ARC 066] Tutorial
Link:
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的更多相关文章
- AtCoder Regular Contest
一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ...
- HTML5 Canvas Arc Tutorial
HTML5 Canvas Arc Tutorial HTML5 Canvas Arc Tutorial
- [Hive - Tutorial] Built In Operators and Functions 内置操作符与内置函数
Built-in Operators Relational Operators The following operators compare the passed operands and gene ...
- 【转】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 ...
- GDI+ Tutorial for Beginners
原文 GDI+ Tutorial for Beginners GDI+ is next evolution of GDI. Using GDI objects in earlier versions ...
- 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( ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.6 Defining Projections and Extents 一.前言 当在m ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.5 Adding a raster layer 一.前言 MapServer不仅支持 ...
- 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 ...
随机推荐
- 超详细的Java面试题总结(二)之Java基础知识篇
多线程和Java虚拟机 创建线程有几种不同的方式?你喜欢哪一种?为什么? 继承Thread类 实现Runnable接口 应用程序可以使用Executor框架来创建线程池 实现Callable接口. 我 ...
- niceScroll 简单使用 及 插件API
官方网址[https://nicescroll.areaaperta.com/] 注:效果见官网右侧滚动条 jquery.nicescroll文件下载地址 引入核心文件,插件需要引入1.5.X以上版 ...
- Fiddler-- 安装HTTPs证书
1. 现在很多带有比较重要信息的接口都使用了安全性更高的HTTPS,而Fiddler默认是抓取HTTP类型的接口,要想查看HTTPS类型接口就需要安装fiddler证书. 2.打开Fiddler, ...
- Lucene7.2.1系列(一)快速入门
系列文章: Lucene系列(一)快速入门 Lucene系列(二)luke使用及索引文档的基本操作 Lucene系列(三)查询及高亮 Lucene是什么? Lucene在维基百科的定义 Lucene是 ...
- css 背景透明,文字不透明
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- linux命令行todo列表管理工具Taskwarrior介绍
Taskwarrior 是一款在命令行下使用的TODO列表管理工具,或者说任务管理工具,灵活,快速,高效. 安装 在ubuntu 14.04 中,可从官方仓库安装task软件包 sudo apt-ge ...
- vim常用命令(复习版)(转)
原文链接:http://blog.csdn.net/love__coder/article/details/6739670 1.光标移动 上:k 下:j 左:l 『字母L小写』 右:h 上一行行首:- ...
- FineReport——JS监听其他控件事件
首先在参数面板和报表中分布添加一个button,用于被监听: 参数面板 控件名:temp: temp点击事件:alert("temp"); 报表 控件名:exprt: temp点击 ...
- 阿里云ftp连接遇到的错误,entering passive mode失败(一个并不成熟的产品?)
####禁止自行转载 ####违者必究 ####需要转载请联系我 因为最近用python写了一个自动上传的脚本,想通过FTP把数据上传到我的服务器. 于是, 兴高采烈地打开我一直信任的阿里云,yum ...
- elasticsearch批量索引数据示例
示例数据文件document.json(index表示在索引中增加或替换现有文档,create表示如果文档不存在则添加文档,delete表示删除文档): { "index": { ...