题目大意

  有 \(n\) 个人排成一个圈,你有 \(k\) 颗糖,你要从第 \(l\) 个人开始发糖,直到第 \(r\) 个人拿走最后一颗糖。注意这 \(n\) 个人拍成了一个圈,所以第 \(n\) 个人拿完后会轮到第 \(1\) 个人拿。第 \(i\) 个人每次拿走的糖的数量是 \(a_i\)(由你决定)。如果第 \(r\) 个人要拿两个糖且只剩下一颗糖,那么他就只会拿走这一颗。问你最多能让多少个人每次拿两颗糖。

  \(n,k\leq {10}^{11}\)

题解

  分 \(n\) 小和 \(n\) 大两部分考虑。

  如果 \(n\) 比较小,就可以枚举答案,然后判断 \(l\sim r\) 这些人能不能拿走 \(k\bmod (ans+n)\) 颗糖。

  具体来说,这些人拿走的糖的数量 \(s\) 必须满足 \(mi\leq s\leq ma\),其中

\[\begin{align}
mi&\geq ans-n+len-1\\
mi&\geq 0\\
ma&\leq ans\\
ma&\leq len\\
\end{align}
\]

  如果 \(n\) 比较大,那么就可以枚举最少那个人拿了几次糖 \((i)\)。

  记 \(k_1\) 为所有人拿的糖的数量的和,\(k_2\) 为 \(l\sim r\) 的人拿的糖的数量,那么就有

