佳木斯集训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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

T6是个DP,不断的拓展,实在不会,题解可以看得懂,就是代码敲不出来,2333

猜你喜欢

转载自www.cnblogs.com/Lbmttw/p/11309068.html
今日推荐