传送门

\(A\)

直接转移就是了

typedef long long ll;
const int N=55;
ll f[N][2];int a[N],n,p;
int main(){
scanf("%d%d",&n,&p);
fp(i,1,n)scanf("%d",&a[i]),a[i]&=1;
f[0][0]=1;
fp(i,1,n){
f[i][0]=f[i-1][0],f[i][1]=f[i-1][1];
if(a[i]&1)f[i][0]+=f[i-1][1],f[i][1]+=f[i-1][0];
else f[i][0]+=f[i-1][0],f[i][1]+=f[i-1][1];
}
printf("%lld\n",f[n][p]);
return 0;
}

\(B\)

我是个\(zz\)……

每个数的贡献要么为正要么为负,那么我们枚举有几个贡献为正的,然后算一下贡献总和的上下界就行了

typedef long long ll;
int n,a,b,c,d;ll l,r;
int main(){
scanf("%d%d%d%d%d",&n,&a,&b,&c,&d),b-=a;
fp(i,0,n-1){
l=1ll*i*c-1ll*(n-1-i)*d;
r=1ll*i*d-1ll*(n-1-i)*c;
if(b>=l&&b<=r)return puts("YES"),0;
}
puts("NO");
return 0;
}

\(C\)

我脑子里装的都是浆糊吧……

对于一个数\(i\),如果出现了\(cnt[i]\)次,那么我们可以看做把\([i-cnt[i]+1,i]\)的位置给区间加一,那么需要改的次数就是为\(0\)的位置个数,那么修改可以\(O(1)\)

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=2e5+5;
int cnt[N],vis[N],a[N],n,m,res;
inline void ins(R int x){++cnt[x];if(x-cnt[x]+1>=1&&!vis[x-cnt[x]+1]++)--res;}
inline void del(R int x){if(x-cnt[x]+1>=1&&!--vis[x-cnt[x]+1])++res;--cnt[x];}
int main(){
scanf("%d%d",&n,&m),res=n;
fp(i,1,n)scanf("%d",&a[i]),ins(a[i]);
for(R int i=1,x,y;i<=m;++i){
scanf("%d%d",&x,&y);
del(a[x]),a[x]=y,ins(a[x]);
printf("%d\n",res);
}
return 0;
}

\(D\)

想了半天结果一看题解发现并没有神仙结论……

我们考虑每棵子树的\(sg\)值,如果是叶子,那么\(sg(u)=0\),否则每个儿子都相当于一个子游戏,算出儿子节点\(v\)的\(sg\)值后,那么\(v\)的子树加上\((u,v)\)这条边的\(sg\)值就是\(sg(v)+1\)

证明的话,如果删掉的是\((u,v)\)这条边,那么\(sg=0\),否则的话假设删掉的是\(v\)这棵子树中的一条边,得到的是由\(v\)原来的子树\(T\)可以得到的一个\(T'\),如果我们用归纳法,那么\(sg(T')\)可以取遍\([0+1,1+1,2+1,...,sg(T)-1+1]\),所以\(sg(u)=sg(T)+1\)

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=1e5+5;
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int sg[N],n;
void dfs(int u,int fa){
sg[u]=0;
go(u)if(v!=fa)dfs(v,u),sg[u]^=sg[v]+1;
}
int main(){
scanf("%d",&n);
for(R int i=1,u,v;i<n;++i)scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(1,0);
puts(sg[1]?"Alice":"Bob");
return 0;
}

\(E\)

对于每一个点\(i\),如果\(c_i=0\)则设\(l=a_i\)否则设\(l=-c_i\),如果\(d_i=0\)则设\(r=-b_i\)否则设\(r=d_i\),那么我们发现如果\((li,ri)\)能接在\((l,r)\)的右边当且仅当\(li=r\)