\[\begin{align}
ik_1+k_2&=k\\
mi&\geq k_1-n-n+len-1+len\\
mi&\geq len\\
ma&\leq k_1-n+len\\
ma&\leq len+len\\
mi&\leq k_2\leq ma\\
ik_1+mi&\leq k\leq ik_1+ma\\
ik_1+2len+k_1-2n-1&\leq k\\
ik_1+len&\leq k\\
ik_1+len+k_1-n&\geq k\\
ik_1+2len&\geq k\\
k_1&\leq \frac{k-2len+2n+1}{i+1}\\
k_1&\leq \frac{k-len}{i}\\
k_1&\geq \frac{k-2len}{i}\\
k_1&\geq \frac{k-len+n}{i+1}
\end{align}
\]

  然后找出这个范围内最大的 \(k_1\) 就好了。

  时间复杂度:\(O(\sqrt k)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<functional>
#include<cmath>
#include<vector>
#include<iostream>
//using namespace std;
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::reverse;
using std::random_shuffle;
using std::lower_bound;
using std::upper_bound;
using std::unique;
using std::vector;
using std::cin;
using std::cout;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGE
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
void open2(const char *s){
#ifdef DEBUG
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
typedef long double ldb;
ll n,k;
ll l,r;
ll ans=-1;
ll len;
int main()
{
open("d");
cin>>n>>l>>r>>k;
len=(r>=l?r-l+1:n-l+1+r);
if(n<=1000000)
{
for(int i=n;i<=2*n;i++)
{
ll s=k%i;
if(s==0)
s=i;
s-=len;
ll mi=max(i-n-(n-len)-1,0ll);
ll ma=min(len,i-n);
if(s>=mi&&s<=ma)
ans=max(ans,i-n);
}
}
else
{
if(k>=len&&k<=2*len)
ans=max(ans,k==2*len?n:n-len+k-len+1);
for(int i=1;i<=k/n;i++)
{
ll s2=min((k-2*len+2*n+1)/(i+1),(k-len)/i);
ll s1=max((k-2*len+i-1)/i,(k-len+n+i)/(i+1));
if(s1<=s2)
ans=max(ans,s2-n);
}
}
cout<<ans<<std::endl;
return 0;
}

【CF1063D】Candies for Children 数学的更多相关文章

  1. CF1063D Candies for Children

    CF1063D Candies for Children 分类讨论题 n<=1e11, 整体上先分n<=2e6与否讨论 len长度,ans贪心的人,p就是len这一段贪心的人 n<= ...

  2. Codeforces 1063D Candies for Children

    题目大意 给定整数 $n, k, l, r$,$1\le n, k \le 10^{11}$,$1\le l, r \le n$ . 令 $ m = r - l + 1$,若 $m \le 0$,$m ...

  3. Codeforces Round #575 (Div. 3) (A. Three Piles of Candies)(数学)

    A. Three Piles of Candies time limit per test1 second memory limit per test256 megabytes inputstanda ...

  4. Codeforces1063D Candies for Children 【分类讨论】【暴力】

    题目分析: 首先要想两个暴力,一个的时间复杂度是$O(n^2)$,另一个是$O([\frac{n}{k}])$的. $n^2$的暴力可以枚举两段,一段有$i$个取两个的小朋友,一段有$j$个取两个的小 ...

  5. HDU 6126.Give out candies 最小割

    Give out candies Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  6. Codeforces Round #516(Div 2)

    比赛链接:传送门 A. Make a triangle!(简单思维) 题目大意: 给你三条边,问你最多加多少长度能使这三条边能构成三角形. 思路: 最大边小于答案加另外两条边的和. #include ...

  7. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)

    题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...

  8. Codeforces Round #516 (Div. 2) (A~E)

    目录 Codeforces 1064 A.Make a triangle! B.Equations of Mathematical Magic C.Oh Those Palindromes D.Lab ...

  9. CodeForces Round #516 Div2 题解

    A. Make a triangle! 暴力... 就是给你三个数,你每次可以选一个加1,问最少加多少次能构成三角形 #include <bits/stdc++.h> #define ll ...

随机推荐

  1. Spring Boot 整合 rabbitmq

    一.消息中间件的应用场景 异步处理 场景:用户注册,信息写入数据库后,需要给用户发送注册成功的邮件,再发送注册成功的邮件. 1.同步调用:注册成功后,顺序执行发送邮件方法,发送短信方法,最后响应用户 ...

  2. Spring Tool Suite4(sts)复制粘贴卡顿(ctrl+v, ctrl+c)、按住ctrl也很卡

    最近在看<Spring in Action, Fifth Edition>,下载了Spring Tool Suite4,在使用的过程中发现了一些问题: 只要在复制粘贴(ctrl+c, ct ...

  3. Redis入门简述

    Redis 是一个开源的,使用 ANSI C (C语言)编写,高性能的 Key-Value(键值对) 的 NoSQL 数据库 NoSQL = Not Only SQL,意即“不仅仅是SQL”,是一项全 ...

  4. element-tree-grid(表格树)的使用

    表格树,element-tree-grid需要单独下载并再配合elementUi里el-table使用. 步骤:1.npm install element-tree-grid --save(下载ele ...

  5. 44.Odoo产品分析 (五) – 定制板块(1) – 管理odoo安装(1)

    查看Odoo产品分析系列--目录 1 管理员的注意事项 在记录重要的配置细节时必须要小心,而且必须要有一个连续性的合适的.让系统能够安装备份并运行在一个可接受的时间内的计划. 1.1 制定实施策略 如 ...

  6. ASP.NET没有魔法——目录(完结)

    ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序 ASP.NET没有魔法——为什么使用ASP.NET ASP.NET没有魔法——第一个ASP.NET应用<MyBlog&g ...

  7. There is already an object named '#xxxx' in the database.

    这个案例是前几天同事遇到的一个案例,在存储过程中"删除"了一个临时表,然后重新创建这个临时表时遇到"There is already an object named 'x ...

  8. mysql(mariadb)主从配置

    环境: 内核版本:uname -r 系统版本:cat /etc/redhat-release

  9. SQL Server 增加链接服务器

    exec sp_addlinkedserver '名称' , '' , 'SQLOLEDB' , '10.102.29.xxx' exec sp_addlinkedsrvlogin '名称' , 'f ...

  10. LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

    这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...