我的游记:https://www.cnblogs.com/huangzihaoal/p/11154228.html

DAY1

题目

T1 农场

【题目描述】

【输入】

第一行,一个整数n。

第二行,n个整数\(a_i\)

【输出】

一个数,最多可以分成几块。

【样例输入】

6

1 1 2 1 2 1

【样例输出】

2

【数据范围限制】

T2 密码锁

【题目描述】

【输入】

输入文件共两行,第一行有两个数字n,m,第二行为一个长为n的数组\(a_1,a_2, ... ,a_n\)

【输出】

输出文件只有一行,表示最少需要的操作次数。答案可能很大,但不会超过\(\sum_i a_i\),因此不需要对任何数取模。

【样例输入】

Sample Input1

4 3

1 2 1 0

Sample Input2

11 8

1 2 3 4 5 0 5 4 3 2 1

Sample Input3

20 100

30 91 15 72 61 41 10 37 98 41 94 80 26 96 10 88 59 5 84 14

【样例输出】

Sample Output1

2

Sample Output2

8

Sample Output3

313

【数据范围限制】

数据点 数据范围
Case 1-4 \(1\leq n\leq 4,2\leq m\leq 10\)
Case 5-9 \(1\leq n\leq 10^5,2\leq m\leq 3\)
Case 10-15 \(2\leq n,m\leq 3\cdot 10^3\)
Case 16-18 \(2\leq n\leq 2\cdot 10^5\)
Case 1-20 \(1\leq n\leq 10^6,2\leq m\leq 10^9\)

共20个数据点

T3 涛涛接苹果

【题目描述】

【输入】

【输出】

输出 q 行,每行一个整数表示答案。

【样例输入】

10 5 6

1 2 3 4 5 6 7 8 9 10

9 7

7 10

6 5

7 5

5 8

5 1

2 1

3 2

2 4

2 3 4

2 9 5

1 7 3

4 8 2

5 6 6

2 3

2 5

1 4

3 5

5 1

6 1

【样例输出】

0

43

4

27

11

13

【数据范围限制】

【提示】

T4 小学生图论题

【题目描述】

【输入】

【输出】

一个整数,表示强连通分量的期望个数。

【样例输入】

Sample Input1

10 2

2 1 3

3 7 8 9

Sample Input2

3 0

【样例输出】

Sample Output1

462789157

Sample Output2

499122179

【数据范围限制】

测试点编号 n m \(k_i\)
1、2 \(n\leq 1000\) 0
3、4 \(n\leq 3000\) \(m\leq 3000\) \(2\leq k_i\leq n\)
5 \(n\leq 100000\) \(m\leq 100000\) \(k_i=2\)
6~10 \(n\leq 100000\) \(m\leq 100000\) \(2\leq k_i\leq n\)

题解

T1 农场

这题很水,比赛时就有200多人AC了。

题目大意就是给你n个数\(a_1,a_2,...,a_n\),要求把它们划分成若干份,每一份的和都相等,求出最多能划分成几份。

这题可以用二分+前缀和来做。

输入时顺便求出前缀和数组f,那么\(f_n\)就是\(a_1,a_2,...,a_n\)的和了(最大为\(10^{15}\))。然后我们就求出它所有小于等于n的因数(可用线性筛法求出)

接下来就枚举所有的因数,设当前枚举到的因数为k,那么我们就判断可不可以将这些数划分成\(\frac{k}{f_n}\)份,如果可以,就用k来更新答案。

判断能否划分的方法很多,下面我就来说二分+前缀和的方法。

弄一个for循环,枚举不大于\(f_n\)的k的倍数i。

然后在f数组内二分查找i,如果没找到,那枚举到的k一定是不行的。

最后输出答案就可以了。

T2 密码锁

这题有一个十分神奇的性质:一个数要么加,要么减,不存在又加又减的情况。

所以可以用差分来做。

设\(f_i\)表示第i个数和第i-1个数的差,那么可以得出\(f_i=(a_i-a_{i-1}+m)\mod m\)

那么对于f值,我们就可以考虑把它+1或-1,由于一个数要么加要么减,所以就可以考虑把它加到m或减到0。

