Day1上午解题报告
预计分数:100+60+0=160
实际分数:100+30+20=150
T1立方数(cubic)
题目描述
LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。
现在给定一个数P,LYK想要知道这个数是不是立方数。
当然你有可能随机输出一些莫名其妙的东西来骗分,因此LYK有T次询问~
输入输出格式
输入格式:
第一行一个数T,表示有T组数据。
接下来T行,每行一个数P。
输出格式:
输出T行,对于每个数如果是立方数,输出“YES”,否则输出“NO”。
输入输出样例
说明
对于30%的数据p<=100。
对于60%的数据p<=10^6。
对于100%的数据p<=10^18,T<=100。
这题做的我心累啊,,
我一看数据范围p<=1e18,也就是我们需要枚举到1e6,100组询问,最坏情况的话会T
此时我机(sha)智(bi)的把每次询问做离线处理
按照询问的权值排序,用双指针法,依次判断,
然后把询问按照入读的顺序排序,输出就好
不过,事实证明,
zhw没这么毒瘤,直接依次枚举就能A了。。。。。。。。。
看到标程的我眼泪流下来啊QWQ.......
include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
const LL MAXN=1e6+;
inline LL read()
{
char c=getchar();LL flag=,x=;
while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
}
LL n;
LL fastpow(LL a,LL p)
{
LL base=;
while(p)
{
if(p&) base=base*a;
a=a*a;
p>>=;
}
return base;
}
LL pow3[MAXN];
struct node
{
LL val;
LL pos;
bool flag;
node() { val=pos=flag=; }
}qus[];
LL tot=;
LL comp(const node &a,const node &b)
{
return a.val<b.val;
}
LL comp2(const node &a,const node &b)
{
return a.pos<b.pos;
}
int main()
{
//freopen("cubic.in","r",stdin);
//freopen("cubic.out","w",stdout);
for(LL i=;i<=1e6+;i++)
pow3[i]=fastpow(i,);
LL n=read();
while(n--)
{
qus[++tot].val=read();
qus[tot].pos=tot;
}
sort(qus+,qus+tot+,comp);
LL now=;//处理到第几个
for(LL i=;i<=1e6+;i++)
{
while(pow3[i]>qus[now].val&&now<=tot) now++;
while(pow3[i]==qus[now].val&&now<=tot) qus[now].flag=,now++;
}
sort(qus+,qus+tot+,comp2);
for(LL i=;i<=tot;i++)
{
if(qus[i].flag==) printf("NO\n");
else printf("YES\n");
}
return ;
}
#include <bits/stdc++.h>
using namespace std;
long long A;
int T;
bool work(long long x)
{
for (int i=; ; i++)
{
if (1ll*i*i*i==x) return true;
if (1ll*i*i*i>x) return false;
}
}
int main()
{
freopen("cubic.in","r",stdin);
freopen("cubic.out","w",stdout);
scanf("%d",&T);
while (T--)
{
scanf("%I64d",&A);
if (work(A)) puts("YES"); else puts("NO");
}
return ;
}
标程
T2立方数2(cubicp)
题目描述
LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。
LYK还定义了一个数叫“立方差数”,若一个数可以被写作是两个立方数的差,则这个数就是“立方差数”,例如7(8-1),26(27-1),19(27-8)都是立方差数。
现在给定一个数P,LYK想要知道这个数是不是立方差数。
当然你有可能随机输出一些莫名其妙的东西,因此LYK有T次询问~
这个问题可能太难了…… 因此LYK规定P是个质数!
输入输出格式
输入格式:
第一行一个数T,表示有T组数据。
接下来T行,每行一个数P。
输出格式:
输出T行,对于每个数如果是立方差数,输出“YES”,否则输出“NO”。
输入输出样例
说明
对于30%的数据p<=100。
对于60%的数据p<=10^6。
对于100%的数据p<=10^12,T<=100。
打了个表,结果莫名奇妙少打了一个0
白丢30分。。
正解
$x^3-y^3$
$=(x-y)*(x^2+x*y+y^2)$
因为读入的是素数,所以$x-y==1$
可以得到$y=x-1$
把$y$带入
$=x^2+x*(x-1)+(x-1)^2$
$=3*x^2-3*x+1$
枚举一个x就好
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cstdlib>
#define LL long long
using namespace std;
inline int read()
{
char c=getchar();int flag=,x=;
while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
}
int main()
{
int n=read();
while(n--)
{
int p=read();bool flag=;
for(int i=;i<=1e6;i++)
{
if(*i*i-*i+==p)
{
flag=;
break;
}
}
if(flag==) printf("NO\n");
else printf("YES\n");
}
return ;
}
T3上午猜数字(number)
题目描述
LYK在玩猜数字游戏。
总共有n个互不相同的正整数,LYK每次猜一段区间的最小值。形如[li,ri]这段区间的数字的最小值一定等于xi。
我们总能构造出一种方案使得LYK满意。直到…… LYK自己猜的就是矛盾的!
例如LYK猜[1,3]的最小值是2,[1,4]的最小值是3,这显然就是矛盾的。
你需要告诉LYK,它第几次猜数字开始就已经矛盾了。
输入输出格式
输入格式:
第一行两个数n和T,表示有n个数字,LYK猜了T次。
接下来T行,每行三个数分别表示li,ri和xi。
输出格式:
输出一个数表示第几次开始出现矛盾,如果一直没出现矛盾输出T+1。
输入输出样例
说明
对于50%的数据n<=8,T<=10。
对于80%的数据n<=1000,T<=1000。
对于100%的数据1<=n,T<=1000000,1<=li<=ri<=n,1<=xi<=n(但并不保证一开始的所有数都是1~n的)。
Hint 建议使用读入优化
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
}
这题,,我确实逗逼了,,
一开始以为是裸地借教室
结果直到最后5分钟。。
我给自己找了个反例。。。。
GG.....
不过没想到还得了20分,,奇迹啊。。。
正解:
二分答案,有一个显然的结论
两个猜测的最小值如果相同的话那么这个最小值一定在这两个线段的交上
否则,一定在这两个线段的交集关于全集的补集上
当产生冲突的时候一定是权值小的一次猜测被几条比他权值大的猜测完全覆盖,
那么我们可以二分第几次不满足要求,用并查集维护线段的覆盖
时间复杂度:$O(nlgn*α(n))$
#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 1000011
#define min(x, y) ((x) < (y) ? (x) : (y))
#define max(x, y) ((x) > (y) ? (x) : (y))
using namespace std;
int n, q, ans;
int f[N]; struct node
{
int x, y, z;
}p[N], t[N]; inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline bool cmp(node x, node y)
{
return x.z > y.z;
} inline int find(int x)
{
return x == f[x] ? x : f[x] = find(f[x]);
} inline bool check(int k)
{
int i, j, x, y, lmin, lmax, rmin, rmax;
for(i = ; i <= n + ; i++) f[i] = i;
for(i = ; i <= k; i++) t[i] = p[i];
std::sort(t + , t + k + , cmp);
lmin = lmax = t[].x;
rmin = rmax = t[].y;
for(i = ; i <= k; i++)
{
if(t[i].z < t[i - ].z)
{
if(find(lmax) > rmin) return ;
for(j = find(lmin); j <= rmax; j++)
f[find(j)] = find(rmax + );
lmin = lmax = t[i].x;
rmin = rmax = t[i].y;
}
else
{
lmin = min(lmin, t[i].x);
lmax = max(lmax, t[i].x);
rmin = min(rmin, t[i].y);
rmax = max(rmax, t[i].y);
if(lmax > rmin) return ;
}
}
// cout<<find(1)<<endl;
if(find(lmax) > rmin) return ;
return ;
} int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
int i, x, y, mid;
n = read();
q = read();
for(i = ; i <= q; i++)
p[i].x = read(), p[i].y = read(), p[i].z = read();
x = , y = q;
//cout<<check(2)<<endl;
//return 0;
ans = q + ;
while(x <= y)
{
mid = (x + y) >> ;
if(check(mid)) ans = mid, y = mid - ;
else x = mid + ;
}
printf("%d\n", ans);
return ;
}
没时间写了贴个标程
总结
上午做的太急了,没怎么静下心来思考。
特别是T3,白敲了3k的线段树。。。。
不过,我上午的人品还是不错的
没错我指的是我被zhw rand到了2333333
Day1上午解题报告的更多相关文章
- ZROI Day1 比赛解题报告
ZROI Day1 比赛解题报告 版权原因不提供题面相关信息 序 前天晚上搞得比较晚,然后早上做题很没状态,刚看到T1发现没什么思路就有点慌,赶紧看了看T2,T3, 发现T3暴力很好打,T2想了一想可 ...
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
- noip2011提高组day1+day2解题报告
Day1 T1铺地毯https://www.luogu.org/problem/show?pid=1003 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
- 「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...
- Day2上午解题报告
预计分数:100+0+60=160 实际分数:100+0+60=160 mmpT1数据错了... T1遭遇 题目描述 你是能看到第一题的 friends呢. —— hja ?座楼房,立于城中 . 第? ...
- Day1下午解题报告
预计分数:0+30+30=60 实际分数:0+30+40=70 T1水题(water) 贪心,按长度排序, 对于第一幅牌里面的,在第二个里面,找一个长度小于,高度最接近的牌 进行覆盖. 考场上的我离正 ...
- Day3上午解题报告
预计分数:100+40+50=190 实际分数:100+40+50=190 T1 https://www.luogu.org/problem/show?pid=T15365 表示从来没做过博弈论的题, ...
- Day5上午解题报告
预计分数:100+40+30=170 实际假分数:0+0+0=0 CE*3 实际真分数:60+50+0=110 老师没把我的程序放的文件夹里面,于是..... T1 https://www.luogu ...
- Day4上午解题报告
预计分数:50 +0+0=50 实际分数:50+0+10=60 毒瘤出题人,T3不给暴力分 (*  ̄︿ ̄) T1 https://www.luogu.org/problem/show?pid=T155 ...
随机推荐
- Windows 10问题
微软修复Windows updat 工具WindowsUpdateDiagnostic.diagcab: http://download.microsoft.com/download/F/2/2/F2 ...
- 滑动切换Activity代码
最近需要对练习项目中的代码进行优化,发现很多代码写起来远比想象的困难很多.刚接触Android时间不长,很多东西都不能融会贯通,所以才会有这样的问题存在,当然学习中遇到的问题很有必要做个总结.想想这个 ...
- DefaultView 的作用(对DataSet查询出的来数据进行排序)
DefaultView 的作用 收藏 一直以来在对数据进行排序, 条件查询都是直接重复构建SQL来进行, 在查询次数和数据量不多的情况下倒没觉得什么, 但慢慢得, 当程序需要对大量数据椐不同条件 ...
- PostgreSQL Replication之第七章 理解Linux高可用(5)
7.5 高可用性是所有冗余 让我们从一个不同的角度看一下前面的混合超市的例子.为了处理大量顾客无需长排队,无需关闭超市,混合超市雇用更多的出纳员以及安装许多(甚至更多)的收银机. 这样,如果一个收银机 ...
- 20180929 北京大学 人工智能实践:Tensorflow笔记05
(完)
- python语法学习笔记
函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来 ...
- WebKit载入流程 - 概述
之前写了几篇载入流程的说明,是从下向上看,有点仅仅见树木不见森林的感觉.经过近期一段时间的学习,有了能加以概括抽象的方法. WebKit载入流程和页面组成是直接相关的,页面就是WebKit要载入的对象 ...
- [Recompose] Compose Streams of React Props with Recompose’s compose and RxJS
Functions created with mapPropsStream canned be composed together to build up powerful streams. Brin ...
- 树根 Digital root
数根 (又称数字根Digital root)是自然数的一种性质.换句话说.每一个自然数都有一个数根.数根是将一正整数的各个位数相加(即横向相加),若加完后的值大于等于10的话,则继续将各位数进行横向相 ...
- Cocos2d-x 3.0 Schedule in Node
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...