2017 Multi-University Training Contest - Team 4

1003

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> pri;
#define ll long long
#define mod 998244353
#define maxn 1000001
ll res[maxn];
vector<int> head[maxn];
int check[maxn];
ll num[maxn];

int main(){
    memset(check,0,sizeof(check));
    for(int i = 2;i < 1000001;i ++){
        if(check[i] == 0)
            pri.push_back(i);
        for(int j = i;j < maxn; j+=i)
            check[j] = 1;
    }
    int t;
    ll l,r,k;
    cin>>t;
    while(t--){
        cin>>l>>r>>k;
        for(int i = 0;i <= r - l; i++){
            res[i] = l+i;
            head[i].clear();
            num[i] = 1;
        }
        ll ans = 0;
        for(int i = 0;i < pri.size(); i++){
            int p = pri[i];
            ll be = (l+p-1)/p*p;
            while(be <= r){
                int x = 0;
                while(res[be-l]%p==0){
                    res[be-l] /= p;
                    x++;
                }
                num[be-l] = num[be-l] *(1+k*x) %mod;
                be += p;
            }
        }
        for(int i = 0;i <= r - l;i++){
            if(res[i] != 1) num[i] = num[i] *(1+k)%mod;

            ans += num[i];
            ans %= mod;
        }
        cout<<ans<<endl;


    }

}


1004 真题靠运气的乱搞的,跑了3s左右

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
#define maxn 60007
int tree[maxn];

int get(int p){
    int s = 0;
    while(p > 0){
        s += tree[p];
        p -= p&(-p);
    }
    return s;
}
void set(int p,int s){
    while(p < maxn){
        tree[p] += s;
        p += p&(-p);
    }
}
int nextt[maxn],pla[maxn];
int num[maxn];


int main(){
    int t,n;
    cin>>t;
    while(t--){
        scanf("%d",&n);
        for(int i = 1;i <= n; i++){
            pla[i] = maxn-1;
            scanf("%d",&num[i]);
        }
        for(int i = n;i > 0; i--){
            nextt[i] = pla[num[i]];
            pla[num[i]] = i;
        }
        memset(tree,0,sizeof(tree));
        for(int i = 1;i <= n; i++){
            if(pla[num[i]] != -1)
                set(i,1);
            pla[num[i]] = -1;
        }
        int k = sqrt(n);
        long long up = 1,down = 1;
        for(int i = 1;i <= n; i++){
            int p = i;
            for(int j = i + k;;j+=k){
                int u = get(p);
                if(j > n) j = n;
                int ud = get(j) - u;
                ud = j - p - ud;
                int d = p - i + 1 + ud;
                if(up *  d > down * u){
                    for(int q = p+1; q <= j; q++){
                        d = q - i + 1;
                        u = get(q);
                        if(up * d > down * u){
                            up = u;
                            down = d;
                        }

                    }
                }
                p = j;
                if(j == n) break;
            }
            set(i,-1);
            set(nextt[i],1);
        }
        printf("%0.8f\n",1.0*up / down);
    }
}

/**
100
5
1 2 1 2 3
6
1 2 1 2 1 2
5
1 1 1 1 1
8
1 2 1 2 1 2 1 2
9
3 1 2 1 2 1 2 1 2

*/




09

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;




int main(){
    int t,u,n;
    cin>>t;
    while(t--){
        int odd = 0;
        cin>>n;
        for(int i = 0;i < n; i++){
            scanf("%d",&u);
            if(u & 1) odd++;
        }
        if(odd >= n - odd) cout<<"2 1"<<endl;
        else cout<<"2 0"<<endl;
    }

}
/**

1
.XX...XX.....XX...XX.
X..X....X......X.X..X
X..X....X.X....X.X..X
......XX.....XX...XX.
X..X.X....X....X.X..X
X..X.X.........X.X..X
.XX...XX.....XX...XX.


*/

11

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;

char map[7][21];
int result[7];
int work(int x,int y){
    memset(result,0,sizeof(result));
    if(map[x][y+1] == 'X') result[0] = 1;
    if(map[x+1][y] == 'X') result[1] = 1;
    if(map[x+1][y+3] == 'X') result[2] = 1;
    if(map[x+4][y] == 'X') result[3] = 1;
    if(map[x+4][y+3] == 'X') result[4] = 1;
    if(map[x+3][y+1] == 'X') result[5] = 1;
    if(map[x+6][y+1] == 'X') result[6] = 1;
    if(result[1]){ //0 4 5 6 8 9
        if(result[0] == 0) return 4;
        if(result[5] == 0) return 0;
        if(result[3] == 0){
            if(result[2] == 0) return 5;
            return 9;
        }
        if(result[2] == 0) return 6;
        return 8;
    }
    else { //1 2 3 7
        if(result[0] == 0) return 1;
        if(result[3] == 1) return 2;
        if(result[5] == 1) return 3;
        return 7;

    }


}

int main(){
    int t;
    cin>>t;
    while(t--){
        for(int i = 0;i < 7; i++)
            cin>>map[i];

        int x;
        x = work(0,0);
        cout<<x;
        x = work(0,5);
        cout<<x;
        cout<<":";
        x = work(0,12);
        cout<<x;
        x = work(0,17);
        cout<<x<<endl;;





    }

}
/**

1
.XX...XX.....XX...XX.
X..X....X......X.X..X
X..X....X.X....X.X..X
......XX.....XX...XX.
X..X.X....X....X.X..X
X..X.X.........X.X..X
.XX...XX.....XX...XX.


*/

12
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> pri;
#define ll long long
#define mod 998244353
#define maxn 2001
int a[maxn],b[maxn];
ll up[maxn],down[maxn];
int main(){
    int t,n,m;
    cin>>t;
    while(t--){
        cin>>n>>m;
        for(int i = 0;i < n; i++)
            scanf("%d",&a[i]);
        for(int j = 0;j < m; j++)
            scanf("%d",&b[j]);
        memset(up,0,sizeof(up));
        memset(down,0,sizeof(down));
        ll ans = 0;
        for(int i = 0;i < n; i++){
            ll s = 0; //up
            for(int j = 0;j < m; j++){
                if(b[j] == a[i]){
                    up[j] += s + 1;
                    ans = (ans + s + 1) % mod;
                    up[j] %= mod;
                }
                if(b[j] > a[i]){
                    s += down[j];
                    s %= mod;
                }
            }
            s = 0;
            for(int j = 0;j < m; j++){
                if(b[j] == a[i]){
                    down[j] += s;
                    down[j] %= mod;
                    ans = (ans + s) % mod;
                }
                if(b[j] < a[i]){
                    s += up[j];
                }
            }
        }
        cout<<ans<<endl;
    }

}

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GDRetop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值