接着就可以发现一定存在一个值mid,使得\(f_{1\space to\space mid}\)全部减到0,\(f_{mid+1\space to\space n}\)全部加到m。

直接枚举就可以了。

然后这题就OK了。


标程

T1

#include<cstdio>
using namespace std;
typedef long long ll;
ll s[1000010],a[1000010],ans;
int n,m;
bool b[1000010];
bool failed(ll want)
{
int l=m,r=n,mid;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid]==want)
{
m=mid+1;
return 0;
}
if(a[mid]>want) r=mid-1;
else l=mid+1;
}
return 1;
}
int main()
{
freopen("farm.in","r",stdin);
freopen("farm.out","w",stdout);
int i,k;ll j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
a[i]+=a[i-1];
}
for(i=2;i<=1000000;i++) if(!b[i])
{
if(a[n]%i==0) s[++s[0]]=i;
for(j=(i<<1);j<=1000000;j+=i) if(!b[j])
{
b[j]=1;
if(j<=n&&a[n]%j==0) s[++s[0]]=j;
}
}
for(i=1;i<=s[0];i++)
{
m=0;
for(j=s[i];j<=a[n];j+=s[i])
{
if(failed(j)) break;
}
if(j>a[n])
{
if(a[n]/s[i]>ans) ans=a[n]/s[i];
}
}
printf("%lld\n",ans);
return 0;
}

T2

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[1000010],f[1000010],ans,k,last,now;
int main()
{
freopen("lock.in","r",stdin);
freopen("lock.out","w",stdout);
int n,m,i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%lld",&now);
a[i]=(now-last+m)%m;
last=now;
}
a[n+1]=(m-last)%m;
sort(a+1,a+n+2);
for(i=n+1;i>0;i--) f[i]=f[i+1]+m-a[i];
for(i=0;i<=n+1;i++)
{
ans+=a[i];
if(ans==f[i+1]) break;
}
printf("%lld\n",ans);
return 0;
}

DAY2

题目

T1 谈笑风生

【题目描述】

【输入】

【输出】

一行两个数,所需能量P与在能量最小的前提下最短的到达时间t。

【样例输入】

5 7 66

4 3 2 1 5

1 2

1 5

2 3

2 4

2 5

3 4

3 5

【样例输出】

6 64

【数据范围限制】

【样例解释】

从城市1出发,花费6单位能量,依次经过2、4、3、到达首都5,花费32+3+0+29=64秒

T2 滑稽子图

【题目描述】

【输入】

【输出】

仅一个整数,表示滑稽值对998244353取模后的值。

【样例输入】

Sample Input1

3 2 1

1 2

1 3

Sample Input2

6 5

1 2

1 3

1 4

1 6

4 5

【样例输出】

Sample Output1

4

Sample Output2

216

【数据范围限制】

数据点 数据限制
Case 1 \(n,m\leq 20\)
Case 2-3 \(n,m\leq 100,k\leq 1\)
Case 4-6 \(n,m\leq 1000,k\leq 2\)
Case 1-13 \(n,m\leq 100000,k\leq 4\)
Case 1-20 \(n,m\leq 100000,k\leq 10\)

共20个测试点。

T3 木板

【题目描述】

【输入】

【输出】

对于每个询问操作,输出一行包含一个整数,代表最大容量。

【样例输入】

4 4

1 2 5 6

1 2 4 2

1 1 2

1 3 4

1 1 4

1 1 3

【样例输出】

1

2

8

6

【数据范围限制】

测试点 N Q 其他
1 \(\leq 500\) \(\leq 500\) \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
2 \(\leq 10^5\) \(\leq 10^5\) 询问操作只出现一次 \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
3 \(\leq 10^5\) \(\leq 10^5\) 没有修改操作 \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
4 \(\leq 10^5\) \(\leq 10^5\) 没有修改操作 \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
5 \(\leq 10^5\) \(\leq 10^5\) \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
6 \(\leq 10^5\) \(\leq 10^5\) \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
7 \(\leq 10^5\) \(\leq 10^5\) \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
8 \(\leq 5*10^5\) \(\leq 5*10^5\) \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
9 \(\leq 5*10^5\) \(\leq 5*10^5\) \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)
10 \(\leq 5*10^5\) \(\leq 5*10^5\) \(0\leq x_i\leq 10^9,1\leq h_i\leq 10^9\)