那么我们把\((l,r)\)当做从\(l\)连到\(r\)的一条边,那么现在要把这个图分解成若干条路径,使得每条路径的开头是正数,结尾是负数。那么显然正数的出度大于等于入度,而负数的入度大于等于出度,且对于每一个连通块至少有一个点的出度不等于入度(否则这个东西成环且永远没办法分解成若干条路径)

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=405;
int fa[N],vis[N],in[N],out[N],n,h;
inline int find(R int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
scanf("%d%d",&n,&h);
fp(i,0,h<<1)fa[i]=i;
for(R int i=1,a,b,c,d,l,r;i<=n;++i){
scanf("%d%d%d%d",&a,&b,&c,&d);
l=(c?-c:a)+h,r=(d?d:-b)+h,fa[find(l)]=find(r);
++out[l],++in[r];
}
fp(i,-h,-1)if(out[i+h]>in[i+h])return puts("NO"),0;
fp(i,1,h)if(in[i+h]>out[i+h])return puts("NO"),0;
fp(i,0,h<<1)if(in[i]!=out[i])vis[find(i)]=1;
fp(i,0,h<<1)if(in[i]&&out[i]&&!vis[find(i)])return puts("NO"),0;
puts("YES");
return 0;
}

\(F\)

首先可以把路径压缩成二进制数,这样暴力的话可以写出一个\(O(2^{2n})\)的\(dp\)

考虑怎么优化,我们发现一条路径合法,当且仅当任意时刻前缀和都小于等于前一条路径的前缀和

设现在在考虑第\(i\)条路径,然后强制前\(j-1\)步和上一条相同,那么考虑第\(j\)步

如果相同直接无视,否则如果上一步走\(1\)这一步走\(0\)显然\(gg\),那么只需要考虑上一步走\(1\)这一步走\(0\)

我们找到\(i-1\)的下一个\(1\)的位置,然后把那个\(1\)的位置移到前面来,这样的话限制条件仍然合法

如果不存在下一个\(1\)那么当前这条路显然可以随便走了

那么直接\(dp\)就可以了

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
const int N=(1<<20)+5;
int f[25][N],g[N],is[25][25],nxt[N][25],n,m,k,res,lim;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d%d",&n,&m,&k),--n,lim=(1<<n);
memset(is,-1,sizeof(is));
for(R int i=1,a,b,c;i<=k;++i)scanf("%d%d%d",&a,&b,&c),is[a][b-1]=c;
fp(s,0,lim-1){
R int p=-1;
fd(i,n-1,0){
if(s>>i&1)p=i;
nxt[s][i]=p;
}
}
f[n][0]=1;
fp(i,1,m){
fp(j,0,lim-1)g[j]=f[n][j];
memset(f,0,sizeof(f));
fp(j,0,lim-1)f[0][j]=g[j];
fp(j,0,n-1)fp(k,0,lim-1)if(f[j][k])
fp(l,0,1){
if(is[i][j]!=-1&&l!=is[i][j])continue;
R int t=k>>j&1;
if(l==0&&t==1)continue;
if(l==t)upd(f[j+1][k],f[j][k]);
else{
R int p=nxt[k][j];
if(p==-1)upd(f[j+1][k|(1<<j)],f[j][k]);
else upd(f[j+1][k^(1<<j)^(1<<p)],f[j][k]);
}
}
}
fp(i,0,lim-1)upd(res,f[n][i]);
printf("%d\n",res);
return 0;
}

