AtCoder Grand Contest 017

AtCoder Grand Contest 017

A - Biscuits

\(n\)个数,问有多少个集合的数的和模\(2\)\(P\)

随便\(dp\)一下就好了。

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,P;ll f[55][2];
int main()
{n=read();P=read();f[0][0]=1;for(int i=1;i<=n;++i){int x=read()&1;f[i][0]=f[i-1][0];f[i][1]=f[i-1][1];f[i][0^x]+=f[i-1][0];f[i][1^x]+=f[i-1][1];}printf("%lld\n",f[n][P]);return 0;
}

B - Moderate Differences

\(n\)个数排成一行,第一个数是\(A\),最后一个数是\(B\),已知相邻的两个数的差的绝对值都在\([C,D]\)之间,问是否存在一个合法的情况。

显然每个数要么贡献为正要么贡献为负,那么枚举有多少个贡献为正,这样子就能够算出一个合法区间,判断\(B-A\)是否在这个区间内就行了。

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,A,B,C,D;
ll L,R;
void chk(){if(L<=B&&B<=R)puts("YES"),exit(0);}
int main()
{n=read();A=read();B=read()-A;C=read();D=read();for(int i=0;i<n;++i){L=1ll*C*i-1ll*(n-1-i)*D;R=1ll*D*i-1ll*(n-1-i)*C;chk();}puts("NO");return 0;
}

C - Snuke and Spells

你有\(n\)个球,假设当前剩下的球的个数是\(k\)个,那么就把所有球上写的数字为\(k\)的球给丢掉。

现在你可以改变一些球上的数字,问最少改变多少次可以让所有球都被删掉。

有若干次修改,你要对于每次修改之后都求出答案。

我怎么觉得这题做过啊。。。。

大概就是把数字个数用类似柱状图给表示出来,然后把柱子给向左推倒,那么\([1,n]\)中未被覆盖的位置的个数的就是答案。

那么拿线段树模拟一下就行了嗷。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 200200
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,Q;
int a[MAX],b[MAX],c[MAX];
#define lson (now<<1)
#define rson (now<<1|1)
int t[MAX<<2],mn[MAX<<2];
void pushup(int now){mn[now]=mn[lson]+mn[rson];}
void Build(int now,int l,int r)
{if(l==r){t[now]=c[l];mn[now]=c[l]==0;return;}int mid=(l+r)>>1;Build(lson,l,mid);Build(rson,mid+1,r);pushup(now);
}
void Modify(int now,int l,int r,int p,int w)
{if(l==r){t[now]+=w;mn[now]=t[now]==0;return;}int mid=(l+r)>>1;if(p<=mid)Modify(lson,l,mid,p,w);else Modify(rson,mid+1,r,p,w);pushup(now);
}
int main()
{n=read();Q=read();for(int i=1;i<=n;++i)b[a[i]=read()]++;for(int i=1;i<=n;++i)if(b[i])c[max(1,i-b[i]+1)]+=1,c[i+1]-=1;for(int i=1;i<=n;++i)c[i]+=c[i-1];Build(1,1,n);while(Q--){int x=read(),v=read();b[a[x]]--;if(a[x]-b[a[x]]>0)Modify(1,1,n,a[x]-b[a[x]],-1);a[x]=v;if(a[x]-b[a[x]]>0)Modify(1,1,n,a[x]-b[a[x]],1);b[a[x]]++;printf("%d\n",mn[1]);}return 0;
}

D - Game on Tree

两个人在一棵\(n\)个节点的树上玩游戏,每次可以选择一条边,把这条边删掉,然后把不包含\(1\)的那个连通块给删掉,不能操作者输。

问谁会赢。

emmmm,这是个博弈题,所以如果不是神仙结论的话就往\(SG\)函数上靠。

显然根节点的每个儿子都可以拆下来变成一个子游戏,所以根节点的\(sg\)值就是所有儿子\(sg\)值的异或和。

因为所有儿子拆下来变成子游戏之后,还需要花\(1\)步把这个儿子删掉,所以每个点的\(sg\)值是所有儿子\(sg\)\(+1\)的异或和。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100100
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int n,sg[MAX],vis[MAX];
void dfs(int u,int ff)
{for(int i=h[u];i;i=e[i].next)if(e[i].v!=ff)dfs(e[i].v,u),sg[u]^=sg[e[i].v]+1;
}
int main()
{n=read();for(int i=1;i<n;++i){int u=read(),v=read();Add(u,v);Add(v,u);}dfs(1,0);puts(sg[1]?"Alice":"Bob");return 0;
}

E - Jigsaw

