考前集训(day1上)
2017-10-29 11:39
225 查看
t1
cublic
LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。
现在给定一个数P,LYK想要知道这个数是不是立方数。
当然你有可能随机输出一些莫名其妙的东西来骗分,因此LYK有T次询问~
离线做,模拟一下,极端数据0.015秒,也可以预处理用map搞一下,最极端数据0.6秒,不会超时
t2 cubicp
LYK还定义了一个数叫“立方差数”,若一个数可以被写作是两个立方数的差,则这个数就是“立方差数”,例如7(8-1),26(27-1),19(27-8)都是立方差数。
现在给定一个数P,LYK想要知道这个数是不是立方差数。
当然你有可能随机输出一些莫名其妙的东西,因此LYK有T次询问~
这个问题可能太难了…… 因此LYK规定P是个质数!
和第一题一样,离线做
只需要改几个字符就行了
由(a3−b3)=(a−b)(a2+a∗b+b2)得
又因为是质数
(a−b)或(a2+a∗b+b2)==1
而(a2+a∗b+b2)=(a−b)2+3∗a∗b
a,b∈z∗,3∗a∗b>=3
所以(a−b)=1
所以枚举a,b就行了
而b=a+1
只需要枚举a就行了
立方差数就是1+3∗a∗b=1+3∗a∗(a+1)
t3
不会。。。
std
cublic
LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。
现在给定一个数P,LYK想要知道这个数是不是立方数。
当然你有可能随机输出一些莫名其妙的东西来骗分,因此LYK有T次询问~
离线做,模拟一下,极端数据0.015秒,也可以预处理用map搞一下,最极端数据0.6秒,不会超时
#include<cstdio> #include<map> #include<algorithm> #include<ctime> #define ll long long using namespace std; struct st { ll s;int id; }p[101]; int t; bool cmp(const st& a,const st&b){ return a.s<b.s; } bool ans[101]; int main(){ freopen("cubic.in","r",stdin); freopen("cubic.out","w",stdout); scanf("%d",&t); for(int i=1;i<=t;i++) scanf("%lld",&p[i].s),p[i].id=i; sort(p+1,p+t+1,cmp); int j=1; for(int i=1;i<=1000000&&j<=t;i++) { while(1ll*i*i*i>p[j].s&&j<=t) j++; while(1ll*i*i*i==p[j].s&&j<=t) ans[p[j++].id]=1; } for(int i=1;i<=t;i++) if(ans[i]) printf("YES\n"); else printf("NO\n"); //printf("%.9lf",clock()/1000.0); }
#include<cstdio> #include<map> #include<ctime> #include<iostream> #define ll long long using namespace std; map <ll,bool> f; int t; ll p; int main(){ freopen("cubic.in","r",stdin); freopen("cubic.out","w",stdout); scanf("%d",&t); for(int i=1;i<=1000000;i++) //printf("%lld ",1ll*i*i*i); f[1ll*i*i*i]=1; while(t--){ scanf("%lld",&p); if(f[p]) printf("YES\n"); else printf("NO\n"); } // printf("%.9lf",clock()/1000.0); }
t2 cubicp
LYK还定义了一个数叫“立方差数”,若一个数可以被写作是两个立方数的差,则这个数就是“立方差数”,例如7(8-1),26(27-1),19(27-8)都是立方差数。
现在给定一个数P,LYK想要知道这个数是不是立方差数。
当然你有可能随机输出一些莫名其妙的东西,因此LYK有T次询问~
这个问题可能太难了…… 因此LYK规定P是个质数!
和第一题一样,离线做
只需要改几个字符就行了
由(a3−b3)=(a−b)(a2+a∗b+b2)得
又因为是质数
(a−b)或(a2+a∗b+b2)==1
而(a2+a∗b+b2)=(a−b)2+3∗a∗b
a,b∈z∗,3∗a∗b>=3
所以(a−b)=1
所以枚举a,b就行了
而b=a+1
只需要枚举a就行了
立方差数就是1+3∗a∗b=1+3∗a∗(a+1)
#include<cstdio> #include<map> #include<algorithm> #include<ctime> #define ll long long using namespace std; struct st { ll s;int id; }p[101]; int t; const ll M=1e12; bool cmp(const st& a,const st&b){ return a.s<b.s; } bool ans[101]; int main(){ freopen("cubicp.in","r",stdin); freopen("cubicp.out","w",stdout); scanf("%d",&t); for(int i=1;i<=t;i++) scanf("%lld",&p[i].s),p[i].id=i; sort(p+1,p+t+1,cmp); int j=1; for(int i=1;1ll+3ll*i*(i+1)<=M&&j<=t;i++) { while(1ll+3ll*i*(i+1)>p[j].s&&j<=t) j++; while(1ll+3ll*i*(i+1)==p[j].s&&j<=t) ans[p[j++].id]=1; } for(int i=1;i<=t;i++) if(ans[i]) printf("YES\n"); else printf("NO\n"); //printf("%.9lf",clock()/1000.0); }
t3
不会。。。
std
#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)) int n, q, ans; int f ; struct node { int x, y, z; }p , t ; 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; } 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 = 1; i <= n + 1; i++) f[i] = i; for(i = 1; i <= k; i++) t[i] = p[i]; std::sort(t + 1, t + k + 1, cmp); lmin = lmax = t[1].x; rmin = rmax = t[1].y; for(i = 2; i <= k; i++) { if(t[i].z < t[i - 1].z) { if(find(lmax) > rmin) return 1; for(j = find(lmin); j <= rmax; j++) f[find(j)] = find(rmax + 1); 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 1; } } // cout<<find(1)<<endl; if(find(lmax) > rmin) return 1; return 0; } int main() { freopen("number.in","r",stdin); freopen("number.out","w",stdout); int i, x, y, mid; n = read(); q = read(); for(i = 1; i <= q; i++) p[i].x = read(), p[i].y = read(), p[i].z = read(); x = 1, y = q; //cout<<check(2)<<endl; //return 0; ans = q + 1; while(x <= y) { mid = (x + y) >> 1; if(check(mid)) ans = mid, y = mid - 1; else x = mid + 1; } printf("%d\n", ans); return 0; }
相关文章推荐
- 清华集训2014 day1 task1 玛里苟斯
- HN集训2015酱油记 - day1
- 国庆郑州集训day1 下午:基本算法
- 海淀驾校科目三考前集训
- 清华集训2014 day1 task2 主旋律
- CCNU ACM 2016夏季集训·day1
- loj6102 「2017 山东二轮集训 Day1」第三题
- 【集训Day1 测试】选择课题
- 福建省队集训被虐记——DAY1
- 集训总结day1
- 2017国庆郑州集训Day1
- 考前模拟,qbxt十月底day1下午
- loj 6030「雅礼集训 2017 Day1」矩阵
- 福建省队集训被虐记——DAY1
- 2017国庆郑州集训Day1
- 【2018暑假集训模拟一】Day1题解
- 「长乐集训 2017 Day1」区间 线段树
- 集训DAY1 机房测试(贪心,图论)
- 省队集训Day1 总统选举
- 省队集训Round3 DAY1