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,一经查实,立即删除!

相关文章

PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用

在使用PowerDesigner对数据库进行概念模型和物理模型设计时&#xff0c;一般在NAME或Comment中写中文&#xff0c;在Code中写英文。Name用来显 示&#xff0c;Code在代码中使用&#xff0c;但Comment中的文字会保存到数据库Table或Column的Comment中&#xff0c;当Name已经存在…

CentOS 6.2 安装教程

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

python-day2

7.字符串操作 capitalize&#xff1a;首字母大写 upper&#xff1a;全大写 lower&#xff1a;全小写 swapcase&#xff1a;大小写翻转 center&#xff1a;居中&#xff0c;空白填充 8.列表的操作 增删改查 增&#xff1a;append\extend 删&#xff1a;pop默认删除最后一位&…

浅入ICE组件编程

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

好久没有写了,今天就谈谈微信吧!

微信&#xff0c;也算是13年内比较火的东西了&#xff0c;就功能性而言&#xff0c;它的确是一个颠覆性的产品&#xff0c;大家可以想想看&#xff0c;如果你把微信一直运行在手机后台&#xff0c;有人给你语音留言&#xff0c;收到后是一段提醒铃声&#xff0c;这个不是带打电…

去哪儿对垒携程 在线旅游静悄悄的革命

出处&#xff1a;21世纪经济报道 时间&#xff1a;2011-05-11 10:38【 字体&#xff1a; 大 中 小 】 【打印此页】 【关闭】 颠覆与被颠覆的游戏&#xff0c;正于在线旅游市场悄然演绎。 5月10日&#xff0c;携程收报48.3美元&#xff0c;市值71.42亿美元&#xff0c;在赴美上…

Mybatis一级缓存和二级缓存 Redis缓存

一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期&#xff0c;在同一个SqlSession中查询时&#xff0c;Mybatis会把执行的方法和参数通过算法生成缓存的键值&#xff0c;将键值和查询结果存入一个Map对象中。如果同一个SqlSession中执行的方法和参数完全一致&#xff0c;…

关于数据库查询优化的思考

举一个例子&#xff0c;我现在有一些新闻信息&#xff0c;它包括这些字段&#xff1b;新闻ID&#xff0c;新闻Name&#xff0c;新闻ShortIntro&#xff0c;新闻Detail&#xff0c;新闻PublishTime。我现在要把它存放在数据库中&#xff0c;然后从数据库中将其取出来放在GridVie…

mysql添加远程登陆权限及mysql远程连接命令

mysql添加远程登陆权限及mysql远程连接命令 1、mysql使用本身环境下面mysql数据库中的user表来管理用户及权限 mysql> use mysql;Database changedmysql> select user,host from user;-----------------| user | host |-----------------| root | 127.0.0.1 || …

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…

【链接】Solr的Filed中indexed与stored属性

Solr的Filed中indexed与stored属性转载于:https://www.cnblogs.com/xiaostudy/p/11105554.html

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

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

Eclipse WTP 使用入门

什么是WTP&#xff1f;WTP (Web Tools Platform) 是一个开发J2EE Web应用程序的工具集。用了太长时间的MyEclipse难免想换换口味&#xff0c;引用一段官方的描述来介绍WTP:The Eclipse Web Tools Platform (WTP) project extends the Eclipse platform with tools for developi…

linux uuid/uuid.h

我的错误信息 ...... global1.cpp:39:23: uuid/uuid.h: No such file or directory global1.cpp: In static member function static QUuid Global::generateUuid(): global1.cpp:188: ::uuid_generate undeclared (first use here) make[1]: *** [.obj/linux-generic-g//globa…

__int64

如果要处理很大的数据&#xff0c;long long这类数据类型也不管用&#xff0c;这时就要用到__int64&#xff0c;输出格式是在原有的格式前加入I64如%I64d转载于:https://www.cnblogs.com/ssNiper/p/11109100.html

Js控制弹窗实现在任意分辨率下居中显示

弹窗居中比较烦人的是怎么才能在任意分辨率下实现居中显示。1&#xff0c;html部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www…

兼容IE与firefox的css 线性渐变(linear-gradient)

IE系列 filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr#FF0000,endColorStr#F9F900,gradientType0);参数&#xff1a;startColorStr起始颜色 endColorStr结束颜色 gradientType为0时代表垂直&#xff0c;为1时代表水平 Firefox background: -moz-linear-gr…

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&…