T4 巡逻

【题目描述】

【输入】

【输出】

对于每一次询问,输出一行一个数表示答案,若不存在从这个城市出发的巡逻方案,则输出-1。

【样例输入】

5

-1 1 -1 2 1

1 -1 1 -1 -1

-1 1 -1 3 1

2 -1 3 -1 -1

1 -1 1 -1 -1

3

0 1

1 5

0 1

【样例输出】

4

7

【数据范围限制】


题解

T1 谈笑风生

这题真是太变态了!本蒟蒻只拿到了10分。

此题正解:莫比乌斯反演(什么鬼)+二分(答案这么大,不用二分用什么)

不难发现,这题只用先预处理出每条边的权值(即不用能量走过这条边的时间),然后二分答案跑SPFA就可以了。

预处理就是这题的关键所在。

设(u,v)这条边的边权为w(u,v)

暴力的方法就是$$w(u,v)=\sum_{i=1}{A_u}\sum_{j=1}{A_v}((i,j)=1)1$$

但是这样很明显会爆掉。

这是我们就要用莫比乌斯反演了(什么?不知道什么是莫比乌斯反演?自己搜去吧!)

利用这个高大上的方法,我们可以得到以下求法:

\[w(u,v)=\sum_{k=1}^{min(A_u,A_v)}\sum_{i=1}^{\frac{A_u}{k}}\sum_{j=1}^{\frac{A_v}{k}}k\cdot μ_k\cdot(i+j)
\]


标程

T1

#include<cstdio>
using namespace std;
#define inf (1e18)+1
int n,num[100010],a[10010],prime[100010],date[50010],first[10010];
bool b[100010],exist[10010];
long long T,anss,dis[10010];
int mymin(int x,int y){return x<y?x:y;}
struct EDGE
{
int start,end,next;
long long lenth;
void count()
{
int i,j,k,p,q;
long long s;
for(i=mymin(a[start],a[end]);i>0;i--)
{
s=i*num[i];p=a[end]/i,q=a[start]/i;
lenth+=s*q*(1+q)/2*p+s*p*(1+p)/2*q;
}
}
}edge[40010];
void Mobius()
{
int i,j,k;
num[1]=1;
for(i=2;i<=100000;i++)
{
if(!b[i])
{
prime[++prime[0]]=i;
num[i]=-1;
}
for(j=1;j<=prime[0];j++)
{
k=i*prime[j];
if(k>100000) break;
b[k]=1;
if(i%prime[j]==0)
{
num[k]=0;
break;
}
num[k]=-num[i];
}
}
}
bool spfa(long long p)
{
int head=0,tail=1,u,v,i;
long long t;
for(i=2;i<=n;i++) dis[i]=inf;
date[1]=1;dis[1]=0;
while(head<tail)
{
head++;
if(head>50000) head=1;
u=date[head];
exist[u]=0;
for(i=first[u];i;i=edge[i].next)
{
v=edge[i].end;
t=edge[i].lenth-p;
if(t<0) t=0;
if(dis[u]+t<dis[v])
{
dis[v]=dis[u]+t;
if(!exist[v])
{
tail++;
if(tail>50000) tail=1;
date[tail]=v;
exist[v]=1;
}
}
}
}
if(dis[n]>T) return 0;
return 1;
}
int main()
{
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
int m,i,j,k;
long long l=0,r=inf,mid,ans;
Mobius();
scanf("%d%d%lld",&n,&m,&T);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(k=1;k<=m;k++)
{
scanf("%d%d",&i,&j);
edge[2*k-1]=(EDGE){i,j,first[i],0};
edge[2*k-1].count();
first[i]=2*k-1;
edge[2*k]=(EDGE){j,i,first[j],edge[2*k-1].lenth};
first[j]=2*k;
}
while(l<=r)
{
mid=(l+r)/2;
if(spfa(mid))
{
ans=mid;
anss=dis[n];
r=mid-1;
}
else l=mid+1;
}
printf("%lld %lld\n",ans,anss);
return 0;
}

