期望 :80+ +90+40=210+

实际 :30+90+0=120

链接:https://www.nowcoder.com/acm/contest/175/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

CJK 是一个喜欢数据结构的同学。一天他看到 BZOJ 4012 这一题。“这似乎可以用动态点分治做。”,他想。然而他并不会动态点分治,因此他拿着这一题去问 XXX。

然而 XXX 跟他说:“你呀,毕竟图样图森破,上台拿衣服!连基础都没学好,就想学这些高端的东西!来,我这里有一题,如果你能把这道题秒掉,我才能教你动态点分治!”

于是 CJK 打开题目。题目很短,只有一句话:

“给出 l, r, k,请从小到大输出所有在 [l, r] 范围内,能表示为 k 的非负整数次方的所有数。”

“多组数据。”,XXX 补充说,“注意所有数的 0 次方都为 1,因此 1 也得算进去哦。”

输入描述:

第一行一个数 T,表示数据组数。

接下来 T 行,每行 3 个数 l,r,k,表示一组数据。

输出描述:

对于每一组数据输出一行(总共输出 T 行)。

如果存在符合要求的数,则在一行内从小到大输出这些数;否则输出一个字符串 "None."(包括句点,不包括引号)。

输入例子:
4
1 10 2
2 4 5
19562 31702689720 17701
3680 37745933600 10
输出例子:
1 2 4 8
None.
313325401
10000 100000 1000000 10000000 100000000 1000000000 10000000000

-->

示例1

输入

复制

4
1 10 2
2 4 5
19562 31702689720 17701
3680 37745933600 10

输出

复制

1 2 4 8
None.
313325401
10000 100000 1000000 10000000 100000000 1000000000 10000000000

备注:

/*
也就是到1e18 再大就跑不动了,
所以就看出题人的数据范围了,
如果小的话还可以,大了就gg了。
long long相乘太耗时间了。 正常计算是最慢 63*10^4
但是long long 跑不出来啊!! 还很担心会不会有两数相乘爆long long
成了负数,那while就跑不出来了。
*/
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T;
long long l,r,k,sum;
int main(){
scanf("%d",&T);
while(T--){
sum=;bool f=;
scanf("%lld%lld%lld",&l,&r,&k);
if(k==){
if(l==&&r==) printf("None.\n"); /*此处在挂掉50分*/
else if(l<=) printf("1\n");
else printf("None.\n");
continue;
}
if(k==){
if(l==&&r==) printf("0\n");
else if(l==&&r!=) printf("0 1 \n"); /*此处由于眼瞎挂掉40分*/
else if(l==) printf("1 \n");
else printf("None.\n");
continue;
}
while(){
if(sum>=l&&sum<=r){
printf("%lld ",sum);
f=;
}
if(r/k<sum) break; //此处挂掉50分
sum*=k;
}
if(f==) printf("None.\n");
else printf("\n");
}
}
/*
所以本题期望80+ 实际30分
失分原因:l ≤r,0≤l,r,k <2^63。
此处的 l<=r 看成了 1<=r 漏判了50分的情况。
其次 是while的结束条件 if(r/k<sum) break;
应该是炸了 long long 导致死循环 炸掉50分。
综合炸掉70分。。。。。~~~~(>_<)~~~~
*/

链接:https://www.nowcoder.com/acm/contest/175/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

给出一个序列 a1, ..., an
定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ..., ar-1, ar 的最大公因数。
求最长的好的区间的长度。

输入描述:

第一行 n,表示序列的长度;

第二行 n 个数 

输出描述:

输出一行一个数,表示最长的好的区间的长度。

输入例子:
5
4 6 9 3 6
输出例子:
4

-->

示例1

输入

复制

5
4 6 9 3 6

输出

复制

4

说明

选择区间 [2,5],i=4。

备注:

/*
题目要求很显然是求最长的一个区间且这个区间中所有的数都是最小的数的倍数。
从左向右扫,对每个点向左拓展它能到达的最长长度,因为要求是倍数,所以如
果遇到起倍数,直接把他倍数所能拓展到的长度接上,如果不是就停止。
然后从右向左扫 同理。
最后统计。 期望得分 :90
*/
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 4000001
using namespace std;
int n,ans;
int l[MAXN],r[MAXN];
long long a[MAXN];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=;i<=n;i++)
for(int j=i-;j>=;j--){
if(a[j]%a[i]==){ l[i]+=l[j]+;j=j-l[j]; }
else if(a[j]%a[i]!=) break;
}
for(int i=n;i>=;i--)
for(int j=i+;j<=n;j++){
if(a[j]%a[i]==){ r[i]+=r[j]+;j=j+r[j]; }
else if(a[j]%a[i]!=) break;
}
for(int i=;i<=n;i++)
ans=max(ans,l[i]+r[i]+);
printf("%d\n",ans);
}
/*期望得分 90 实际得分 90*/

我这个方法的时间复杂度应该是O(n log n)的。

题解是这么写的

