2018 ACM-ICPC南京区域赛题解
解题过程
开场开A,A题shl看错题意,被制止。然后开始手推A,此时byf看错E题题意,开始上机。推出A的规律后,shl看了E题,发现题意读错。写完A题,忘记判断N=0的情况,WA+1。过了A后,shl重新写E,lfw开始开J题,E题过不了样例,lfw多次起立让shl调试,然后shl拿到E的一血,lfw之后过了J。byf开始开I题,shl口胡出M做法,然后lfw和shl一起推G题。byf过了I题后,shl推出G题,byf去写。然后lfw开始计算几何,经过查错后过掉,然后shl开始开M题,过掉后还剩最后半小时,无题可做。
最后罚时很多,因为前期签到题过得太慢,A题40+分钟才过,J题1小时40分钟才过。
题解
A - Adrien and Austin
题解:给你n给石头,下标依次为1~n,然后两个人轮流取石头,每次取1~k个连续下标的石头,最后不能取得输掉比赛。问你谁会获胜。
找规律,首先,n==0时,第一个人必败。k==1时,n为奇数时先手必胜。k>1时,先手必胜.
参考代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=1e9+;
LL quick_pow(LL a,LL b)
{
LL ans=;
while(b)
{
if(b&) ans=ans*a%mod;
a=a*a%mod;
b>>=;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
int l24=quick_pow(,mod-);
while(t--)
{
int n;
scanf("%d",&n);
LL ans=;
ans=ans*n%mod;
ans=ans*(n+)%mod;
ans=ans*(n+)%mod;
ans=ans*(n+)%mod;
ans=ans*l24%mod;
printf("%lld\n",ans);
}
}
B - Tournament
Unsolved.
C - Cherry and Chocolate
Unsolved.
D - Country Meow
队友写的.题解:https://blog.csdn.net/liufengwei1/article/details/89303612
参考代码:
#include<bits/stdc++.h>
#define maxl 110
#define eps 1e-8
struct point
{
double x,y,z;
point(double a=,double b=,double c=)
{
x=a;y=b;z=c;
}
}; int npoint,nouter;
point pt[maxl],outer[],res;
double radius,tmp,ans; inline double dist(point p1,point p2)
{
double dx=p1.x-p2.x,dy=p1.y-p2.y,dz=p1.z-p2.z;
return (dx*dx+dy*dy+dz*dz);
} inline double dot(point p1,point p2)
{
return p1.x*p2.x+p1.y*p2.y+p1.z*p2.z;
} inline void ball()
{
point q[];double m[][],sol[],L[],det;
int i,j;
res.x=res.y=res.z=radius=;
switch(nouter)
{
case : res=outer[];break;
case :
res.x=(outer[].x+outer[].x)/;
res.y=(outer[].y+outer[].y)/;
res.z=(outer[].z+outer[].z)/;
radius=dist(res,outer[]);
break;
case :
for(int i=;i<;i++)
{
q[i].x=outer[i+].x-outer[].x;
q[i].y=outer[i+].y-outer[].y;
q[i].z=outer[i+].z-outer[].z;
}
for(int i=;i<;i++)
for(int j=;j<;j++)
m[i][j]=dot(q[i],q[j])*;
for(int i=;i<;i++)
sol[i]=dot(q[i],q[i]);
if(fabs(det=m[][]*m[][]-m[][]*m[][])<eps)
return;
L[]=(sol[]*m[][]-sol[]*m[][])/det;
L[]=(sol[]*m[][]-sol[]*m[][])/det;
res.x=outer[].x+q[].x*L[]+q[].x*L[];
res.y=outer[].y+q[].y*L[]+q[].y*L[];
res.z=outer[].z+q[].z*L[]+q[].z*L[];
radius=dist(res,outer[]);
break;
case :
for(int i=;i<;i++)
{
q[i].x=outer[i+].x-outer[].x;
q[i].y=outer[i+].y-outer[].y;
q[i].z=outer[i+].z-outer[].z;
sol[i]=dot(q[i],q[i]);
}
for(int i=;i<;i++)
for(int j=;j<;j++)
m[i][j]=dot(q[i],q[j])*;
det=m[][]*m[][]*m[][]
+ m[][]*m[][]*m[][]
+ m[][]*m[][]*m[][]
- m[][]*m[][]*m[][]
- m[][]*m[][]*m[][]
- m[][]*m[][]*m[][];
if(fabs(det)<eps) return;
for(int j=;j<;j++)
{
for(int i=;i<;i++)
m[i][j]=sol[i];
L[j]=(m[][]*m[][]*m[][]
+m[][]*m[][]*m[][]
+m[][]*m[][]*m[][]
-m[][]*m[][]*m[][]
-m[][]*m[][]*m[][]
-m[][]*m[][]*m[][])/det;
for(int i=;i<;i++)
m[i][j]=dot(q[i],q[j])*;
}
res=outer[];
for(int i=;i<;i++)
{
res.x+=q[i].x*L[i];
res.y+=q[i].y*L[i];
res.z+=q[i].z*L[i];
}
radius=dist(res,outer[]);
}
} inline void minball(int n)
{
ball();
if(nouter<)
for(int i=;i<n;i++)
if(dist(res,pt[i])-radius>eps)
{
outer[nouter]=pt[i];
++nouter;
minball(i);
--nouter;
if(i>)
{
point Tt=pt[i];
memmove(&pt[],&pt[],sizeof(point)*i);
pt[]=Tt;
}
}
} inline double smallest_ball()
{
radius=-;
for(int i=;i<npoint;i++)
if(dist(res,pt[i])-radius>eps)
{
nouter=;
outer[]=pt[i];
minball(i);
}
return sqrt(radius);
} inline void prework()
{
for(int i=;i<npoint;i++)
scanf("%lf%lf%lf",&pt[i].x,&pt[i].y,&pt[i].z);
} inline void mainwork()
{
ans=smallest_ball();
} inline void print()
{
printf("%.5f\n",ans);
} int main()
{
while(~scanf("%d",&npoint))
{
prework();
mainwork();
print();
}
return ;
}
E - Eva and Euro coins
题解:给你两个01串,然后连续k个0可以翻转为1,连续k个1可以翻转为0.问你这两个01串是否可以变成相同的串。
可以利用归约。连续k个0或1可以归约掉。最后判断是否相同即可。
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
char s[maxn],t[maxn];
int cnt[maxn][];
int n,k,tmp;
void work(char st[])
{
memset(cnt,,sizeof(cnt));
cnt[][]=-;tmp=;
for(int i=;i<=n;++i)
{
cnt[++tmp][]=st[i]-'';
cnt[tmp][] = cnt[tmp-][]==st[i]-''?cnt[tmp-][]+:;
if(cnt[tmp][]==k) tmp-=k;
}
for(int i=;i<=n;++i) {if(i<=tmp) st[i]=cnt[i][]+'';else st[i]='';}
}
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s+);
scanf("%s",t+);
work(s);work(t);
for(int i=;i<=n;++i) {if(s[i]!=t[i]) {puts("No");return ;}}
puts("Yes");
return ;
}
F - Frank
Unsolved.
G - Pyramid
题解:打表找规律,ans=n(n+1)(n+2)(n+3).
参考代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=1e9+;
LL quick_pow(LL a,LL b)
{
LL ans=;
while(b)
{
if(b&) ans=ans*a%mod;
a=a*a%mod;
b>>=;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
int l24=quick_pow(,mod-);
while(t--)
{
int n;
scanf("%d",&n);
LL ans=;
ans=ans*n%mod;
ans=ans*(n+)%mod;
ans=ans*(n+)%mod;
ans=ans*(n+)%mod;
ans=ans*l24%mod;
printf("%lld\n",ans);
}
}
H - Huge Discount
Unsolved.
I - Magic Potion
队友写的,好像是最大流,题解待更。
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
const int maxm=1e5+;
const int inf=0x3f3f3f3f;
struct Edge{
int to,nxt,cap,flow;
}edge[maxm];
int tol;
int head[maxn];
void init(){
tol=;
memset(head,-,sizeof(head));
}
void AddEdge(int u,int v,int w,int rw=){
edge[tol].to=v;edge[tol].cap=w;edge[tol].flow=;
edge[tol].nxt=head[u];head[u]=tol++;
edge[tol].to=u;edge[tol].cap=rw;edge[tol].flow=;
edge[tol].nxt=head[v];head[v]=tol++;
}
int Q[maxn];
int dep[maxn],cur[maxn],sta[maxn];
bool bfs(int s,int t,int n){
int front=,tail=;
memset(dep,-,sizeof(dep[])*(n+));
dep[s]=;
Q[tail++]=s;
while(front<tail){
int u=Q[front++];
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(edge[i].cap>edge[i].flow&&dep[v]==-){
dep[v]=dep[u]+;
if(v==t) return true;
Q[tail++]=v;
}
}
}
return false;
}
int dinic(int s,int t,int n){
int maxflow=;
while(bfs(s,t,n)){
for(int i=;i<n;i++) cur[i]=head[i];
int u=s,tail=;
while(cur[s]!=-){
if(u==t){
int tp=inf;
for(int i=tail-;i>=;i--)
{
tp=min(tp,edge[sta[i]].cap-edge[sta[i]].flow);
}
maxflow+=tp;
for(int i=tail-;i>=;i--){
edge[sta[i]].flow+=tp;
edge[sta[i]^].flow-=tp;
if(edge[sta[i]].cap-edge[sta[i]].flow==) tail=i;
}
u=edge[sta[tail]^].to;
}
else if(cur[u]!=-&&edge[cur[u]].cap>edge[cur[u]].flow&&dep[u]+==dep[edge[cur[u]].to]){
sta[tail++]=cur[u];
u=edge[cur[u]].to;
}
else{
while(u!=s&&cur[u]==-) u=edge[sta[--tail]^].to;
cur[u] = edge [cur[u]].nxt;
}
}
}
return maxflow;
}
int main()
{
init();
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int ti,mi;
int ss=,t=n+m+;
int s1=,s2=;
for(int i=;i<=n;i++) AddEdge(s1,i+,);
for(int i=;i<=n;i++) AddEdge(s2,i+,);
AddEdge(ss,s1,n);
AddEdge(ss,s2,k);
for(int i=;i<=n;i++)
{
scanf("%d",&ti);
for(int j=;j<=ti;j++)
{
scanf("%d",&mi);
AddEdge(i+,n++mi,);
}
}
for(int i=;i<=m;i++)
{
AddEdge(i+n+,t,);
}
int ans=dinic(ss,t,t+);
printf("%d\n",ans);
}
J - Prime Game
队友写的,题解:https://blog.csdn.net/liufengwei1/article/details/89303678
参考代码:
#include<bits/stdc++.h>
#define maxl 1000010
using namespace std; int n;
int a[maxl],p[maxl],dy[maxl];
long long v[maxl];
bool no[maxl];
vector <int> f[maxl];
long long ans; inline void shai()
{
no[]=true;
int t,j;
for(int i=;i<maxl;i++)
{
if(!no[i]) p[++p[]]=i,dy[i]=i;
j=,t=i*p[];
while(j<=p[] && t<maxl)
{
dy[t]=p[j];
no[t]=true;
if(i%p[j]==)
break;
t=i*p[++j];
}
}
} inline void prework()
{
for(int i=;i<=p[];i++)
f[p[i]].clear();
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
int x=a[i],last=;
while(x>)
{
if(dy[x]!=last)
f[dy[x]].push_back(i);
last=dy[x];
x/=dy[x];
}
}
} inline void mainwork()
{
ans=;int l,r,len;
long long tmp;
for(int i=;i<=p[];i++)
if(f[p[i]].size()>)
{
tmp=v[n];
l=;r=;len=f[p[i]].size();
if(f[p[i]][]>)
tmp-=v[f[p[i]][]-];
for(int j=;j<len-;j++)
if(f[p[i]][j+]>f[p[i]][j]+)
{
l=f[p[i]][j]+;r=f[p[i]][j+]-;
tmp-=v[r-l+];
}
if(f[p[i]][len-]<n)
tmp-=v[n-f[p[i]][len-]];
ans+=tmp;
}
} inline void print()
{
printf("%lld\n",ans);
} int main()
{
shai();
for(long long i=;i<maxl;i++)
v[i]=i*(i+)/;
while(~scanf("%d",&n))
{
prework();
mainwork();
print();
}
return ;
}
K - Kangaroo Puzzle
随机化。。
#include<bits/stdc++.h>
using namespace std;
char s[][];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) scanf("%s",s[i]);
srand(time());
char str[]={'L','R','U','D'};
for(int i=;i<=;++i)printf("U");
for(int i=;i<=;++i)printf("R");
for(int i=;i<=;++i)printf("D");///////adsfag
for(int i=;i<=;++i)printf("L");
for(int i=;i<=;++i)
{
int x=rand()%;
printf("%c",str[x]);
}
puts("");
return ;
}
L - Lagrange the Chef
Unsolved.
M - Mediocre String Problem
题解:给你两个字符串。让你从s1中取l,r一个子串,s2的前缀,把s2的前缀放到s1的后面,组成一个回文串,问你you多少种组合方式。
我们可以把它转化为选l,x,r 和f使得l~x和1~f对称,把s1翻转,用exkmp处理,x~r为回文串.然后我们可以枚举r,用Manacher处理s1,把exnext反转,然后记录前缀和.
即可。
参考代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pii pair<int,int>
const int INF=0x3f3f3f3f;
const int maxn=1e6+;
char s[maxn],t[maxn];
int lens,lent;
int mynext[maxn],extend[maxn];
ll sum[maxn]; void pre_exkmp(char x[],int m,int nxt[])
{
nxt[]=m;
int j=;
while(j+<m && x[j]==x[j+]) j++;
nxt[]=j;
int k=;
for(int i=;i<m;++i)
{
int p=nxt[k]+k-;
int L=nxt[i-k];
if(i+L<p+) nxt[i]=L;
else
{
j=max(,p-i+);
while(i+j<m&&x[i+j]==x[j]) j++;
nxt[i]=j;
k=i;
}
}
}
void exkmp(char x[],int m,char y[],int n,int nxt[],int extend[])
{
pre_exkmp(x,m,nxt);
int j=;
while(j<n && j<m&& x[j]==y[j]) ++j;
extend[]=j;
int k=;
for(int i=;i<n;++i)
{
int p=extend[k]+k-;
int L=nxt[i-k];
if(i+L<p+) extend[i]=L;
else
{
j=max(,p-i+);
while(i+j<n&&j<m&&y[i+j]==x[j]) ++j;
extend[i]=j;
k=i;
}
}
}
char Ma[maxn<<];
int len[maxn<<];
void Manacher(char s[],int le)
{
int l=;
Ma[l++]='$'; Ma[l++]='#';
for(int i=;i<le;++i) Ma[l++]=s[i],Ma[l++]='#';
Ma[l]=;
int mx=,id=;
for(int i=;i<l;++i)
{
len[i]=mx>i?min(len[*id-i],mx-i):;
while(Ma[i+len[i]]==Ma[i-len[i]]) len[i]++;
if(i+len[i]>mx) mx=i+len[i],id=i;
}
}
//moban ll getsum(int l,int r)
{
if(l>r) return ;
else if(l<=) return sum[r];
else return sum[r]-sum[l-];
} int main()
{
scanf("%s%s",s,t);
lens=strlen(s);lent=strlen(t);
Manacher(s,lens);//len[]
reverse(s,s+lens);
exkmp(t,lent,s,lens,mynext,extend);
reverse(extend,extend+lens);
sum[]=extend[];
for(int i=;i<lens;++i) sum[i]=sum[i-]+extend[i];
ll ans=;
for(int i=;i<*lens+;++i)
{
int cnt=len[i]-;
if(cnt== || len[i]==) continue;
if(cnt&)
{
int w=(i-)/;
int r=w-;
int l=w-len[i]/;
ans+=getsum(l,r);
}
else
{
int w=(i--)/;
int r=w-;
int l=w-cnt/;
ans+=getsum(l,r);
}
}
printf("%lld\n",ans); return ;
}
2018 ACM-ICPC南京区域赛题解的更多相关文章
- 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
队名:Unlimited Code Works(无尽编码) 队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...
- 2018 ACM ICPC 南京赛区 酱油记
Day 1: 早上6点起床打车去车站,似乎好久没有这么早起床过了,困到不行,在火车上睡啊睡就睡到了南京.南航离南京南站很近,地铁一站就到了,在学校里看到了体验坐直升机的活动,感觉很强.报道完之后去吃了 ...
- 2016 年 ACM/ICPC 青岛区域赛 Problem C Pocky
昨晚乱入学弟的训练赛,想了一下这个题.推导的过程中,加深了对公理化的概率论理解.$\newcommand{\d}{\mathop{}\!\mathrm{d}}$ 解法一 考虑 $ d < L$ ...
- 2018 ACM/ICPC 南京 I题 Magic Potion
题解:最大流板题:增加两个源点,一个汇点.第一个源点到第二个源点连边,权为K,然后第一个源点再连其他点(英雄点)边权各为1,然后英雄和怪物之间按照所给连边(边权为1). 每个怪物连终点,边权为1: 参 ...
- 2013 ACM/ICPC 南京网络赛F题
题意:给出一个4×4的点阵,连接相邻点可以构成一个九宫格,每个小格边长为1.从没有边的点阵开始,两人轮流向点阵中加边,如果加入的边构成了新的边长为1的小正方形,则加边的人得分.构成几个得几分,最终完成 ...
- Known Notation括号匹配类问题(2014年ACM/ICPC 亚洲区域赛牡丹江)
题意: 给你数字或 * 的串,你可以交换一个*和数字.在最前面添1.在一个地方插入*,问你使串满足入栈出栈的(RNP)运算法则. 思路: 引用:https://blog.csdn.net/u01158 ...
- Digit sum (第 44 届 ACM/ICPC 亚洲区域赛(上海)网络赛)进制预处理水题
131072K A digit sum S_b(n)Sb(n) is a sum of the base-bb digits of nn. Such as S_{10}(233) = 2 + 3 ...
- 【2013南京区域赛】部分题解 hdu4802—4812
上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...
- 2016年11月ACM/ICPC亚洲区北京赛赛后总结
2016年11月12到11月13为期两天的比赛,这是我们这个对第一次去打亚洲区域赛,经过这次比赛,我认识到了自己与别人的差距,也许我们与别人的起点不同,但这不是理由. 这次的比赛12号的热身赛两点开始 ...
随机推荐
- 【实战】如何通过html+css+mysql+php来快速的制作动态网页(以制作一个博客网站为列)
一.开发环境的搭建 (1)apache+php+mysql环境搭建 因为要用apache来做服务器,mysql作为数据库来存储数据,php来写代码以此实现网页与数据库的交互数据,所以需要下载上述软件, ...
- easyui+ef实现省市区三级联动
1.引用easyui样式及脚本文件 2.数据库创建表(自联表)及数据建模(Code First) use DataBase go CREATE TABLE OP_SJ ( CID UNIQUEIDEN ...
- Day01第一天 Python基础一
变量 就是将一些运算的中间结果暂时存在内存中,以便后续代码的调用. >命名规则: 1,只能以字母,数字,下划线自由组合,且,不能以数字开头.2,不能是 Python 中的关键字.3,要具有可 ...
- 更新centos7的kernel
现在安装的centos7 的内核是3.10的, 机器已经联网,可以直接利用包管理工具更新,需要注意的是现在3.0以上的内核引入了签名机制,需要导入签名的key,参考步骤如下: 1.导入keyrpm - ...
- Redis 的底层数据结构(对象)
目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对 ...
- python遍历所有盘符下的图片并拷贝下来
最近在学习python,闲着无聊就试着写啦这个小的脚本,虽然有很多不足,但是还是收获不少. 该脚本的功能: ①遍历本地计算机中的所有盘符,并将名称记录下来: ②循环遍历盘符下的所有图片(当然这里可以根 ...
- Servlet+Ajax实现搜索框智能提示
简介:搜索框相信大家都不陌生,几乎每天都会在各类网站进行着搜索.有没有注意到,很多的搜索功能,当输入内容时,下面会出现提示.这类提示就叫做搜索框的智能提示,本门课程就为大家介绍如何使用Servlet和 ...
- 【数据结构】之链表(Java语言描述)
以前写过一篇帖子,记录了链表在C语言中的描述代码.C语言中没有链表的直接实现,因此,我们需要自己编写代码实现.请参考[我的这篇文章]. Java中默认为我们提供了链表的API—— LinkedList ...
- CCNA 之 六 路由协议 二 EIGRP
EIGRP(Enhanced IGRP) 增强型内部网关路由协议 注意:这是cisco私有协议:也就是说,该协议只能运行在思科的设备上,如果有其他的厂家的设备,则不能保证能运行此协议: EIGRP的特 ...
- swiper实现一个好看的轮播图
轮播是我们在编写页面中经常遇到的模块,所以网上也会有各种有有关轮播图的插件.今天忽然间看到了swiper上一个高颜值的轮播功能,顺便做一下分享. 首先页面在head内要先引用 swiper的css 和 ...