2019 ICPC Asia Nanchang Regional E Eating Plan 离散化+前缀和
题意:
给你n个盘子,这n个盘子里面分别装着1!到n!重量的食物,对于每一个询问k,找出一个最短的区间,使得区间和 mod 998857459 大于或等于k
盘子数量 n<=1e5 询问次数 m<=1e4
题解:
坑点在于此题模数998857459=4*773*2803 是个合数,因此任何a>=2803 a!=0
因此,只需考虑非0的盘子作为端点,暴力枚举$(max(n,2802))^2$个区间。
我使用的方式是记录阶乘取模非0节点的值和位置,然后求前缀和
再枚举左右端点,记录区间和取模和区间长度
再将区间按照区间和从小到大排序
再把值从小到大的区间从后往前,维护取得大于等于该值所需区间长度的最小值。
询问时在排好序的区间数组上lower_bound,返回该点记录的最小区间长度.
#include<iostream>
#include<algorithm>
#include<vector>
#define MOD 998857459
#define INF 0x3f3f3f3f
using namespace std;
long long poww[];
long long res[];
//long long a[100005];
struct Array{
long long val;
long long index;
long long sum;
}a[];
long long asiz=;
struct Ans{
long long sum;
long long len;
long long minlen; friend bool operator < (const Ans &a,const Ans &b){
return a.sum<b.sum;
}
friend bool operator > (const Ans &a,const Ans &b){
return a.sum>b.sum;
}
}ans[];
long long anssiz=;
//vector<Ans> ans;
int main(){
poww[]=;
for(long long i=;i<=;i++){
poww[i]=1LL*poww[i-]*i%MOD;
//printf("%lld\n",poww[i]);
} long long n,m;
scanf("%lld %lld",&n,&m); for(long long i=;i<=n;i++){
long long t;
scanf("%lld",&t);
if(t<=){
asiz++;
a[asiz].index=i;
a[asiz].val=poww[t];
}
} //a[1].sum=a[1].val;
for(long long i=;i<=asiz;i++){
a[i].sum=a[i-].sum+a[i].val;
} //memset(res,INF,sizeof res);
for(long long i=;i<=asiz;i++){
for(long long j=i;j<=asiz;j++){
//ans.push_back(aa);
anssiz++;
ans[anssiz].len=a[j].index-a[i].index+;
ans[anssiz].sum=(a[j].sum-a[i-].sum)%MOD;
//res[j-i+1]=max(res[j-i+1],a[j].sum-a[i-1].sum);
}
} sort(ans+,ans++anssiz); ans[anssiz].minlen=ans[anssiz].len; for(long long i=anssiz-;i>=;i--){
ans[i].minlen=min(ans[i+].minlen,ans[i].len);
//printf("*%lld %lld\n",ans[i].sum,ans[i].minlen);
}
//for(int i=1;i<=anssiz;i++){
//printf("*%lld %lld %lld\n",ans[i].sum,ans[i].len,ans[i].minlen);
//}
for(long long i=;i<=m;i++){
long long k;
scanf("%lld",&k);
Ans tmp;
tmp.sum=k;
long long aa=lower_bound(ans+,ans++anssiz,tmp)-ans;
//printf("%lld\n",aa);
if(aa==anssiz+)printf("-1\n");
else printf("%lld\n",ans[aa].minlen);
}
return ;
}
2019 ICPC Asia Nanchang Regional E Eating Plan 离散化+前缀和的更多相关文章
- 2019 ICPC Asia Nanchang Regional C And and Pair 找规律/位运算/dp
题意: 给定一个二进制表示的n,让你找满足如下要求的数对(i,j)的个数 $0 \leqslant j \leqslant i \leqslant n$ $ i & n = i $ $ i & ...
- 2019 ICPC Asia Nanjing Regional
2019 ICPC Asia Nanjing Regional A - Hard Problem 计蒜客 - 42395 若 n = 10,可以先取:6,7,8,9,10.然后随便从1,2,3,4,5 ...
- 2019 ICPC Asia Nanjing Regional K. Triangle
题目:在直角坐标系中给定 p1,p2,p3构成三角形,给定p4可能在三角形边上也可能不在, 问能不能在三角形上找出p5,使得线段p4p5,平分三角形(p4必须在三角形上).不能则输出-1. 思路:四个 ...
- 2019 ICPC Asia Xuzhou Regional
目录 Contest Info Solutions A. Cat B. Cats line up C. <3 numbers E. Multiply F. The Answer to the U ...
- 2019 ICPC Asia Yinchuan Regional
目录 Contest Info Solutions A. Girls Band Party B. So Easy D. Easy Problem E. XOR Tree F. Function! G. ...
- The 2019 ICPC Asia Shanghai Regional Contest H Tree Partition k、Color Graph
H题意: 给你一个n个节点n-1条无向边构成的树,每一个节点有一个权值wi,你需要把这棵树划分成k个子树,每一个子树的权值是这棵子树上所有节点权值之和. 你要输出这k棵子树的权值中那个最大的.你需要让 ...
- 2019 ICPC Asia Taipei-Hsinchu Regional Problem J Automatic Control Machine (DFS,bitset)
题意:给你\(m\)个长度为\(n\)的二进制数,求最少选多少个使它们\(|\)运算后所有位置均为\(1\),如果不满足条件,则输出\(-1\). 题解:这题\(n\)的范围很大,所以我们先用\(st ...
- 2019 ICPC Asia Taipei-Hsinchu Regional Problem K Length of Bundle Rope (贪心,优先队列)
题意:有\(n\)堆物品,每次可以将两堆捆成一堆,新堆长度等于两个之和,每次消耗两个堆长度之和的长度,求最小消耗使所有物品捆成一堆. 题解:贪心的话,每次选两个长度最小的来捆,这样的消耗一定是最小的, ...
- 2018 ICPC Asia Singapore Regional A. Largest Triangle (计算几何)
题目链接:Kattis - largesttriangle Description Given \(N\) points on a \(2\)-dimensional space, determine ...
随机推荐
- sqlserver存储过程(转)
一.不含参数的存储过程 1.没有返回值: 创建语句: CREATE PROCEDURE dbo.ProTest AS DECLARE @test int SET @test = 1 ...
- 如何制作一个可以用Bochs调试的最新内核系统盘
参考:http://blog.chinaunix.net/uid-26207112-id-3332621.html 1. 正确地创建一个包含启动分区的磁盘映像 1.1 创建磁盘映像文件 首先需要对磁盘 ...
- HTML设置span宽度
CSS中的 width 属性并不总是有效的如果对象是 inline 对象,width 属性就会被忽略,Firefox 和 IE 是遵循CSS标准,因而直接设置span宽度会无效. 解决:span { ...
- python内存管理及垃圾回收
一.python的内存管理 python内部将所有类型分成两种,一种由单个元素组成,一种由多个元素组成.利用不同结构体进行区分 /* Nothing is actually declared to b ...
- json模块 pickle 模块 collections 模块 openpyxl 模块
json模块 json 模块是一个系列化模块 一个第三方的特殊数据格式 可以将python数据类型----> json 数据格式 ----> 字符串 ----> 文件 其他语言想要使 ...
- 49-python基础-python3-列表-常用列表统计函数-max()-min()-sum()
max() min() sum() 1-数字列表统计 实例: 2-字符串列表统计. 根据ASCII码大小统计字符串列表的min()和max(). 注意:sum()函数无法统计字符串列表. 实例:
- 第一节 初识RabbitMQ
原文:第一节 初识RabbitMQ 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/87280120 1.什么 ...
- Java的动态代理Proxy
概念梳理: 1.什么是动态代理? 答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实.代理一般会实现它所表示的实际对象的接口.代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际 ...
- springcloud费话之Eureka基础
目录: springcloud费话之Eureka基础 springcloud费话之Eureka集群 springcloud费话之Eureka服务访问(restTemplate) springcloud ...
- css的9个常用选择器
1.类选择器(通过类名进行选择) <!DOCTYPE html> <html> <head> <title></title> </he ...