2019 ICPC南昌邀请赛网络赛比赛过程及题解
解题过程
中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了。然后lfw读完M题(shl的电脑终于打开了,然后输入密码,密码错误。。。自闭),说AC 自动机板题,然后找板子,,,突然发现自己读错题目。后来不知道怎么A的。shl copy了一遍密码终于登上账号。然后lfw一个人用单调栈和前缀和st表A掉了I题;byf 秒了H题;
shl和byf读j题,读完吧题意告诉lfw,lfw说水题,然后树链剖分加线段树离线就过了。同时byf在想K题,然后推出式子,利用前缀和就过了(听说好多对TLE了,应该没用前缀和维护);然后还有一个多小时,,,shl和byf看D题,lfw看C题,然后shl和byf没啥想法,lfw调C调了一万年,最后也没过。。。这场每一题都是一下就过了,罚时较少。(这场shl全场OB,没碰键盘,状态极差...)
C题要注意一下,java 的BigInteger运算比c++用数组模拟高精度快,lfw被卡住了,c++要几分钟预处理,java几乎1s出来,所以最后用java,但是看错题没看到要字典序最小,没时间改
第二天改好了,最后java也超时。。。要矩阵乘法预处理出28个数。。。
题解
先放代码,题解后面更新。
A. PERFECT NUMBER PROBLEM
#include<bits/stdc++.h>
using namespace std;
int main()
{
printf("6\n");
printf("28\n");
printf("496\n");
printf("8128\n");
printf("33550336\n");
return ;
}
B. Greedy HOUHO
Unsolved.
C. Angry FFF Party
Unsolved.
lfw的题解链接 https://blog.csdn.net/liufengwei1/article/details/89522815
import java.lang.reflect.Array;
import java.util.*;
import java.math.*;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Main
{
public static BigInteger[][] multi(BigInteger [][]a,BigInteger [][]b)
{
BigInteger [][]c= new BigInteger[3][3];
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
c[i][j]=BigInteger.ZERO;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++) {
c[i][k] = c[i][k].add(a[i][j].multiply(b[j][k]));
}
return c;
}
public static BigInteger qp(int b)
{
BigInteger ans[][]=new BigInteger[3][3];
BigInteger cnt[][]=new BigInteger[3][3];
ans[1][1]=BigInteger.ONE;ans[1][2]=BigInteger.ZERO;
ans[2][1]=BigInteger.ZERO;ans[2][2]=BigInteger.ONE;
cnt[1][1]=BigInteger.ZERO;cnt[1][2]=BigInteger.ONE;
cnt[2][1]=BigInteger.ONE;cnt[2][2]=BigInteger.ONE;
while(b>0)
{
if(b%2==1)
ans=multi(ans,cnt);
cnt=multi(cnt,cnt);
b>>=1;
}
return ans[2][2];
}
public static void main(String args[])
{
int []f=new int [100];
int []ans=new int[100];
int up=0,cnt=3;
f[1]=1;f[2]=1;
for(int i=3;i<=28;i++)
f[i] = f[i - 2] + f[i - 1];
//PrintStream ps=new PrintStream("B.");
BigInteger []num=new BigInteger[30];
BigInteger a,b,w,sum=BigInteger.ZERO,tmp=BigInteger.ZERO;
a=BigInteger.ONE;
b=BigInteger.ONE;
num[1]=BigInteger.ONE;
num[2]=BigInteger.ONE;
num[3]=BigInteger.ONE;
Scanner input=new Scanner(System.in);
int id=0;
//System.out.println("a[1]=1;");
//System.out.println("a[2]=1;");
//System.out.println("a[3]=1;");
id=4;
for(int i=4;i<=28;i++)
num[i]=qp(f[i]-1);
int t,anscnt;
t=input.nextInt();
while(t>0)
{
t--;sum=BigInteger.ZERO;
w=input.nextBigInteger();
anscnt=0;
for(int i=28;i>=1;i--)
{
tmp=sum.add(num[i]);
if(tmp.compareTo(w)<=0) {
sum = tmp;
ans[++anscnt] = i;
}
}
if(sum.equals(w))
{
if(ans[anscnt]==5)
{
ans[anscnt]=1;ans[++anscnt]=2;ans[++anscnt]=3;
ans[++anscnt]=4;
}
else if(ans[anscnt]==4)
{
ans[anscnt]=1;
ans[++anscnt]=2;
}
else if(ans[anscnt]==3)
{
if(ans[anscnt-1]==4)
{
ans[anscnt-1]=3;
ans[anscnt]=1;
ans[++anscnt]=2;
}
else
ans[anscnt]=1;
}
else if(ans[anscnt]==2)
{
if(ans[anscnt-1]==3)
{
ans[anscnt - 1] = 1; ans[anscnt] = 2;
}
} Arrays.sort(ans,1,anscnt+1);
for(int j=1;j<=anscnt;j++)
{
if(j>1)
System.out.print(" ");
System.out.print(ans[j]);
}
System.out.println("");
}
else
System.out.println("-1");
}
}
}
D. Match Stick Game
Unsolved.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int num[]={,,,,,,,,,};
ll f[][][];
inline void init()
{
for (int i=;i<;i++)
for (int j=;j<;j++)
f[][i][j]=-1e10;//max
memset(f[],INF,sizeof(f[]));//min
f[][][]=;
f[][][]=;
for (int i=;i<=;i++)
for (int j=;j<=i*;j++)
for (int k=;k<=;k++)
{
if(j<num[k]) continue;
f[][i][j]=min(f[][i][j],f[][i-][j-num[k]]*+k);
f[][i][j]=max(f[][i][j],f[][i-][j-num[k]]*+k);
}
}
ll dp[][];
char s[];
int nums[];
int main()
{
init();
int T,n;
scanf("%d",&T);
while(T--)
{
int tot=;
scanf("%d%s",&n,s);
for(int i=;i<=n;i++)
for(int j=;j<=n*;j++)
dp[i][j]=-1e12;//dao di i kuai haisheng j gen de max
int last=-,cnt=;
for(int i=;s[i];++i)//tongji mubang de numbers
{
if(s[i]=='+'||s[i]=='-')
{
nums[cnt++]=i-last-;
last=i;
}
if(s[i]=='+') tot+=;
else if(s[i]=='-') tot+=;
else tot+=num[s[i]-''];
}
nums[cnt++]=strlen(s)--last;
for(int i=;i<=min(nums[]*,tot);++i)
dp[][tot-i]=max(dp[][tot-i],f[][nums[]][i]);
for(int i=;i<cnt;++i)
for(int j=;j<=tot;++j)
for(int k=;k<=min(nums[i]*+,j);++k)
{
dp[i][j-k]=max(dp[i][j-k],dp[i-][j]-f[][nums[i]][k-]);//-
dp[i][j-k]=max(dp[i][j-k],dp[i-][j]+f[][nums[i]][k-]);//+
}
printf("%lld\n",dp[cnt-][]);
}
return ;
}
E. Card Game
Unsolve.
F. Information Transmitting
Unsolved.
G. tsy's number
byf题解南昌网络赛tsy's number(莫比乌斯反演&线性递推)
H. Coloring Game
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+;
int quick_pow(int a,int b)
{
int ans=;
while(b)
{
if(b&) ans=ans*a%mod;
a=a*a%mod;
b>>=;
}
return ans;
}
int32_t main()
{
int n;
scanf("%lld",&n);
if(n==) {printf("1\n");return ;}
printf("%lld\n",**quick_pow(,n-)%mod);
return ;
}
I. Max answer
#include<bits/stdc++.h>
#define maxl 500010
using namespace std; int n,top,lg;
long long ans=;
long long s[maxl];
long long a[maxl],sum[maxl],dol[maxl],dor[maxl];
long long mini[][maxl],mx[][maxl];
map <long long,int> mp;
map <long long,int> :: iterator it; inline void prework()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]),sum[i]=sum[i-]+a[i];
top=;int l=,r=;
while(l<=n && r<=n)
{
while(a[l]<= && l<=n)
l++;
if(a[l]>)
{
r=l;
while(a[r+]>)
r++;
top=;s[]=l-;
for(int i=l;i<=r;i++)
{
while(top> && a[i]<a[s[top]])
{
dor[s[top]]=i;
top--;
}
s[++top]=i;dol[i]=s[top-];
}
while(top>)
dor[s[top]]=r+,top--;
for(int i=l;i<=r;i++)
ans=max(ans,(sum[dor[i]-]-sum[dol[i]])*a[i]);
}
else r=l;
l=r+;
}
} inline void mainwork()
{
int lg=log2(n),t;
for(int i=;i<=n;i++)
mx[][i]=mini[][i]=sum[i];
for(int i=;i<=lg;i++)
for(int j=;j<=n;j++)
{
mx[i][j]=max(mx[i-][j],mx[i-][j+(<<(i-))]);
mini[i][j]=min(mini[i-][j],mini[i-][j+(<<(i-))]);
}
long long mxx,mii;
for(int i=;i<=n;i++)
if(a[i]<)
{
t=log2(i-+);
mxx=max(mx[t][],mx[t][i-(<<t)+]);
t=log2(n-i+);
mii=min(mini[t][i],mini[t][n-(<<t)+]);
ans=max((mii-mxx)*a[i],ans);
}
} inline void print()
{
printf("%lld",ans);
} int main()
{
prework();
mainwork();
print();
return ;
}
J. Distance on the tree
#include<bits/stdc++.h>
#define maxl 200010
#define inf 2000000001
using namespace std; int n,nn,q,cnt=,nodecnt=,num=;
int a[maxl],dep[maxl],tot[maxl],son[maxl],top[maxl],fa[maxl],ehead[maxl];
int idx[maxl],dy[maxl],ans[maxl];
struct ed
{
int to,nxt;
}e[maxl<<];
struct node
{
int l,r,sum;
}tree[maxl<<];
struct qu
{
int u,v,w,id;
}que[maxl],edg[maxl<<];
char ch[maxl]; inline void adde(int u,int v)
{
e[++cnt].to=v;e[cnt].nxt=ehead[u];ehead[u]=cnt;
} void dfs1(int u,int f)
{
int v;
dep[u]=dep[f]+;fa[u]=f;tot[u]=;
for(int i=ehead[u];i;i=e[i].nxt)
{
v=e[i].to;
if(v==f) continue;
dfs1(v,u);
tot[u]+=tot[v];
if(tot[v]>tot[son[u]])
son[u]=v;
}
} void dfs2(int u,int topf)
{
int v;
idx[u]=++nodecnt;dy[nodecnt]=u;
top[u]=topf;
if(!son[u]) return;
dfs2(son[u],topf);
for(int i=ehead[u];i;i=e[i].nxt)
{
v=e[i].to;
if(idx[v]) continue;
dfs2(v,v);
}
} void build(int k,int l,int r)
{
tree[k].l=l;tree[k].r=r;
if(l==r)
{
tree[k].sum=;
return;
}
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
tree[k].sum=tree[k<<].sum+tree[k<<|].sum;
} inline bool cmp(const qu &x,const qu &y)
{
return x.w<y.w;
} inline void prework()
{
scanf("%d%d",&n,&q);
int u,v,w;num=n;
nn=n;
for(int i=;i<=n-;i++)
{
scanf("%d%d%d",&u,&v,&w);
num++;edg[i]=qu{u,v,w,num};
adde(u,num);adde(num,v);
adde(v,num);adde(num,u);
}
for(int i=;i<=q;i++)
{
scanf("%d%d%d",&que[i].u,&que[i].v,&que[i].w);
que[i].id=i;;
}
sort(edg+,edg++n-,cmp);
sort(que+,que++q,cmp);
n=num;
dfs1(,);
dfs2(,);
build(,,n);
} void add(int k,int l)
{
if(tree[k].l==tree[k].r)
{
tree[k].sum++;
return;
}
int mid=(tree[k].l+tree[k].r)>>;
if(l<=mid)
add(k<<,l);
else
add(k<<|,l);
tree[k].sum=tree[k<<].sum+tree[k<<|].sum;
} int getsum(int k,int l,int r)
{
if(tree[k].l==l && tree[k].r==r)
return tree[k].sum;
int mid=(tree[k].l+tree[k].r)>>;
if(l>mid)
return getsum(k<<|,l,r);
else
if(r<=mid)
return getsum(k<<,l,r);
else
return getsum(k<<,l,mid)+getsum(k<<|,mid+,r);
} inline int gettreesum(int x,int y)
{
int ans=;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=getsum(,idx[top[x]],idx[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=getsum(,idx[x],idx[y]);
return ans;
//printf("%d\n",ans);
} inline void mainwork()
{
//int x,y;
/*scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%s",ch);
scanf("%d%d",&x,&y);
if(ch[0]=='C')
{
a[x]=y;
add(1,idx[x]);
}
else if(ch[1]=='S')
gettreesum(x,y);
else
gettreemax(x,y);
}*/
int edind=;
for(int i=;i<=q;i++)
{
while(edind<nn- && edg[edind+].w<=que[i].w)
++edind,add(,idx[edg[edind].id]);
ans[que[i].id]=gettreesum(que[i].u,que[i].v);
}
} inline void print()
{
for(int i=;i<=q;i++)
printf("%d\n",ans[i]);
} int main()
{
prework();
mainwork();
print();
return ;
}
K. MORE XOR
#include<bits/stdc++.h>
using namespace std;
const int size=1e5+;
#define int long long
int sum[][size];
int arr[size];
int32_t main()
{
int t;
scanf("%lld",&t);
int n;
while(t--)
{
scanf("%lld",&n);
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++)
{
scanf("%lld",&arr[i]);
}
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
{
sum[j][i]=sum[j][i-];
}
sum[i%][i]=sum[i%][i]^arr[i];
}
int q;
scanf("%lld",&q);
int l,r;
while(q--)
{
scanf("%lld%lld",&l,&r);
int len=r-l+;
if(len%==) printf("0\n");
else if(len%==)
{
int b=l%;
printf("%lld\n",sum[b][l-]^sum[b][r]);
}
else if(len%==)
{
int b=l%,c=(l+)%;
printf("%lld\n",sum[b][l-]^sum[b][r]^sum[c][l-]^sum[c][r]);
}
else if(len%==)
{
int c=(l+)%;
printf("%lld\n",sum[c][l-]^sum[c][r]);
}
}
}
return ;
}
L. qiqi'tree
Unsolved.
M. Subsequence
#include<bits/stdc++.h>
#define maxl 100010 int slen,tlen,n;
int nxt[maxl][];
int nxtind[];
char s[maxl],t[maxl]; inline void prework()
{
scanf("%s",s+);
slen=strlen(s+);
for(int i=;i<;i++)
nxtind[i]=maxl-;
for(int i=slen;i>=;i--)
{
for(int j=;j<;j++)
nxt[i][j]=nxtind[j];
nxtind[s[i]-'a']=i;
}
for(int j=;j<;j++)
nxt[][j]=nxtind[j];
} inline bool check()
{
tlen=strlen(t+);
int u=;
for(int i=;i<=tlen;i++)
{
u=nxt[u][t[i]-'a'];
if(u== || u>slen)
return false;
}
return true;
} inline void mainwork()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",t+);
if(check())
puts("YES");
else
puts("NO");
}
} int main()
{
prework();
mainwork();
return ;
}
shl聚菜。%lfw.%byf.
2019 ICPC南昌邀请赛网络赛比赛过程及题解的更多相关文章
- 2019 ICPC南昌邀请赛 网络赛 K. MORE XOR
说明 \(\oplus x\)为累异或 $ x^{\oplus(a)}$为异或幂 题意&解法 题库链接 $ f(l,r)=\oplus_{i=l}^{r} a[i]$ $ g(l,r)=\ ...
- icpc 南昌邀请赛网络赛 Max answer
就是求区间和与区间最小值的积的最大值 但是a[i]可能是负的 这就很坑 赛后看了好多dalao的博客 终于a了 这个问题我感觉可以分为两个步骤 第一步是对于每个元素 以它为最小值的最大区间是什么 第二 ...
- icpc 南昌邀请赛网络赛 Subsequence
题目链接:https://nanti.jisuanke.com/t/38232 就是判断输入是不是子序列 没想到贡献了将近十几次罚时..........可以说是菜的真实了 用cin cout超时了 改 ...
- 南昌邀请赛网络赛 D.Match Stick Game(dp)
南昌邀请赛网络赛 D.Match Stick Game 题目传送门 题目就会给你一个长度为n的字符串,其中\(1<n<100\).这个字符串是一个表达式,只有加减运算符,然后输入的每一个字 ...
- POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum
http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- [2019南昌邀请赛网络赛D][dp]
https://nanti.jisuanke.com/t/38223 Xiao Ming recently indulges in match stick game and he thinks he ...
- 2019南昌邀请赛网络赛:J distance on the tree
1000ms 262144K DSM(Data Structure Master) once learned about tree when he was preparing for NOIP(N ...
- 计蒜客 38228. Max answer-线段树维护单调栈(The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer 南昌邀请赛网络赛) 2019ICPC南昌邀请赛网络赛
Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of ...
随机推荐
- pandas数据导出Execl
脚本主要功能是将数据库查询到的结果,通过pandas写到到execl文件中. #!/usr/bin/env python #-*- coding: utf8 -*- from sqlalchemy i ...
- Centos 7.X 安装及常规设置
一.制作USBHDD+启动 需要工具: UltraISO(软碟通) U盘 centos7镜像: http://www.centos.org 二.安装(有坑) U盘启动电脑,进入安装界面: 选中第一项, ...
- Spring中常用的注解及作用
@Component(value) 配置类,当使用该注解时,SpringIOC会将这个类自动扫描成一个bean实例 不写的时候,默认是类名,且首字母小写 @ComponentScan 默认是代表进行扫 ...
- java编程思想第四版第七章总结
1. 实现类的复用通常有两种方式 组合:在新的类中产生现有类的对象 继承:按照现有类的类型来创造新类 2. 一个特殊的方法toString() 在非基本类型的对象中, 都有toString()方法 当 ...
- nyoj 42-一笔画问题 (欧拉图 && 并查集)
42-一笔画问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:10 submit:25 题目描述: zyc从小就比较喜欢玩一些小游戏,其中就包括画 ...
- 编译spark支持thriftserver
cdh默认把spark的spark-sql以及hive-thriftserver给弃用掉了,想玩玩thriftserver,于是自己重新编译一个 官网参考: http://spark.apache.o ...
- Java开发中常用jar包整理及使用
本文整理了我自己在Java开发中常用的jar包以及常用的API记录. <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...
- 微博验证码的识别并登录获取cookies
记得以前微博是用的宫格验证码,现在不一样了,用的是滑块验证码和 点触验证码,每天登陆的第一次基本用的是滑块,继续登录就都用的是点触验证码.所以滑块验证码不写,感兴趣的可以补上. 代码: 这里用的超级鹰 ...
- 五年老Android,我决定转后端开发了!
今天给大家分享一些移动端(Android)开发学习后端开发(Java Web)的一些事儿,不知道从什么时候开始身边的同事都开始陆陆续续的在朋友圈发一些后端的文章如:Nginx.Docker.k8s类的 ...
- ArcGIS 切片与矢量图图层顺序问题
在项目中有个需求:根据图层索引添加图层 看到这个需求一下子想到 map.addLayer(layer,index?) 接口 但是问题出现了,我切片图加载顺序在矢量图之后就不行! map = new M ...