AtCoder Grand Contest 017题解的更多相关文章

  1. AtCoder Grand Contest 017 题解

    A - Biscuits 题目: 给出 \(n\) 个物品,每个物品有一个权值. 问有多少种选取方式使得物品权值之和 \(\bmod\space 2\) 为 \(p\). \(n \leq 50\) ...

  2. 题解——ATCoder AtCoder Grand Contest 017 B - Moderate Differences(数学,构造)

    题面 B - Moderate Differences Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stat ...

  3. AtCoder Grand Contest 017 F - Zigzag

    题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...

  4. AtCoder Grand Contest 017 (VP)

    contest link Official Editorial 比赛体验--之前做题的时候感觉 AtCoder 挺快的,现在打了VP之后发现还是会挂的--而且不是加载缓慢或者载不出来,直接给你一个无法 ...

  5. Atcoder Grand Contest 054 题解

    那天晚上由于毕业晚会与同学吃饭喝酒没打 AGC,第二天稍微补了下题,目前补到了 E,显然 AGC 的 F 对于我来说都是不可做题就没补了(bushi A 简单题,不难发现如果我们通过三次及以上的操作将 ...

  6. AtCoder Grand Contest 017

    noi前橙名计划失败.全程搞C而gg…… A - Biscuits 题意:背包,求价值为奇/偶的方案数. #include<cstdio> #include<queue> #i ...

  7. AtCoder Grand Contest 030题解

    第一次套刷AtCoder 体验良好 传送门 Poisonous Cookies cout<<b+min(c,a+b+); Tree Burning 难度跨度有点大啊 可以证明当第一次转向之 ...

  8. AtCoder Grand Contest 031题解

    题面 传送门 题解 比赛的之后做完\(AB\)就开始发呆了--简直菜的一笔啊-- \(A - Colorful\ Subsequence\) 如果第\(i\)个字母选,那么它前面任意一个别的字母的选择 ...

  9. AtCoder Grand Contest 017 迟到记

    晚上去操场上浪. 回来以后看到好几个人开着 \(AtCoder\) 在打代码. ... ... 今天有 \(AtCoder\) 比赛 ? 管它呢, \(Kito\) 在切西瓜,先吃西瓜... 然后看 ...

随机推荐

  1. AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion 区别

    AssemblyVersion: 几乎保留在.NET内部,AssemblyFileVersion: 就是Windows所见.如果您转到位于目录中的程序集的属性并切换到版本选项卡, 映射到“文件版本”A ...

  2. 快速生成html文本文档——typora

    下载地址:https://www.typora.io/#windows 一.工具界面: 二.使用工具编辑: 三.导出为html: 四.打开html查看: Markdown语法教程:https://ww ...

  3. 7、注解@Mapper、@MapperScan

    7.注解@Mapper.@MapperScan 2018年09月20日 11:12:41 飞奔的加瓦 阅读数 3284    版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  4. 湖南师范大学计算机基础课网络教学平台 版本 V2.0(2017.9.18)

    湖南师范大学计算机基础课网络教学平台 版本 V2.0(2017.9.18) 开发环境: 开发工具:VS2013,数据库:Sqlserver2012 开发语言:Asp.net MVC5 ,界面UI:jq ...

  5. OO——UML解析

    目录 第四单元博客作业 一.前两次作业架构设计 1. 第一次作业 2. 第二次作业 二.架构设计以及对OO方法理解的演进 1. 表达式求导 2. 多线程电梯 3. 地铁线路查询 4. UML图的解析 ...

  6. windows下cuda的安装

    1. cuda的安装 到 https://developer.nvidia.com/cuda-toolkit 去下载.在安装的时候一定要自定义安装,否则将会安装很多无用的东西.安装的选项,可以选择不更 ...

  7. 入门Docker,你要下载什么?注册什么?

    此随笔根据前人经验改编并亲自实践.遇到问题提供出相应解决方法. 入门Docker,你要下载什么?注册什么? Docker.app你肯定是要下载的!此教程应用于MAC系统PC不保证适用 Docker f ...

  8. 阿里云OSS上传文件demo

    1.安装ali-oss npm install ali-oss --save 2.demo 此例中使用到了ElementUI的el-upload组件.因为样式为自定义的 所以没有用element的自动 ...

  9. C++ Win32 遍历窗口

    查找指定窗口 #include <iostream> #include <windows.h> using namespace std; int main() { TCHAR ...

  10. [AIR] NativeExtension在IOS下的开发实例 --- ANE文件的打包(三)

    来源:http://bbs.9ria.com/thread-102041-1-1.html 好了,前面的准备工作做的差不多了.此时我们应用有下面几个文件:extension.xml    CoolEx ...