佳木斯集训Day5
今天是ACM赛制...本来可以400的,结果毒瘤T2模拟硬生生卡掉了我90分
T1是个大水题,找规律,5分钟AC没啥压力
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll ans,n; 5 bool ju; 6 int p; 7 int main() 8 { 9 cin>>p; 10 while(p--) 11 { 12 cin>>n; 13 ju=0; 14 int t5=0,t3=0,t2=0; 15 while(n!=1&&(n%5==0||n%3==0||n%2==0)) 16 { 17 if(n%5==0) 18 { 19 t5++; 20 n/=5; 21 ju=1; 22 } 23 if(n%3==0) 24 { 25 t3++; 26 n/=3; 27 ju=1; 28 } 29 if(n%2==0) 30 { 31 t2++; 32 n/=2; 33 } 34 } 35 if(n==1) 36 cout<<t5*3+t3*2+t2<<endl; 37 else 38 cout<<-1<<endl; 39 40 } 41 }
T2啊啊啊啊,双向队列,直接模拟就好了嘛,
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define MAXN 2000500 4 using namespace std; 5 ll a[MAXN],b[MAXN],q,maxn=-5,pos,nw; 6 ll f[MAXN],c[MAXN],manx=-5,mm=0; 7 ll md; 8 bool vis[MAXN]; 9 int main() 10 { 11 ll n; 12 cin>>n>>q; 13 for(int i=1;i<=n;i++) 14 { 15 scanf("%lld",&a[i]); 16 b[1]=a[1];c[1]=a[1]; 17 if(i>1) 18 { 19 if(a[i]>b[i-1]) 20 { 21 vis[i]=1; 22 b[i]=a[i]; 23 c[i]=b[i-1]; 24 } 25 else 26 { 27 c[i]=a[i]; 28 b[i]=b[i-1]; 29 } 30 31 } 32 if(a[i]>maxn) 33 { 34 pos=i; 35 maxn=a[i]; 36 } 37 } 38 for(int i=0;i<n+1;i++) 39 f[i]=c[i+2]; 40 for(int i=1;i<=q;i++) 41 { 42 ll x; 43 scanf("%lld",&x); 44 if(x<pos) 45 { 46 if(vis[x+1]) 47 printf("%lld %lld\n",c[x+1],b[x+1]); 48 // cout<<c[x+1]<<" "<<b[x+1]<<endl; 49 else 50 printf("%lld %lld\n",b[x+1],c[x+1]); 51 } 52 else 53 //cout<<maxn<<" "<<f[(x-1)%(n-1)]; 54 printf("%d %d\n",maxn,f[(x-1)%(n-1)]); 55 } 56 }
T3也是类似于找规律的
1 #include <bits/stdc++.h> 2 #define MAXN 100500 3 using namespace std; 4 int a[MAXN],b[MAXN],ans,x,start[MAXN],ed[MAXN]; 5 int n,m; 6 int main() 7 { 8 cin>>n>>m; 9 for(int i=1;i<=m;i++) 10 { 11 cin>>a[i]; 12 b[a[i]]++; 13 if(!start[a[i]]) 14 start[a[i]]=i; 15 } 16 for(int i=m;i>=1;i--) 17 { 18 if(!ed[a[i]]) 19 ed[a[i]]=i; 20 } 21 for(int i=1;i<=n;i++) 22 { 23 if(!b[i]) 24 { 25 if(i!=1&&i!=n) 26 ans+=3; 27 else 28 ans+=2; 29 } 30 else 31 { 32 if(ed[i-1]<start[i]&&i!=1) 33 ans++; 34 if(ed[i+1]<start[i]&&i!=n) 35 ans++; 36 } 37 } 38 cout<<ans<<endl; 39 }
T4是A层的F题,他们上午考的,当时开考的时候我还在想T2就有好多人AC直接吓死我
我看了看题,发现直接是一个初中的因式分解题,挺水的,然后直接过的
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll n,p,k; 5 ll a[1000050]; 6 ll c=0,ans=0; 7 int main() 8 { 9 10 cin>>n>>p>>k; 11 for(ll i=1;i<=n;i++) 12 { 13 cin>>a[i]; 14 a[i]=(a[i]*a[i]%p*a[i]%p*a[i]-k*a[i]%p+p)%p; 15 } 16 sort(a+1,a+1+n); 17 for(ll i=2;i<=n;i++) 18 { 19 if(a[i-1]==a[i]) 20 { 21 c++; 22 ans+=c; 23 } 24 else 25 c=0; 26 } 27 cout<<ans<<endl; 28 }
T5正解权值线段树,其实和本身的线段树没什么大的区别,题基本上是裸的权值线段树
1 #include <bits/stdc++.h> 2 #define ls k<<1 3 #define rs k<<1|1 4 #define mid (l+r)/2 5 using namespace std; 6 const int MAXN=1e6+5; 7 int m[MAXN<<2],ans[MAXN<<2],a[MAXN<<2]; 8 int n,m1,q,x,a1,b,c; 9 struct Tree{ 10 int sign,sum; 11 }t[4001000]; 12 void up(int k) 13 { 14 t[k].sum=min(t[ls].sum,t[rs].sum); 15 } 16 void build(int k,int l,int r) 17 { 18 if(l==r) 19 { 20 t[k].sum=1000000000; 21 return ; 22 } 23 build(ls,l,mid); 24 build(rs,mid+1,r); 25 up(k); 26 } 27 void signdown(int k) 28 { 29 if(t[k].sign==0) 30 return ; 31 t[ls].sum+=t[k].sign; 32 t[rs].sum+=t[k].sign; 33 t[ls].sign+=t[k].sign; 34 t[rs].sign+=t[k].sign; 35 t[k].sign=0; 36 } 37 38 void add(int k,int l,int r,int from,int to,int v) 39 { 40 if(l>=from&&r<=to) 41 { 42 t[k].sign+=v; 43 t[k].sum+=v; 44 return ; 45 }signdown(k); 46 if(from<=mid) 47 add(ls,l,mid,from,to,v); 48 if(to>mid) 49 add(rs,mid+1,r,from,to,v); 50 up(k); 51 } 52 int ask(int k,int l,int r) 53 { 54 if(t[k].sum>=0)return -1; 55 if(l==r)return l; 56 signdown(k); 57 if(t[rs].sum<0)return ask(rs,mid+1,r); 58 else return ask(ls,l,mid); 59 } 60 int main() 61 { 62 scanf("%d%d%d",&n,&m1,&q); 63 build(1,1,1000000); 64 for(int i=1;i<=n;i++) 65 { 66 scanf("%d",&a[i]); 67 ans[a[i]]++; 68 if(ans[a[i]]==1) 69 add(1,1,1000000,a[i],a[i],-1000000000); 70 add(1,1,1000000,1,a[i],-1); 71 } 72 for(int i=1;i<=m1;i++) 73 { 74 scanf("%d",&m[i]); 75 add(1,1,1000000,1,m[i],1); 76 } 77 for(int i=1;i<=q;i++) 78 { 79 scanf("%d%d%d",&a1,&b,&c); 80 if(a1==1) 81 { 82 add(1,1,1000000,1,a[b],1); 83 ans[a[b]]--; 84 if(ans[a[b]]==0) 85 add(1,1,1000000,a[b],a[b],1000000000); 86 a[b]=c; 87 add(1,1,1000000,1,a[b],-1); 88 ans[a[b]]++; 89 if(ans[a[b]]==1) 90 add(1,1,1000000,a[b],a[b],-1000000000); 91 } 92 else 93 { 94 add(1,1,1000000,1,m[b],-1); 95 m[b]=c; 96 add(1,1,1000000,1,m[b],1); 97 } 98 printf("%d\n",ask(1,1,1000000)); 99 } 100 return 0; 101 }
T6是个DP,不断的拓展,实在不会,题解可以看得懂,就是代码敲不出来,2333