这个人↓的写法和我一样,但是不知道加了个什么奇奇怪怪的优化,竟然AC了 我这决不是嫉妒(扎小人)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int wx=;
inline char get_char(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
#define short long long
inline short read(){
short num=;
char c;
while(!isdigit(c=get_char()));
for(num=c-;isdigit(c=get_char());num=((num+(num<<))<<)+c-);
return num;
}
long long a[wx];
int l[wx],r[wx];
int n;
int ans;
signed main(){
ios::sync_with_stdio(false);
cin.tie();cout.tie();
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=n;i++)
for(l[i]=i;l[i]>&&a[l[i]-]%a[i]==;l[i]=l[l[i]-]);
for(int i=n;i>=;i--)
for(r[i]=i;r[i]<n&&a[r[i]+]%a[i]==;r[i]=r[r[i]+]);
for(int i=;i<=n;i++)
ans=max(ans,r[i]-l[i]+);
printf("%d\n",ans);
return ;
}

后来发现 我和AC之间就差了几个优化。

#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 4000001
using namespace std;
template<typename T>
inline void read(T&w){
char c;
while(!isdigit(c=getchar()));w=c&;
while(isdigit(c=getchar()))w=w*+(c&);
}
inline char smax(int&x,const int&y){return x<y?x=y,:;}
int n,ans;
int l[MAXN],r[MAXN];
long long a[MAXN];
int main(){
read(n);
for(int i=;i<=n;i++)
read(a[i]);
for(int i=;i<=n;i++)
for(int j=i-;j>=;j--){
if(a[j]%a[i]==){ l[i]+=l[j]+;j=j-l[j]; }
else if(a[j]%a[i]!=) break;
}
for(int i=n;i>=;i--)
for(int j=i+;j<=n;j++){
if(a[j]%a[i]==){ r[i]+=r[j]+;j=j+r[j]; }
else if(a[j]%a[i]!=) break;
}
for(int i=;i<=n;i++)
smax(ans,r[i]+l[i]+);
printf("%d\n",ans);
}

这里面那些我也看不懂的东西就是加的优化。

链接:https://www.nowcoder.com/acm/contest/175/C
来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

你需要在一条无限长的道路上喷洒杀虫剂。
在这条道路上,总共有 N 个投放点,其中第 i 个投放点在数轴上坐标 pi 处。在每一个投放点,你可以选择往左喷洒或往右喷洒。但是由于风向和地理环境的影响,向左喷洒和向右喷洒的效果不一定相同。具体来说,在一个位置向左喷洒,可以覆盖 [pi - li, pi] 这一段区域,而向右喷洒可以覆盖 [pi, pi + ri] 这一段区域。
请你决定每个投放点是向左喷洒还是向右喷洒,来使得被杀虫剂覆盖的路段长度和最大。

输入描述:

第一行 N。
接下来 N 行,每行

输出描述:

输出最大的被杀虫剂覆盖的长度和。

输入例子:
4
1 2 2
3 3 3
4 3 3
6 2 2
输出例子:
9

-->

示例1

输入

复制

4
1 2 2
3 3 3
4 3 3
6 2 2

输出

复制

9

说明

让第一个和第三个投放点向左喷洒,其他投放点向右喷洒。

这样能覆盖的区域是 $[-1,8]$,总长度为 9。

备注:

 
感觉是个DP但是只能想出三维的,所以就写了线段树。
f[i][j][k]表示到第i个为止有j个向左,k个向右所能覆盖的最长长度,然后就没写。
期望40 实际 0
QwQ 好吧。。。我本来就没对线段树抱多大期望。。。。
/*
首先 对于第3.4个测试点的20分的暴力是很好想的 因为他的ri全部是0
然后是1.2号测试点可以暴力一下看看每个点是向左还是向右,
时间复杂度大约是O(2^n); 至于修改操作,当然不能挨着修改,挨着查询,赶脚可以用(线段树)搞一下。
但是看看区间长度,感觉需要离散化搞一下,但我离散写的不好,就不写了。
期望得分 40;
*/
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,R=;
long long ans;
int decide[];
struct nond{
int p,l,r;
}v[];
struct non{
int l,r,flag,dis;
}tree[*];
void up(int now){
tree[now].dis=tree[now*].dis+tree[now*+].dis;
}
void build(int now,int l,int r){
tree[now].l=l;tree[now].r=r;
tree[now].flag=;
if(tree[now].l==tree[now].r){
tree[now].dis=;
return ;
}
int mid=(tree[now].l+tree[now].r)/;
build(now*,l,mid);
build(now*+,mid+,r);
up(now);
}
void down(int now){
tree[now*].flag=;tree[now*+].flag=;
tree[now*].dis=tree[now*].r-tree[now*].l+;
tree[now*+].dis=tree[now*+].r-tree[now*+].l+;
tree[now].flag=;
}
void change(int now,int optl,int optr){
if(tree[now].l==optl&&tree[now].r==optr){
tree[now].dis=tree[now].r-tree[now].l+;
tree[now].flag=;
return ;
}
if(tree[now].flag) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(optr<=mid) change(now*,optl,optr);
else if(optl>mid) change(now*+,optl,optr);
else {
change(now*,optl,mid);
change(now*+,mid+,optr);
}
up(now);
}
long long work(){
for(int i=;i<=n;i++)
if(decide[i]==-) change(,v[i].p-v[i].l,v[i].p);
else if(decide[i]==) change(,v[i].p,v[i].p+v[i].r);
return tree[].dis;
}
void dfs(int tot,int now){
if(now==tot+){
ans=max(ans,work());
build(,,R);
return ;
}
decide[now]=-;dfs(tot,now+);decide[now]=;
decide[now]=;dfs(tot,now+);decide[now]=;
}
int main(){
scanf("%d",&n);int add=,sum=;
for(int i=;i<=n;i++){
scanf("%d%d%d",&v[i].p,&v[i].l,&v[i].r);
if(v[i].p-v[i].l<) add=v[i].l-v[i].p+;
if(v[i].r==) sum++;
R=max(R,v[i].p+v[i].r);
}
for(int i=;i<=n;i++) v[i].p+=add;
R+=add;
build(,,R);
if(n<=){
dfs(n,);
printf("%lld",ans-);
}
else if(sum==n){
for(int i=;i<=n;i++)
change(,v[i].p-v[i].l,v[i].p);
printf("%lld",tree[].dis-);
}
}

