题面

题解:

T1:

先对图进行染色,重新对联通快重新建图

根据四色定理,珂以得出这实际是一颗树

因为树的中心肯定是最佳的决策,所以答案就是树的直径/2(上取整)

#include <bits/stdc++.h>
#define N 1005
using namespace std;
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline int Min(register int a,register int b)
{
return a<b?a:b;
}
inline int Max(register int a,register int b)
{
return a>b?a:b;
}
int n,m,ma[N][N],cnt=0;
int a[]={-1,-1,-1,0,0,1,1,1},b[]={-1,0,1,-1,1,-1,0,1};
int c[N][N];
bool vis[N][N];
inline void dfs(register int x,register int y,register int col)
{
if(x<1||y<1||x>n||y>m)
return;
c[x][y]=col;
for(register int i=0;i<8;++i)
if(ma[x][y]==ma[x+a[i]][y+b[i]]&&!c[x+a[i]][y+b[i]])
dfs(x+a[i],y+b[i],col);
}
struct edgee{
int to,next;
}e[(N*N)<<1];
int head[N*N],tot=0;
inline void add(register int u,register int v)
{
e[++tot]=(edgee){v,head[u]};
head[u]=tot;
}
struct node{
int X,Y;
node(int x,int y){
X=Min(x,y);
Y=Max(x,y);
}
friend bool operator<(node x,node y){
if(x.X!=y.X){
return x.X<y.X;
}
return x.Y<y.Y;
}
};
set<node> ed;
inline void dfs2(register int x,register int y)
{
if(x<1||y<1||x>n||y>m)
return;
vis[x][y]=true;
for(register int i=0;i<8;++i)
if(c[x][y]==c[x+a[i]][y+b[i]]&&!vis[x+a[i]][y+b[i]])
dfs2(x+a[i],y+b[i]);
else if(c[x][y]!=c[x+a[i]][y+b[i]]&&c[x+a[i]][y+b[i]]!=0)
ed.insert(node(c[x][y],c[x+a[i]][y+b[i]]));
}
int maxv,maxi,dis[N*N];
inline void dfs3(register int x,register int fa){
dis[x]=dis[fa]+1;
for(register int i=head[x];i;i=e[i].next)
if(e[i].to!=fa)
dfs3(e[i].to,x);
}
int main()
{
freopen("paint.in","r",stdin);
freopen("paint.out","w",stdout);
int T=read();
while(T--)
{
ed.clear();
cnt=0,tot=0;
memset(head,0,sizeof(head));
n=read(),m=read();
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
{
char ch=getchar();
while(ch!='0'&&ch!='1')
ch=getchar();
ma[i][j]=ch=='0'?0:1;
}
memset(c,0,sizeof(c));
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
if(!c[i][j])
dfs(i,j,++cnt);
memset(vis,false,sizeof(vis));
for(register int i=1;i<=n;++i)
for(register int j=1;j<=m;++j)
if(!vis[i][j])
dfs2(i,j);
set<node>::iterator iter;
for(iter=ed.begin();iter!=ed.end();++iter)
{
node ii=*iter;
int jj=ii.X,kk=ii.Y;
add(jj,kk),add(kk,jj);
}
dis[0]=-1;
dfs3(1,0);
maxv=maxi=0;
for(register int i=2;i<=cnt;++i)
if(dis[i]>maxv)
{
maxi=i;
maxv=dis[i];
}
dfs3(maxi,0);
maxv=0;
for(register int i=1;i<=cnt;++i)
if(dis[i]>maxv)
maxv=dis[i];
write((maxv+1)>>1),puts("");
}
return 0;
}

T2:

神仙题目qaq,学不会啊

官方题解:

首先,如果在某一个时刻,排在左边的人和右边的人之间还有鸽子的话,左边的人一定会先取完两人之间的鸽子。设f[i]为当最后一只鸽子上的数是i时,小X的得分,那么当n=1时,显然f[i]=i。我们从后往前考虑后k只鸽子,每次我们在最左端加入一只鸽子k时,先手的第一步决策只会有两种:

1. 走到新加入的鸽子上。那么原来的先手就变成了后手,先手的得分就是a[k]-f[i];

2. 不走到新加入的鸽子上。那么先手的决策应该和原来相同,先手的得分就是f[i]-a[k]。

因此,每当我们在最左端加入一只鸽子k时,f[i]会变为max(a[k]-f[i],f[i]-a[k]),即减去a[k]后取绝对值。因此,原问题就变成了这样一个问题:

最初你有一个一次函数f[i]=i,你会进行若干次操作,每次将函数向下平移若干单位后取绝对值,然后询问这个函数在某个点的值。

考虑第一次操作,你会将一个一次函数向下平移x格,然后取绝对值,可以发现f[i]=f[2*k-i],也就是之后的函数关于x对称,且对称轴右边依然是一个一次函数f[i]=i-x。因此只要继续计算x及以后的位置上的函数值,x以前的函数值可以根据后面的直接算出。求出f[0]-f[∑a[i]],大于∑a[i]的询问直接回答即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200005,M=2000005;
int read(){
int f=1,g=0;
char ch=getchar();
for (;!isdigit(ch);ch=getchar()) if (ch=='-') f=-1;
for (;isdigit(ch);ch=getchar()) g=g*10+ch-'0';
return f*g;
}
int n,m,a[N],sum,f[M*2];
void build(int l,int r,int x){
if (!x){
for (int i=l;i<=r;i++)
f[i]=i-l;
return;
}
int mid=l+a[x];
build(mid,r,x-1);
for (int i=l;i<mid;i++)
f[i]=f[mid+mid-i];
}
int main(){
freopen("pigeon.in","r",stdin);
freopen("pigeon.out","w",stdout);
n=read();
for (int i=1;i<n;i++) {a[i]=read();sum+=a[i];}
build(0,2*sum,n-1);
m=read();
while (m--){
int x=read();
if (x>sum) printf("%d ",x-sum);
else printf("%d ",f[x]);
}
printf("\n");
return 0;
}

