CF1063D Candies for Children
分类讨论题
n<=1e11,
整体上先分n<=2e6与否讨论
len长度,ans贪心的人,p就是len这一段贪心的人
n<=2e6
枚举答案ans
要满足:
p>=0,
p>=ans-(n-len)
p<=ans,
p<=len
p+len=k mod (ans+n)=r
p=r-len
判断p是否合法即可
n>=2e6
枚举i
i*ans+p=k-i*n-len=M
观察,ans++,p-=i
p最小时候,ans最大
p最小是:M%i
考虑要满足的条件:
p>=0,p<=len,p<=ans
ans>=0,ans<=p+(n-len),ans<=n
先把ans调整到n以内,再调整到p+(n-len)以内
判断p是否合法即可
因为最大合法的ans一定是最优的,ans更小,p更大,本身答案更劣,而且也更可能不合法
至于最后一个取1个,但是是贪心的,
只需要k=k+1再做一遍,并且要求p>=1
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
#define int long long
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
ll n,l,r,k;
ll len;
ll che(ll i,ll M){
// cout<<" che "<<i<<" "<<M<<endl;
ll ret=-;
if(i==){
ll p=M;
if(p<=len) ret=max(ret,p+n-len);
p=M+;
if(p>=&&p<=len) ret=max(ret,p+n-len);
}
else{
ll p=M%i;
ll ans=(M-p)/i;
if(ans>n) {
p+=(ans-n)*i;
ans=n;
}
if(ans>n-len+p){
ll tmp=(ans-(n-len+p)+i)/(i+);
ans-=tmp;
p+=tmp*i;
}
if(p>=&&p<=min(ans,len)) ret=max(ret,ans); p=(M+)%i;
ans=(M+-p)/i;
if(ans>n){
p+=(ans-n)*i;
ans=n;
}
if(ans>n-len+p){
ll tmp=(ans-(n-len+p)+i)/(i+);
ans-=tmp;
p+=tmp*i;
}
if(p>=&&p<=min(ans,len)) ret=max(ret,ans);
}
// cout<<" ret "<<ret<<endl;
return ret;
}
int main(){
rd(n);rd(l);rd(r);rd(k);
if(l<=r) len=r-l+;
else len=n-l++r;
// cout<<" len "<<len<<endl;
if(n<=2e6){
ll ans=;
for(ans=n;ans>=;--ans){
ll r=k%(ans+n);
if(r==) r+=ans+n;
int p=r-len;
if(p>=max((ll),ans-(n-len))&&p<=min(ans,len)) break;
r=(k+)%(ans+n);
p=r-len;
if(p>=max((ll),ans-(n-len))&&p<=min(ans,len)) break;
}
if(ans>=) printf("%lld",ans);
else printf("-1");
}else{
ll M=k-len;
ll ans=-;
for(ll i=;M>=;++i,M-=n){
ll ret=che(i,M);
ans=max(ans,ret);
}
printf("%lld",ans);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
CF1063D Candies for Children的更多相关文章
- 【CF1063D】Candies for Children 数学
题目大意 有 \(n\) 个人排成一个圈,你有 \(k\) 颗糖,你要从第 \(l\) 个人开始发糖,直到第 \(r\) 个人拿走最后一颗糖.注意这 \(n\) 个人拍成了一个圈,所以第 \(n\) ...
- 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 ...
- Codeforces1063D Candies for Children 【分类讨论】【暴力】
题目分析: 首先要想两个暴力,一个的时间复杂度是$O(n^2)$,另一个是$O([\frac{n}{k}])$的. $n^2$的暴力可以枚举两段,一段有$i$个取两个的小朋友,一段有$j$个取两个的小 ...
- HDU 6126.Give out candies 最小割
Give out candies Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)
题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...
- Codeforces Round #516 (Div. 2) (A~E)
目录 Codeforces 1064 A.Make a triangle! B.Equations of Mathematical Magic C.Oh Those Palindromes D.Lab ...
- Codeforces Round #516(Div 2)
比赛链接:传送门 A. Make a triangle!(简单思维) 题目大意: 给你三条边,问你最多加多少长度能使这三条边能构成三角形. 思路: 最大边小于答案加另外两条边的和. #include ...
- CodeForces Round #516 Div2 题解
A. Make a triangle! 暴力... 就是给你三个数,你每次可以选一个加1,问最少加多少次能构成三角形 #include <bits/stdc++.h> #define ll ...
- [CF]Round 516
A Make a triangle! 题意:给定三根线段,问最少要延长多少才能拼成一个三角形. 数学题. B Equations of Mathematical Magic 题意:求$a - (a \ ...
随机推荐
- day4new-转自金角大王
Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...
- Spring中使用DataSourceTransactionManager进行事务管理的xml配置
在一个业务的实现过程中,可能需要多条sql完成对数据库的操作,比如账户登录,需要匹配用户名和密码,然后要增加积分,还要记录登录的ip和时间,这可能需要三个sql语句,这三个语句应当是一个整体,任意一个 ...
- Spark in action on Kubernetes - Spark Operator的原理解析
前言 在上篇文章中,向大家介绍了如何使用Spark Operator在kubernetes集群上面提交一个计算作业.今天我们会继续使用上篇文章中搭建的Playground进行调试与解析,帮助大家更深入 ...
- 集合--List&&ArrayList-LinkedList
1.8新特性 List接口中的replaceAll()方法,替换指定的元素,函数式接口编程 List 元素是有序的并且可以重复 四种add();方法 ArrayList(用于查询操作),底层是数组 ...
- 【JZOJ4889】【NOIP2016提高A组集训第14场11.12】最长公共回文子序列
题目描述 YJC最近在学习字符串的有关知识.今天,他遇到了这么一个概念:最长公共回文子序列.一个序列S,如果S是回文的且分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...
- 当async/await碰见forEach-------------爆炸
let p = ['http://img3.imgtn.bdimg.com/it/u=3278834702,2663618759&fm=26&gp=0.jpg', 'http://im ...
- Linux的 crontab定时任务小记
编辑任务 crontab -e 查看任务 crontab -l 任务配置基本格式:* * * * * command分(0-59) 时(0-23) 天(1-31) 月(1-12) 周(0-6,0代 ...
- AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结
技术帖:AutoCAD没有按照正确方式卸载,导致AutoCAD安装失败.楼主也查过网上关于如何解决AutoCAD安装失败的一些文章,是说删除几个AutoCAD文件和AutoCAD软件注册表就可以解决A ...
- 瑞星推国内唯一Linux系统杀毒软件 国产操作系统还需国产安全软件保护
近来在IT领域最爆炸的新闻莫过于5月20日中央国家机关政府採购中心下发通知.要求中央机关採购所有计算机类产品不同意安装Windows 8.而改用国产Linux操作系统. 此消息一出,立马引起各界关注. ...
- python 字典元素删减