有若干个高度为\(H\)的积木,每个都长成这样:

img

\(A_i,B_i,C_i,D_i\)都会告诉你,并且左中右三个部分的宽度也相等。

现在给你\(n\)个积木,你要让中间那部分的下面挨着地面,然后拼出来的东西要满足不存在地面上面的存在一段空,且这段空的上方还有积木。写成坐标的形式就是不存在\((x,y1)\)未被积木覆盖,但是\((x,y_2),y_1<y_2\)被积木覆盖了。

显然是考虑把一个积木左边给卡进另一个积木的右侧里,那么我们把能够卡的积木之间连边,把接地的和起点终点连边,于是就是问所有积木是否能分成若干条路径。然而这样子复杂度很假,因为边数可以达到\(O(n^2)\)级别。

考虑把积木看成边,于是我们可以把左侧\(C_i=0\)看成点\(-A_i\)\(C_i\neq 0\)看成点\(C_i\),右侧\(D_i=0\)看成点\(B_i\)\(D_i\neq 0\)看成\(-D_i\)。这样转化完之后一个积木就是一条边,于是问题变成了我们有\([-H,H]\)这些点,之间有一些边,我们要把每一条边都划分进一个路径中,使得路径以负数为起点,以正数为终点。

那么我们统计入度和出度,显然负数的入度不能多于出度,正数出度不能多于入度。同时这个东西不能成环,所以一个连通块中至少存在一个点入度不等于出度。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 450
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,H,f[MAX],In[MAX],Ot[MAX];bool vis[MAX];
int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
int main()
{n=read();H=read();for(int i=1;i<=H+H;++i)f[i]=i,vis[i]=false;for(int i=1;i<=n;++i){int a=read(),b=read(),c=read(),d=read();int l=(c>0?c:-a)+H,r=(d>0?-d:b)+H;if(getf(l)!=getf(r))f[getf(l)]=getf(r);In[r]+=1;Ot[l]+=1;}for(int i=-H;i<0;++i)if(In[i+H]>Ot[i+H]){puts("NO");return 0;}for(int i=1;i<=H;++i)if(In[i+H]<Ot[i+H]){puts("NO");return 0;}for(int i=0;i<=H+H;++i)if(In[i]!=Ot[i])vis[getf(i)]=true;for(int i=0;i<=H+H;++i)if(In[i]&&Ot[i]&&!vis[getf(i)]){puts("NO");return 0;}puts("YES");return 0;
}

F - Zigzag

\(n*(n+1)/2\)个点,第\(i\)行有\(i\)个点,用\((i,j),j\le i\)表示这些点。

\((i,j)\)只能走到\((i+1,j+1)\)或者\((i+1,j)\)

现在你要找到\(m\)条从\((1,1)\)走到第\(n\)行的路径,假设第\(a\)条路径走过的第\(k\)个点是\((k,X[a,k])\),那么对于任意的\(a\le b\),不能存在\(i\)使得\(X[a,i]>X[b,i]\)

同时还有\(k\)个限制,每个限制形如\((a,b,c)\)表示第\(a\)条路径的第\(b\)个点到第\(b+1\)个点必须朝着\(c\)方向走。

问方案数。

首先一条路径可以用一个二进制数来表示,那么一个暴力做法就是枚举上一个二进制数再枚举这一个,复杂度大概可以做到\(O(2^{2n})\)

考虑优化这个过程。注意到我们的合法情况是前一个的前缀和在任意时刻都不大于后一个的前缀和。

假设现在正在确定第\(i\)条路径,且前\(j-1\)位已经确定完毕并且和\(i-1\)的前\(j-1\)位相同,现在正在确定第\(j\)位。

如果这一位相同,过,没啥事。否则不同,根据前面的要求,只能是\(i-1\)的这一位是\(0\)\(i\)的这一位是\(1\)

那么我们找到\(i-1\)的下一个\(1\)的位置,把这个\(1\)推上来,推到\(j\)位置,强行和\(i\)的前\(j\)位相同,不难发现这样子处理完毕之后对于\(i\)而言,到下一个\(i-1\)存在\(1\)的位置之前,是没有任何影响的,因为这一位多了一个\(1\),而后面都是\(0\),所以怎么填都是合法的。于是我们就把这个状态的前\(j-1\)位转移到了\(j\)位了。

如果下一个\(1\)不存在,那么接下来\(i\)就可以任意走了。

那么就这样子直接\(dp\)就好了。

\(f[i][j][S]\)表示当前考虑到第\(i\)位,前\(j\)位和\(i-1\)的状态相同,\(i-1\)\(01\)状态是\(S\)的方案数。

