纪中2018暑假培训day3提高a组改题记录(混有部分b组)
day3
模拟赛,看了看a组题,发现是博弈论,非常开心(因为好玩),于是做的a组。结果差点爆零,死命纠结t1的sg函数,但其实只是一个dp,不用扯到sg函数的那种。
t1:
Description
该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x+K]区间的整数,游戏按顺时针方向进行。每只动物报的数字都不能超过M。若一只动物报了M这个数,它所在的种族就输了。问以第i只动物为游戏的开始,最后哪种动物会赢?
Input
接下来一行N个正整数,分别表示N只动物的种类,以顺时针的方向给出。0代表羊,1代表狼。
Output
就是dp,f[i][j]表示第i个动物报数最大为j是否必胜。然后加一个后缀和(应该能叫后缀和吧)(或者说区间和?)优化。
中间还wa了一次,因为在处理s数组时减去的那个f数组越界了,需要特判一下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,kk;
int f[10010][5010],a[10010],s[10010][5010];
int main()
{
freopen("vode.in","r",stdin);
freopen("vode.out","w",stdout);
scanf("%d%d%d",&n,&m,&kk);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int p=1;
for(int i=n+1;i<=n+m;i++)
{
if(p>n)
p=1;
a[i]=a[p];
p++;
}
for(int i=n+m-1;i>=1;i--)
for(int j=m-1;j>=1;j--)
{
if(a[i]==a[i+1])
{
s[i][j]=s[i][j+1];
if(j+kk<m)
s[i][j]-=f[i][j+kk];
if(s[i+1][j+1]>0)
{
f[i][j]=1;
s[i][j]++;
}
}
else
{
s[i][j]=s[i][j+1];
if(j+kk<m)
s[i][j]-=f[i][j+kk];
if(s[i+1][j+1]==0)
{
f[i][j]=1;
s[i][j]++;
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=kk;j++)
if(f[i][j])
{
printf("%d ",a[i]);
break;
}
else if(j==kk)
{
printf("%d ",a[i]^1);
}
fclose(stdin);
fclose(stdout);
return 0;
}
不想改a组了,先写了一个b组t3玩。
Description
对于一个正整数N,存在一个正整数T(0<T<N),使得
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABECAYAAADZeIbjAAADRUlEQVR4nO2aMXKjMBSGf3ZyFG8KT04AJ7DduHKbTpROs11Kd2lwmXRpt6IJnMA+gceF4S5ayQYvBqEgGYF24ZuRCzPw+JH03pP0HMrAAPnR9wv0xSh8aNgnPPbhOA782KwZi4Sn2HoOnPlHJ9YsEj7BekdBkwBuB9YsEt4to/ChMQofGqPwoVEVnm7hscyJZ0+Ot2VpRfmyd7mWNdMZVj0x/MJ7iJuHbVlADq0jIny5SklUc80NaFJ7sx4RwdnmtclslN4hCVx2D6F/XzeiRHJ/rfCIuNR1xca5EeEH6ZCIFEUmNKi8a0SDoL5raoSzBwVR1usuvb2fGykatQHWu2yEuBKhZcTOLf3CET+B2RIEe7y8FSdywq5N+VV7iEPwpc3T46TxLWLhCTBd8IfM8IuNIXyEuEpnRg6rBZqbME96OrBfguWs+T1C4XF4RP7xJutX9sgPbDL3mJ6A1cIq2fj6vWczUm0UCoSnON0M5RmWbALtX95Yr3MjQN2Iiv3vwosDrza+6MKmHtetOgorsz4JKCk7Cfafew5tzIm07M4BNG5CZGFXQrXHk2O1SycLrPhUn89xmLbr1uglsjRqInTmd264gCRUCUNb31zCGDRG4VX4JfPJh5VIIPsopP1sTY8sYSlNBRX9Dv+5Y6T+s4yrMzvItpiv4c+HqcWfRcK56GfgM/fi0TlxmpsSb8j7qBMFVYea5Q8qi4+m2NPjszXW5dRr8ognQ+bsEV6La2RtYHc44weI4RL0XTUt+56H1p/YGszZbYBo175ojrXCY597+B3MyLZUON/JDZc7vBtc9lvn3LjoZ3yiOK3TrV+/TaxL6wHyDm4XSg23mTWxRnhlT73QTCQwdoczg1g3x7vi7NX5Suh/pzywH0R/DoHBDvVR+NAYhTei82qJO6seZGilPV1VS9xZ9SBDa6jH4QEuP1LaCHr9dAB5XbdyjByHfD2eP0t8KjrVPbJW/1Z9VUuoVz3IUO/xvqolNKoeZKgL76laQvtUtAZl4f1US+hVPchQFN5XtYRm1YMMJY/QcbXEFc2qBxlqPd5xtURO2/P7TPNv1Fe1hH7Vg4xGwvuplri/6kHGuOc2NEbhQ2MUPjRG4UPjD4ped/B8yB0SAAAAAElFTkSuQmCC" alt=" " />
的值是正整数。
小X给出N,让小Y给出所有可能的T。如果小Y不回答这个神奇的大佬的简单数学题,他学神的形象就会支离破碎。所以小Y求你帮他回答小X的问题。
Input
Output
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABECAYAAADZeIbjAAADRUlEQVR4nO2aMXKjMBSGf3ZyFG8KT04AJ7DduHKbTpROs11Kd2lwmXRpt6IJnMA+gceF4S5ayQYvBqEgGYF24ZuRCzPw+JH03pP0HMrAAPnR9wv0xSh8aNgnPPbhOA782KwZi4Sn2HoOnPlHJ9YsEj7BekdBkwBuB9YsEt4to/ChMQofGqPwoVEVnm7hscyJZ0+Ot2VpRfmyd7mWNdMZVj0x/MJ7iJuHbVlADq0jIny5SklUc80NaFJ7sx4RwdnmtclslN4hCVx2D6F/XzeiRHJ/rfCIuNR1xca5EeEH6ZCIFEUmNKi8a0SDoL5raoSzBwVR1usuvb2fGykatQHWu2yEuBKhZcTOLf3CET+B2RIEe7y8FSdywq5N+VV7iEPwpc3T46TxLWLhCTBd8IfM8IuNIXyEuEpnRg6rBZqbME96OrBfguWs+T1C4XF4RP7xJutX9sgPbDL3mJ6A1cIq2fj6vWczUm0UCoSnON0M5RmWbALtX95Yr3MjQN2Iiv3vwosDrza+6MKmHtetOgorsz4JKCk7Cfafew5tzIm07M4BNG5CZGFXQrXHk2O1SycLrPhUn89xmLbr1uglsjRqInTmd264gCRUCUNb31zCGDRG4VX4JfPJh5VIIPsopP1sTY8sYSlNBRX9Dv+5Y6T+s4yrMzvItpiv4c+HqcWfRcK56GfgM/fi0TlxmpsSb8j7qBMFVYea5Q8qi4+m2NPjszXW5dRr8ognQ+bsEV6La2RtYHc44weI4RL0XTUt+56H1p/YGszZbYBo175ojrXCY597+B3MyLZUON/JDZc7vBtc9lvn3LjoZ3yiOK3TrV+/TaxL6wHyDm4XSg23mTWxRnhlT73QTCQwdoczg1g3x7vi7NX5Suh/pzywH0R/DoHBDvVR+NAYhTei82qJO6seZGilPV1VS9xZ9SBDa6jH4QEuP1LaCHr9dAB5XbdyjByHfD2eP0t8KjrVPbJW/1Z9VUuoVz3IUO/xvqolNKoeZKgL76laQvtUtAZl4f1US+hVPchQFN5XtYRm1YMMJY/QcbXEFc2qBxlqPd5xtURO2/P7TPNv1Fe1hH7Vg4xGwvuplri/6kHGuOc2NEbhQ2MUPjRG4UPjD4ped/B8yB0SAAAAAElFTkSuQmCC" alt=" " />
是整数。
后面是M个数,每一个数代表可能的正整数T(按从小到大的顺序排列)。
就是把式子化简一下,设比值为k,然后会发现T=(2K-2)/(2K-1)*N,我们要让t为正整数,同时(2K-2)/(2K-1)又不能为一,2k-1就一定为n的因子。k为正整数,所以2k-1为奇数,然后就可以n½枚举找n的奇因子了。注意一下2k-2不能为零,也就是2k-1不能为1。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,a[1000010],cnt;
int main()
{
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
scanf("%lld",&n);
long long sn=sqrt(n);
for(long long i=1;i<=sn;i++)
if(!(n%i))
{
if((i%2)&&i!=1)
a[++cnt]=(n/i)*(i-1);
if((n/i)%2&&(n/i)!=1)
a[++cnt]=i*(n/i-1);
}
cout<<cnt<<" ";
sort(a+1,a+1+cnt);
for(int i=1;i<=cnt;i++)
printf("%lld ",a[i]);
fclose(stdin);
fclose(stdout);
return 0;
}
然后我终于改了a组t2:
Description
墙:用#表示,墙有4个面,分别是前面,后面,左面,右面。
起点:用C表示,为主角的起点,是一片空地。
终点:用F表示,为主角的目的地,是一片空地。
空地:用 . 表示。
其中除了墙不能穿过,其他地方都能走。
主角有以下3种操作:
1.移动到相邻的前后左右的地方,花费一个单位时间。
2.向前后左右其中一个方向发射子弹,子弹沿直线穿过,打在最近的一堵墙的一面,然后墙的这面就会形成一个开口通往秘密通道。同一时间最多只能有两个开口,若出现有3个开口,出现时间最早的开口会立即消失。该操作不用时间。
3.可以从一个与开口相邻的空地跳进去,进入秘密通道,从另外一个开口正对的空地跳出来。这个过程花费一个单位时间。
地图四周都是墙,问主角最少用多少时间从C走到F。C和F
只会出现一次。
Input
接下来n行,每行m个字符描述地图。
Output
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,s,t,cnt,head[250010],dis[250010],vis[250010];
char mp[510][510];
struct Edge
{
int v,nxt,val;
}e[10000010];
void add(int u,int v,int val)
{
e[++cnt].v=v;
e[cnt].nxt=head[u];
e[cnt].val=val;
head[u]=cnt;
}
int num(int x,int y)
{
return (x-1)*m+y;
}
void spfa()
{
memset(dis,0x3f3f3f3f,sizeof(dis));
queue<int>q;
dis[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(dis[v]>dis[u]+e[i].val)
{
dis[v]=dis[u]+e[i].val;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
}
int main()
{
freopen("portal.in","r",stdin);
freopen("portal.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
if(mp[i][j]=='C')
s=num(i,j);
else if(mp[i][j]=='F')
t=num(i,j);
}
for(int i=2;i<n;i++)
for(int j=2;j<m;j++)
if(mp[i][j]!='#')
{
int x1=i,x2=i,y1=j,y2=j;
int mindis=0x3f3f3f3f;
while(mp[x1+1][j]!='#')
x1++;
while(mp[x2-1][j]!='#')
x2--;
while(mp[i][y1+1]!='#')
y1++;
while(mp[i][y2-1]!='#')
y2--;
mindis=min(x1-i,min(i-x2,min(y1-j,j-y2)));
mindis++;
add(num(i,j),num(x1,j),mindis);
add(num(i,j),num(x2,j),mindis);
add(num(i,j),num(i,y1),mindis);
add(num(i,j),num(i,y2),mindis);
if(mp[i+1][j]!='#')
add(num(i,j),num(i+1,j),1);
if(mp[i-1][j]!='#')
add(num(i,j),num(i-1,j),1);
if(mp[i][j+1]!='#')
add(num(i,j),num(i,j+1),1);
if(mp[i][j-1]!='#')
add(num(i,j),num(i,j-1),1);
}
spfa();
if(dis[t]==0x3f3f3f3f)
cout<<"nemoguce";
else
cout<<dis[t];
fclose(stdin);
fclose(stdout);
return 0;
}
其实题目不是不可做,就是考试死活想不到正路上......dalao炒鸡多啊我的天,orz。
然而我还是改完了t3:
Description
Input
接下来q行,每行两个正整数x,y,表示询问城市x和城市y最早什么时候连通。
Output
并查集,按秩合并,把时间赋为点权(我之前纠结了半天怎么连边权2333),在并查集树上找max点权就行。
re了好几次,最后发现freopen文件名打错了......
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,q,fa[100010],dep[100010],siz[100010],tim[100010],x,y;
int find_fa(int x)
{
if(fa[x]==x)
return x;
return find_fa(fa[x]);
}
void update(int x)
{
if(fa[x]==x)
return;
update(fa[x]);
dep[x]=dep[fa[x]]+1;
}
int query(int a,int b)
{
int res=0;
if(dep[a]<dep[b])
swap(a,b);
while(dep[a]>dep[b])
{
res=max(res,tim[a]);
a=fa[a];
}
while(a!=b)
{
res=max(res,max(tim[a],tim[b]));
a=fa[a];
b=fa[b];
}
return res;
}
int main()
{
freopen("pictionary.in","r",stdin);
freopen("pictionary.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
fa[i]=i,siz[i]=1;
for(int i=1;i<=m;i++)
{
int r=n/(m-i+1);
int p=m-i+1;
for(int j=2;j<=r;j++)
{
int f1=find_fa(p*(j-1));
int f2=find_fa(p*j);
if(f1!=f2)
{
if(siz[f1]<siz[f2])
swap(f1,f2);
fa[f2]=f1;
tim[f2]=i;
siz[f1]=max(siz[f1],siz[f2]+1);
}
}
}
for(int i=1;i<=n;i++)
update(i);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
fclose(stdin);
fclose(stdout);
return 0;
}
纪中2018暑假培训day3提高a组改题记录(混有部分b组)的更多相关文章
- 纪中2018暑假培训day5提高b组改题记录
因为今天省选组也做a组,以为今天a组会很难,就做了做b组.t1和t3强行暴力,好在有t2保底.t1和正解就差一点,然而考试时死活想不起来...... 今天改题可以少改一道了!ovo 救救孩子吧!t1T ...
- 纪中2018暑假培训day7提高b组改题记录
由于今天太颓了,所以没有解释 t1: Description 码零鼠是一只很喜欢mx数学的神犇,上面那个不是ta本人的样子.这天,ta在研究一个神奇的数列,这个数列是这样的:a0 = 1an = ai ...
- 纪中2018暑假培训day1提高b组改题记录
收到意见,认为每天的程序和随笔放在一起写的博客太长了,于是分开整理 day1 模拟赛,看了看提高a组t1的样例就不太想写,于是转而写b组 t1: Description 给定一个n个点m条边的有向图, ...
- $NOIp$提高组做题记录
对了我在这里必须讲一个非常重要的事情,就是前天也就是$2019.8.21$的傍晚,我决定重新做人了$!!$ 其实之前没怎么做$Noip$题,那就从现在开始叭
- 纪中集训2020.02.05【NOIP提高组】模拟B 组总结反思——【佛山市选2010】组合数计算,生成字符串 PPMM
目录 JZOJ2290. [佛山市选2010]组合数计算 比赛时 之后 JZOJ2291. [佛山市选2010]生成字符串 比赛时 之后 JZOJ2292. PPMM 比赛时 之后 JZOJ2290. ...
- 纪中集训总结 && 新学期目标
于是紧接着又发了第二篇. 关于这次去完纪中以后的感想,写完后总觉得少了些什么,因此就发一篇小目标集合来凑数补充一下吧. Part I:图论 这方面我去之前就是很有自信,事实证明像基础的最短路.生成树什 ...
- 纪中集训 Day 2
今天(其实是昨天= =)早上起来发现好冷好冷啊= = 吃完饭就准备比赛了,好吧B组难度的题总有一道不知到怎么写QAQ 太弱了啊!!! 蒟蒻没人权啊QAQ 今天第4题不会写,在这里说说吧 题目的意思就是 ...
- 纪中集训 Day1
今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...
- 纪中集训 Day 0?
好吧昨天的等到今天才来写,现在超不想刷题,来写下blog吧= = 坐了近10H的火车终于来到了中山市 火车上在看空之境界,等有时间补下动画吧= = 到了宿舍各种不习惯(现在才发现还是母校好QAQ)然后 ...
随机推荐
- spring IOC源码分析(ApplicationContext)
在上一篇文章中,我们以BeanFactory这条主线进行IOC的源码解析的,这里,将以ApplicationContext这条线进行分析.先看使用方法: @Test public void testA ...
- Vagrant系列(二)----Vagrant的配置文件Vagrantfile详解
一.简介 在我们的工作目录下有一个Vagrantfile文件,里面包含有大量的配置信息,通过它可以定义虚拟机的各种配置,如网络.内存.主机名等,主要包括三个方面的配置,虚拟机的配置.SSH配置.Vag ...
- 批量处理word所有回车行
在WORD中点击CTRL+H,弹出对话框,输入如下替换符
- php7函数,声明,返回值等新特性介绍
使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. functi ...
- python(Django之组合搜索、JSONP、XSS过滤 )
一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...
- JQ查找到带有某个字符,并起类名,然后替换这个某个字符
<script> setTimeout("asdasd()",1000); //定时器是为了防止其他JS影响到它,可以不加 function asdasd() { $( ...
- 如何强制关闭LODOP或c-lodop已经弹出的预览窗口
该文介绍一下LODOP和C-LODOP关于窗口的弹出,和如何强制关闭已经打开的预览窗口. 同一个页面,只能弹出一个窗口,lodop是禁止点击动作,而c-lodop会提示已有窗口开的,请关闭之类的默认提 ...
- How to gitignore
git rm -r --cached . git add . git commit -m "remove gitignore cache" git push
- Deepfakes:AI换脸技术自制明星XX片
ps:亮瞎狗眼 去年开始就在国外网站上比较火的项目了,通过Deepfakes技术可以将视频中的人脸换成自己喜欢的明星, 当时就有不少人制作了换脸视频,其中大部分是替换了XX片的女主角. 国外网站Red ...
- Maven添加Web.xml的方法
当创建maven工厂时没有web.xml文件1.点击你的项目名称,进入到Myeclipse的-- Project Facets上,2.点击Dynamic Web Module 和下面的Java,将两个 ...