T3:

考的是卡特兰数,可惜我不会通项公式

首先,设f[i]为拥有i个节点的不同形态二叉树数量,g[i]为拥有i个节点的所有不同形态二叉树的叶子节点数量和,那么答案就是要求\(\frac{g[n]}{f[n]}\) 。通过打表可以发现一个结论,g[n]=f[n-1]*n,证明如下:

1、对于每棵n个点的二叉树,如果里面有k个叶节点,那么我们分别把这k个叶子删去会得到k棵n-1个点的二叉树,也就是所有n个节点的二叉树中的每个叶子都唯一对应一棵n-1个节点的二叉树;

2、对于每棵n-1个点的二叉树,有n个位置可以接上一个新的叶子节点,所以每棵n-1个节点的二叉树都对应(所有n个节点的二叉树中的所有叶子中的)n个叶子。

因此,答案就是 \(\frac{f[n-1]*n}{f[n]}\)。其中f[n]表示的是n个节点的不同形态二叉树数量,也就是卡特兰数,其通项公式为\(\frac{C_n^{2n}}{n+1}\) ,化简得答案为\(\frac{n^2+n}{4n-2}\) 。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll p=2148473647;
ll qpow(ll x,ll k){
ll t=1;
for (;k;k>>=1){
if (k&1) t=t*x%p;
x=x*x%p;
}
return t;
}
ll n;
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%lld",&n);
printf("%lld\n",n*(n+1)/2%p*qpow((n*2-1)%p,p-2)%p);
return 0;
}

还是太菜了啊~

T1xjb写了个以为是暴力的正解,t2博弈搜索写挂,t3卡特兰数也写挂了qaq

真是菜啊

深深地感受到自己的弱小~

【题解】JSOIWC2019 Round3的更多相关文章

  1. 【题解】JSOIWC2019 Round 5

    题面: 题解: T1: 算法1: 枚举每个灯塔的方向,并分别判断是否有解.时间复杂度O(K*4^K). 预计得分:50-70分 算法2: 不难发现,当k≥4的时候一定有解,将最靠左的两个下面的朝右上. ...

  2. 【题解】JSOIWC2019 Round4

    题面: https://files-cdn.cnblogs.com/files/yzhang-rp-inf/P13.gif https://files-cdn.cnblogs.com/files/yz ...

  3. 【题解】JSOIWC2019 Round2

    题面: 题解: T1: 毕竟是tg膜你,不会太难 就是一道简单贪心 首先,对于a<=b的所有物品,一定是贪心的按照a从小到大放入. 先假设剩下的物品可以按照某种顺序放进去,那么可以得到一个最终空 ...

  4. 【题解】JSOIWC2019 Round1

    题面(T1变成5s(毒瘤出题人发现std超时了qaq)): 啥都不会qaq.但也送了不少分 题解: T1: 当T=0时直接异或前缀和,但T=1时就有点恶心 暴力能有80pts(防止大家爆零) 还珂以用 ...

  5. 【ContestHunter】【弱省胡策】【Round3】(C)

    容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...

  6. JSOIWC2019游记

    世除我WC...都去广二了qaq,就我还在nj ycs至少也去了pkuwc啊 这个JSOIWC2019的内容看起来很水,进入条件简单,但窝啥都不会,肯定垫底 内容清单: 1.26 上午听机房dalao ...

  7. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  8. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  9. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

随机推荐

  1. react ref获取dom对象

    react文档 step = React.createRef(); // init <div ref={this.step}></div> // bind componentD ...

  2. Nestjs 链接mysql

    文档 下插件 λ yarn add @nestjs/typeorm typeorm mysql 创建 cats模块, 控制器,service λ nest g mo cats λ nest g co ...

  3. filter的知识点 和 实例

    一.过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目    标资源访问前后进行逻辑处理 2.快速入门 步骤: 1)编写一个 ...

  4. eclipse解决js提示

    自学js,发现eclipse中不管js文件.html文件.jsp文件没有都没js代码的提示,对于js代码也不报错,有时候就因为单词敲错却查了很久没查出来,很烦很难受. 在网上找了很多方法,都没有解决, ...

  5. 做二级菜单时候遇到的关于事件冒泡以及mouseover和mouseenter的不同

    二级菜单作为最普通小组件,我遇到了坑. <style> .wrapper { height: 150px; border: 1px solid; width: 150px; } .wrap ...

  6. js读取解析JSON类型数据【申明:来源于网络】

    js读取解析JSON类型数据[申明:来源于网络] 地址:http://blog.csdn.net/sunhuaqiang1/article/details/47026841

  7. ZOJ 4067 - Books - [贪心][2018 ACM-ICPC Asia Qingdao Regional Problem J]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4067 题意: 给出 $n$ 本书(编号 $1 \sim n$), ...

  8. [No0000199]设计模式总结

    设计模式之间的关系: 设计模式总概况: 一.设计原则 .单一职责原则 一个类,只有一个引起它变化的原因.应该只有一个职责.每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一 ...

  9. spark streaming集成kafka

    Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Clouder ...

  10. orange---openresty.

    需要有一个类似于API网关的中间件来做API的管理工作,也就是API的实现方面更多的考虑业务逻辑,安全.性能.监控可以交由网关来做(如下图所示,下图根据Kong官方文档修改) 通过MySQL存储来简单 ...