转移的时候枚举这一位填什么,如果填\(0\)\(S\)这一位是\(1\)则不合法。如果两个相等则直接转移;否则按照前面说的减掉下一个\(1\)再转移。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MOD 1000000007
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,m,K,ans,Lim[22][22];
int f[2][22][1<<20],nxt[1<<20][22];
int main()
{n=read()-1;m=read();K=read();memset(Lim,-1,sizeof(Lim));for(int i=1;i<=K;++i){int a=read(),b=read();Lim[a][b-1]=read();}int S=1<<n;for(int i=0;i<S;++i){int v=-1;for(int j=n-1;~j;--j){if(i&(1<<j))v=j;nxt[i][j]=v;}}f[0][n][0]=1;for(int i=1,nw=1,pw=0;i<=m;++i,nw^=1,pw^=1){for(int j=0;j<S;++j)f[nw][0][j]=f[pw][n][j];memset(f[pw],0,sizeof(f[pw]));for(int j=0;j<n;++j)for(int k=0;k<S;++k)if(f[nw][j][k])for(int l=0;l<=1;++l){if((~Lim[i][j])&&l!=Lim[i][j])continue;int t=(k>>j)&1;if(l==0&&t==1)continue;if(l==t)add(f[nw][j+1][k],f[nw][j][k]);else{int p=nxt[k][j];if(p==-1)add(f[nw][j+1][k+(1<<j)],f[nw][j][k]);else add(f[nw][j+1][k+(1<<j)-(1<<p)],f[nw][j][k]);}}}for(int i=0;i<S;++i)add(ans,f[m&1][n][i]);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/11087851.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 6.2 安装教程

一、CentOS简介 CentOS是Linux的发行版之一&#xff0c;它安全、稳定、高效&#xff0c;是我最喜欢的Linux发行版之一。CentOS根据Red Hat Enterprise Linux开放源代码编译而成&#xff0c;与RedHat Linux并没有什么本质上的差别。但Red Hat Enterprise Linux是商业软件&#x…

浅入ICE组件编程

转载网页&#xff1a;http://blog.csdn.net/liuxuezong/article/details/26745041 一、ICE介绍 ICE是ZeroC公司开发的一款高效的开源中间件平台&#xff0c;全称是Internet Communications Engine。 它的主要设计目标是&#xff1a; • 提供适用于异种环境的面向对象中间件平台…

linux下编译jrtplib-3.9.1

网站&#xff1a;http://blog.csdn.net/caoshangpa/article/details/51416822 一、下载jrtplib、jthread、CMake jrtplib&#xff1a;http://research.edm.uhasselt.be/jori/jrtplib/jrtplib-3.9.1.zip jthread&#xff1a;http://research.edm.uhasselt.be/jori/jthread/jthre…

mysql从入门到精通之数据库基本概念理解

生活中的记账&#xff0c;帐&#xff1a;就是数据&#xff0c;或者简单理解为信息吧。记账&#xff1a;就是存储数据、信息生活中记账都是记在哪儿呢&#xff1f;比如&#xff1a;门上、墙上、日历上无论记在哪儿&#xff1f;特点&#xff1a;记录的都是信息&#xff0c;变化的…

windbg 常用命令详解

&#xfeff;&#xfeff;一、 1、 !address eax 查看对应内存页的属性 2、 vertarget 显示当前进程的大致信息 3 !peb 显示process Environment Block 4、 lmvm 可以查看任意一个dll的详细信息 例如&#xff1a;我们查看cyusb.sys的信息 5.reload !sym 加载符号文件 6…

JS 与Flex交互:html中的js 与flex中的actionScript通信

Flex与JavaScript交互的问题&#xff0c;这里和大家分享一下&#xff0c;主要包括Flex调用JavaScript中的函数和JavaScript调用Flex中的函数两大部分内容。 Flex 与JavaScript 交互&#xff0c;主要依靠Flex的ExternalInterface&#xff0c;其提供了addCallBack和call方法。 一…

poj3615

floyd水题&#xff0c;将map[i][j]理解为从i到j的路径中高度最小即可&#xff0c;将松弛条件改为map[i][j]MIN(map[i][j],MAX(map[i][k],map[k][j]));好好理解一下吧 View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MAXN 310 4 #define INF (1&…

H264码流打包分析(精华)

网页&#xff1a;https://www.cnblogs.com/lidabo/p/4602422.htmlH264码流打包分析SODB 数据比特串&#xff0d;&#xff0d;&#xff1e;最原始的编码数据RBSP 原始字节序列载荷&#xff0d;&#xff0d;&#xff1e;在SODB的后面填加了结尾比特&#xff08;RBSP trailing b…

postman安装和简单使用

postman 模拟向接口发送请求&#xff0c;测试接口 下载 https://www.getpostman.com/downloads/ 使用 朝地址发请求&#xff0c;拿到json格式的数据 想看的层次更分明可以上网搜json 给后端发送数据 转载于:https://www.cnblogs.com/zhengyuli/p/11117632.html

QC使用流程(1)之安装篇

1、准备环境 1.1、安装操作系统 本次教程使用的操作系统是Windows Server 2003&#xff0c;安装在虚拟机6.5上。 1.2、安装数据库 本次教程使用的数据库是Microsoft SQL Server 2000 简体中文企业版 SP4升级补丁 具体安装步骤如下&#xff1a; 1)、打开数据库安装程序&#xff…

Java连载1-概述常用的dos命令

本想写完那两个再开始新的&#xff0c;然而客观条件不允许&#xff0c;之前从未接触过Java&#xff0c;从零开始吧​&#xff01;&#xff01;&#xff01; 一、概述 C盘下​&#xff1a;programme file 一般为64位程序安装的目录&#xff0c;programme file&#xff08;X86&am…

SQL 查询--日期条件(今日、昨日、本周、本月。。。) (转)

主要用到sql 函数 DATEDIFF(datepart,startdate,enddate) sql 语句&#xff0c;设 有 数据库表 tableA&#xff08;日期字段ddate&#xff09; ——查询 今日 select * from tableA where DateDiff(dd,VoucherDate,getdate()) 0 ——查询 昨日 select * from tableA where …

SRTP参数及数据包处理过程

http://www.rosoo.net/a/201606/17449.html 原链接 目录 1. 相关参数介绍... 1 1.1 SRTP. 1 1.1.1 两种Key. 1 1.1.2 与传输无关的参数... 1 1.1.3 SRTP流相关参数... 2 1.2 SRTCP. 2 1.3 …

【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3

2.1.1 IoC是什么 Ioc—Inversion of Control&#xff0c;即“控制反转”&#xff0c;不是什么技术&#xff0c;而是一种设计思想。在Java开发中&#xff0c;Ioc意味着将你设计好的对象交给容器控制&#xff0c;而不是传统的在你的对象内部直接控制。如何理解好Ioc呢&#xff1…

排队 题解 组合数学+高精度

因为实在是写不动了&#xff0c;所以菜鸡颓博客为了信奥发展的伟大未来作出一点小小的贡献 题目描述 某中学有 n 名男同学&#xff0c;m 名女同学和两名老师要排队参加体检。他们排成一条直线&#xff0c;并且任意两名女同学不能相邻&#xff0c;两名老师也不能相邻&#xff0c…

在window下搭建TensorFlow

网站&#xff1a;https://blog.csdn.net/chduguxue/article/details/793922201.首先查看TensorFlow目前对Windows支持的python版本要求 https://pypi.python.org/pypi/tensorflow/1.1.0rc2截止本文2018年2月27日&#xff0c;要求python是3.5&#xff0c;操作系统64位 如果pytho…

广播、组播、点播的区别

原网站:https://blog.csdn.net/z502521809/article/details/53007932 今天学习的时候发现了广播、组播、点播这三个用来描述网络节点之间通讯方式的术语&#xff0c;那么这几种“播”到底有什么区别&#xff1f;于是乎百度总结了一下。 ----------------------------------点播…

Arm架构下VUE环境的安装

最近因为项目需要在arm环境下搭建vue环境&#xff0c;网上有基于Linux的 教程&#xff0c;路径略有不同&#xff0c;现整理如下 1、安装文件下载 1、下载地址&#xff1a;http://nodejs.cn/download/ 2、选择一个合适的版本下载 2、安装步骤 1、将安装包上传到指定位置(我习惯放…

网络安全技术之端口隔离

端口隔离技术是一种实现在客户端的端口间的足够的隔离度以保证一个客户端不会收到另外一个客户端的流量的技术。通过端口隔离技术&#xff0c;用户可以将需要进行控制的端口加入到一个隔离组中&#xff0c;实现隔离组中的端口之间二层、三层数据的隔离&#xff0c;既增强了网络…

python解释器、pycharm安装及环境变量配置

python解释器、pycharm安装及环境变量配置 1.python解释器安装 下载地址&#xff1a;https://www.python.org/ 打开官网&#xff0c;点击downloads,选择操作系统&#xff0c;以windows为例&#xff1a; 选择python2与python3解释器版本&#xff08;以python3.6.6及python2.7.16…