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 ...
随机推荐
- BUUCTF | 摩丝
将得到的交上去居然不对: 然而大写却过了: flag{ILOVEYOU} 因为摩斯电码在设计的时候就没有区分大小写,而且从码表中可以看到,都是大写,所以在网站上解密出来的自己转成大写
- 114、TensorFlow设备放置
# creates a variable named v and places it on the second GPU device import tensorflow as tf #with tf ...
- Python笔记(六)_函数
函数一般是从第一行代码开始执行,结束于return语句.异常.或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在局部变量中的数据都将丢失.再次调用这 ...
- 【C#学习笔记】 IDisposable 接口
在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作.也就是说对 ...
- 斯坦福【概率与统计】课程笔记(三):EDA | 直方图
单个定量变量的直方图表示 大家知道,定量变量是连续型变量,即不会像分类变量那样有明显的分类,那么如何将其画成直方图呢?一般来说,会将其按照某个维度来将其分组(group),举个例子. 我们有15个学生 ...
- 【读书笔记】:MIT线性代数(2):Vector Spaces and Subspaces
Vector Space: R1, R2, R3,R4 , .... Each space Rn consists of a whole collection of vectors. R5 conta ...
- python 打印日历
import calendar as c'''x = c.monthcalendar(2017,11) 使用这个结果打印出日历 s = 1while s <= 7: print('周%d '%( ...
- Redis 系列(02)数据结构
目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 ...
- webpack打包配置中出现的问题
第一个错误: One CLI for webpack must be installed. These are recommended choices, delivered as separate p ...
- python系列——文件操作的代码
import numpy as np import os,sys #获取当前文件夹,并根据文件名 def path(fileName): p=sys.path[0]+'\\'+fileName ret ...