11.1 考试 数论+数论+二分
来源:互联网 发布:c 游戏编程基础 编辑:程序博客网 时间:2024/05/19 23:15
T1:
额,可以直接暴力,或二分,或者像我这么SB 地分解质因数;
#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>#include<iostream>using namespace std;typedef long long ll;const ll MAXN=1000001;bool flag=0;ll is_p[MAXN];bool not_p[MAXN];ll tot,T,n;void euler(){ not_p[1]=true; for(ll i=2;i<=1000001;i++) { if(!not_p[i]) is_p[++tot]=i; for(ll j=1;j<=tot;j++) { if(i*is_p[j]>1000001) break; not_p[i*is_p[j]]=1; if(i % is_p[j]==0) break; } } return;}inline void calc(ll x){ flag=0; for(ll i=1;i<=tot;i++) { if(x==1) {flag=1;return;} else if(x % is_p[i]==0) { ll cnt=0; while(x%is_p[i]==0 && x) x/=is_p[i],cnt++; if(cnt%3) {flag=0;return;} } } return;}void solve(){ euler(); cin>>T; while(T--) { cin>>n; if(n==1) { printf("YES\n");continue; } if(n<=0) { printf("NO\n");continue; } calc(n); if(flag) printf("YES\n"); else printf("NO\n"); } return;}int main(){ solve(); return 0;}
p = a ^ 3-b ^ 3=(a - b) * (a ^ 2 + a * b + b ^ 2);
因为p是质数,所以a - b = 1;
二分即可;
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<set>using namespace std;typedef long long ll;ll n,T,l,r;bool flag;bool check(ll x){ ll tot=3*x*x-3*x+1; if(tot==n) { flag=1;return true; } else if(tot>n) return false; else return true;}void solve(){ scanf("%lld",&T); while(T--) { l=0,r=100001,flag=0; scanf("%lld",&n); while(r - l > 1) { ll mid=(l+r)>>1; if(check(mid)) l=mid; else r=mid; if(flag) break; } if(!flag) printf("NO\n"); else printf("YES\n"); }}int main(){ solve(); return 0;}
大佬们都用并查集,可是我不会啊~
我只会线段树的解法;
复杂度 : O(nlog^2n);
好像比并查集快一点点~
~~哈哈
注意两种不合法的情况:
1.
2.
上面的两个符合分别是交集,并集的意思;
然后二分,直接模拟就好了~~~
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN=4000001;int n,jl,jr,bl,br,T,l,r;int b[MAXN],delta[MAXN];struct hh {int l,r,c;}ma[MAXN],ss[MAXN];struct sh {int l,r;}tree[MAXN];inline bool cmp(hh a,hh b) {return a.c>b.c;}inline int max(int a,int b) { return a>b?a:b;}inline int min(int a,int b) {return a<b?a:b;}inline int read(){ int ss=0; char c=getchar(); while(c<'0' || c>'9') c=getchar(); while(c>='0' && c<='9') ss=ss*10+c-'0',c=getchar(); return ss;}inline void build_tree(int now,int l,int r){ int mid=(l+r)>>1; tree[now].l=l,tree[now].r=r; b[now]=0,delta[now]=0; if(l==r) return; build_tree(now<<1,l,mid); build_tree(now<<1|1,mid+1,r); return;}inline void push(int now){ if(delta[now]) { b[now<<1]=tree[now<<1].r-tree[now<<1].l+1; b[now<<1|1]=tree[now<<1|1].r-tree[now<<1|1].l+1; delta[now<<1]=delta[now<<1|1]=1; delta[now]=0; } return;}inline void change(int now,int l,int r,int v){ int mid=(tree[now].r+tree[now].l)>>1; if(tree[now].l>=l && tree[now].r<=r) { b[now]=tree[now].r-tree[now].l+1,delta[now]=v;return; } push(now); if(l<=mid) change(now<<1,l,r,v); if(r>=mid+1) change(now<<1|1,l,r,v); b[now]=b[now<<1]+b[now<<1|1]; return;}inline int query(int now,int l,int r){ int ans=0,mid=(tree[now].l+tree[now].r)>>1; if(tree[now].l>=l && tree[now].r<=r) return b[now]; push(now); if(l<=mid) ans+=query(now<<1,l,r); if(r>=mid+1) ans+=query(now<<1|1,l,r); return ans;}inline bool check(int x){ memset(b,0,sizeof(b)); memset(delta,0,sizeof(delta)); for(int i=1;i<=x;i++) ss[i]=ma[i]; sort(ss+1,ss+x+1,cmp);//排序,从大到小; br=jr=ss[1].r,bl=jl=ss[1].l; for(int i=2;i<=x;i++) { if(ss[i].c==ss[i-1].c) { if(ss[i].l>br || ss[i].r<bl) return false;//最小值相同的区域没有交集,不合法; br=max(br,ss[i].r),jr=min(jr,ss[i].r); bl=min(bl,ss[i].l),jl=max(jl,ss[i].l); } else { if(query(1,jl,jr)==jr-jl+1) return false;//交集所在区域已经染过色,不合法; change(1,bl,br,1);//将并集全部染色,如图2; jl=bl=ss[i].l,jr=br=ss[i].r; } } if(query(1,jl,jr)==jr-jl+1) return false; else return true;}void solve(){ n=read(),T=read(); for(int i=1;i<=T;i++) ma[i].l=read(),ma[i].r=read(),ma[i].c=read(); build_tree(1,1,n); l=1,r=T+1; while(r - l > 1) { int mid=(l+r)>>1; if(check(mid)) l=mid; else r=mid; } printf("%d\n",r); return;}int main(){ solve(); return 0;}
阅读全文
1 0
- 11.1 考试 数论+数论+二分
- FZU 1988 二分+数论
- uva11428(数论+二分)
- SPOJ_TBATTLE:Thor_vs_Frost_Giants(数论+二分)
- SPOJ FACVSPOW 数论+二分
- SPOJ FACVSPOW(数论+二分)
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论 ?
- [luogu模拟赛] 11.1
- 金融人士如何建立自己的人脉?
- 输出一个数组第二大的数
- spark 报错ypeError: expected string or Unicode object, NoneType found
- sarpk安装依赖包特别慢的时候
- 11.1 考试 数论+数论+二分
- C++ 数据抽象
- UITabBarController(三)自定义UITabBar方式二
- 深入理解Java虚拟机:JVM高级特性与最佳实践 第2版 高清PDF [转载]
- 延迟与定时任务
- 1002: C语言程序设计教程(第三版)课后习题1.6
- HDU 5573 Binary Tree ACM/ICPC 2015 Shanghai(构造)
- 三种比较排序算法,java实现
- 了解非堆内存的参数配置