0

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 3010
using namespace std;
int N,H;
int f[MAXN][MAXN*];
int h[MAXN*],P[MAXN*],L[MAXN*];
struct nond{
int p,l,r;
}v[MAXN];
int cmp(nond a,nond b){
return a.p<b.p;
}
int main(){
scanf("%d",&N);
for(int i=;i<=N;i++){
scanf("%d%d%d",&v[i].p,&v[i].l,&v[i].r);;
h[++H]=v[i].p-v[i].l;
h[++H]=v[i].p;
h[++H]=v[i].p+v[i].r;
}
sort(v+,v++N,cmp);
sort(h+,h+H+);
H=unique(h+,h+H+)-h-;
for(int i=;i<=N;i++){
int id=lower_bound(h+,h+H+,v[i].p)-h;
P[id]=i;
L[id]=lower_bound(h+,h+H+,v[i].p-v[i].l)-h;
}
for(int i=;i<=N;i++){
const int p=lower_bound(h+,h+H+,v[i].p)-h;
const int l=lower_bound(h+,h+H+,v[i].p-v[i].l)-h;
const int r=lower_bound(h+,h+H+,v[i].p+v[i].r)-h;
int *F=::f[i];//??可能是定义一个数组F,f
const int *G=::f[i-],hp=h[p];
memcpy(F+,G+,H<<);
for(int j=l+;j<=p;j++)
F[j]=max(F[j],F[j-]+h[j]-h[j-]);
for(int j=p+,Max=G[p];j<=r;j++){
F[j]=max(F[j],Max+h[j]-hp);
if(P[j]&&L[j]<p)
Max=max(Max,hp-h[L[j]]+G[L[j]]);
}
for(int j=;j<=H;j++)
F[j]=max(F[j],F[j-]);
}
printf("%d\n",f[N][H]);
}

18.10.7 POIN 模拟赛的更多相关文章

  1. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  2. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  3. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  4. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  5. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  6. 18.9.23 PION模拟赛

    U32670 小凯的数字 题目背景 NOIP2018 原创模拟题T1 NOIP DAY1 T1 or DAY 2 T1 难度 是否发现与NOIP2017 DAY1 T1 有异曲同工之妙 说明:#10, ...

  7. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  8. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  9. 2018.10.29 NOIP2018模拟赛 解题报告

    得分: \(70+60+0=130\)(\(T3\)来不及打了,结果爆\(0\)) \(T1\):简单的求和(点此看题面) 原题: [HDU4473]Exam 这道题其实就是上面那题的弱化版,只不过把 ...

随机推荐

  1. 用RecyclerView做一个小清新的Gallery效果

    一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...

  2. php防止页面刷新代码

    //代理IP直接退出 empty($_SERVER['HTTP_VIA']) or exit('Access Denied'); //防止快速刷新 session_start(); $seconds ...

  3. iOS Programming Localization 本地化

    iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...

  4. Javaweb项目构建常见问题

    eclipse中 将java项目转换为web项目 1.找到项目工作空间目录,打开.project文件,并修改文件, 修改如下:      找到:<natures> </natures ...

  5. 洛谷 P3388 【模板】割点

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  6. html5开发移动混合App系列2-开发环境搭建(windows)

    Java下载: http://www.oracle.com/technetwork/java/javase/downloads/index.html 环境变量: JAVA_HOME=C:\Progra ...

  7. 理解 call, apply 的用法

    callcall() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数. function list() { return Array.prototype.slice.call ...

  8. formSelects-v4.js 基于Layui的多选解决方案

    https://hnzzmsf.github.io/example/example_v4.html

  9. Java SE、Java EE、Java ME 三者区别

    现在一个个来分析 1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 ...

  10. JS Object 属性判断

    in 方法 var shapeInfo = {name:“lium”}; if (“name” in shapeInfo) {...}