【GDOI】2018题目及题解(未写完)的更多相关文章

  1. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  2. elasticsearch indices.recovery 流程分析(索引的_open操作也会触发recovery)——主分片recovery主要是从translog里恢复之前未写完的index,副分片recovery主要是从主分片copy segment和translog来进行恢复

    摘自:https://www.easyice.cn/archives/231 elasticsearch indices.recovery 流程分析与速度优化 目录 [隐藏] 主分片恢复流程 副本分片 ...

  3. 【Luogu】【关卡2-7】深度优先搜索(2017年10月)【AK】【题解没写完】

    任务说明:搜索可以穷举各种情况.很多题目都可以用搜索完成.就算不能,搜索也是骗分神器. P1219 八皇后 直接dfs.对角线怎么判断:同一条对角线的横纵坐标的和或者差相同. #include < ...

  4. TCP/IP详解学习笔记(14)-TCP连接的未来和性能(未写完)

    在TCP刚出世的时候,其主要工作环境是以太网和SLIP之类的低速网络.随着高速网络的出现,让TCP协议的吞吐量更大,效率更高的要求就愈来愈迫切.为此,TCP增加了三个重要机制来对应现在的变化,他们是 ...

  5. Linux安装Oracle 11G过程(测试未写完)

    一.简介 Oracle数据库在系统运维中的重要性不言而喻,通过熟悉Oracle的安装来加深对操作系统和数据库知识的了解.Linux安装Oracle前期修改linux内核参数很重要,其实就是linux下 ...

  6. Array类型方法总结(未写完)

    转换方法:  toString() toLocaleString() valueOf() 栈方法:   push()---在数组末尾添加项,返回修改后的长度,   pop()---在数组末尾移除项,返 ...

  7. codeforces Hello 2019(未写完)

    A. Gennady and a Card Game a题惯例签到题 题意:给你一张牌,再给你5张牌,判断能不能出一次牌... 所以只要检查第二行中的某个卡是否与第一行中的卡具有共同字符 有就输出YE ...

  8. LINUX下多路径的介绍和安装配置(测试未写完)

    一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来 ...

  9. hdu 5402 Travelling Salesman Problem (技巧,未写完)

    题意:给一个n*m的矩阵,每个格子中有一个数字,每个格子仅可以走一次,问从(1,1)走到(n,m) 的路径点权之和. 思路: 想了挺久,就是有个问题不能短时间证明,所以不敢下手. 显然只要n和m其中一 ...

随机推荐

  1. AcWing:164. 可达性统计(拓扑排序 + 状态压缩算法)

    给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能 ...

  2. 学习日记6、easyui datagrid 新增一行,编辑行,结束编辑和删除行操作记录

    1.新增一行并进入编辑状态 var index=$('#Numbers').datagrid('appendRow', { CardInformation: '开户行', CardNumber: '银 ...

  3. UEFI和GPT

    好就没用linux了,这几天在win8笔记本上用虚拟机装了下,也准备装到硬盘上和win8双系统使用,发现一些概念已经跟不上时代了. 一个是在虚拟机中装的时候,分配了虚拟硬盘分区时,提示选择分区表类型, ...

  4. ActiveXObject常用方法

    function getusername() { var WshNetwork = new ActiveXObject("WScript.Network"); alert(&quo ...

  5. 一句话说明Facbook React证书的矛盾点

    这项专利授权说,如果您要使用我们根据这项授权发布的软件,假如您因为专利侵权而提起诉讼,您将失去我们的专利许可.

  6. SqlHelper 类

    // 一个自用的 SqlHelper 类 利用了刚学习到的 扩展方法 http://technet.microsoft.com/zh-cn/bb383977 /// <summary> / ...

  7. LC 357. Count Numbers with Unique Digits

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  8. UI的流畅度优化

    Android中所有的界面绘制工作都是在UI线程中进行的,提高UI流畅度的最核心根本在于释放UI线程.即:不在主线程中做耗时的操作. 很多人都知道,耗时的操作要放到子线程中去做,比如访问网络,比如读写 ...

  9. centos升级glibc2.23编译安装

    wget http://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz tar -zxvf glibc-2.23.tar.gz cd glibc-2.23 mkdir ...

  10. wmic查询ip

    @echo off for /F "usebackq" %%R in (`wmic PATH Win32_NetworkAdapterConfiguration WHERE &qu ...