题意:

给你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 离散化+前缀和的更多相关文章

  1. 2019 ICPC Asia Nanchang Regional C And and Pair 找规律/位运算/dp

    题意: 给定一个二进制表示的n,让你找满足如下要求的数对(i,j)的个数 $0 \leqslant j \leqslant i \leqslant n$ $ i & n = i $ $ i & ...

  2. 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 ...

  3. 2019 ICPC Asia Nanjing Regional K. Triangle

    题目:在直角坐标系中给定 p1,p2,p3构成三角形,给定p4可能在三角形边上也可能不在, 问能不能在三角形上找出p5,使得线段p4p5,平分三角形(p4必须在三角形上).不能则输出-1. 思路:四个 ...

  4. 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 ...

  5. 2019 ICPC Asia Yinchuan Regional

    目录 Contest Info Solutions A. Girls Band Party B. So Easy D. Easy Problem E. XOR Tree F. Function! G. ...

  6. The 2019 ICPC Asia Shanghai Regional Contest H Tree Partition k、Color Graph

    H题意: 给你一个n个节点n-1条无向边构成的树,每一个节点有一个权值wi,你需要把这棵树划分成k个子树,每一个子树的权值是这棵子树上所有节点权值之和. 你要输出这k棵子树的权值中那个最大的.你需要让 ...

  7. 2019 ICPC Asia Taipei-Hsinchu Regional Problem J Automatic Control Machine (DFS,bitset)

    题意:给你\(m\)个长度为\(n\)的二进制数,求最少选多少个使它们\(|\)运算后所有位置均为\(1\),如果不满足条件,则输出\(-1\). 题解:这题\(n\)的范围很大,所以我们先用\(st ...

  8. 2019 ICPC Asia Taipei-Hsinchu Regional Problem K Length of Bundle Rope (贪心,优先队列)

    题意:有\(n\)堆物品,每次可以将两堆捆成一堆,新堆长度等于两个之和,每次消耗两个堆长度之和的长度,求最小消耗使所有物品捆成一堆. 题解:贪心的话,每次选两个长度最小的来捆,这样的消耗一定是最小的, ...

  9. 2018 ICPC Asia Singapore Regional A. Largest Triangle (计算几何)

    题目链接:Kattis - largesttriangle Description Given \(N\) points on a \(2\)-dimensional space, determine ...

随机推荐

  1. php面试专题---6、正则表达式考点

    php面试专题---6.正则表达式考点 一.总结 一句话总结: 正则匹配步骤:1.先写出一个要匹配的字符串:2.自左向右的顺序使用正则表达式的原子和元字符进行拼接:3.最终加入模式修正符: 1.写出一 ...

  2. arcpy 常用操作

    目录: 通用操作 条件函数 前提: import arcpy from arcpy.sa import * 1.通用操作 设置工作路径:arcpy.env.workspace("path_o ...

  3. 彻底搞定C指针-函数名与函数指针

     函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子://自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int mai ...

  4. 【GDAL】GDAL栅格数据结构学习笔记(一): 关于Metadata

    在维护一段代码时看到前任程序员写的获取栅格数据的CellSize的功能,竟然在知道GDAL的情况下去调用AE的接口来解算,觉得费解. 原来的思路是使用AE的Raster对象读取出Raster的文件大小 ...

  5. 不同字符串,HashCode可能相同

    不同的字符串,hashcode可能相同. 先看例子: @Test public void test6(){ System.out.println("ABCDEa123abc".ha ...

  6. leetcode-解题记录 557. 反转字符串中的单词 III

    题目: 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输出 ...

  7. Windows下使用Composer安装yii2

    Composer简介 Composer 是PHP中用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的 ...

  8. 用于拆解和组合PDF中各个对象的shell脚本

    拆解脚本 header_start=0 header_len=15 xref_start=$(strings -a -t d $1 | grep -e "\bxref\b" | a ...

  9. 【读书笔记】:MIT线性代数(3):Special Solution, Rank and RREF

    Special Solutions: Notice what is special about s 1 and S2. They have ones and zeros in the last two ...

  10. Linux运维基础采集项

    1. Linux运维基础采集项 做运维,不怕出问题,怕的是出了问题,抓不到现场,两眼摸黑.所以,依靠强大的监控系统,收集尽可能多的指标,意义重大.但哪些指标才是有意义的呢,本着从实践中来的思想,各位工 ...