2017-10-4 清北刷题冲刺班p.m

Posted Soda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017-10-4 清北刷题冲刺班p.m相关的知识,希望对你有一定的参考价值。

P102
zhx


a


【问题描述】
你是能看到第一题的 friends 呢。
——hja
两种操作:
1、加入一个数。
2、询问有多少个数是?的倍数。
【输入格式】
第一行一个整数?,代表操作数量。
接下来?行,每行两个数???,?。其中???表示是哪种操作,第二个?是操作的
参数。
【输出格式】
一行一个整数,代表所有询问答案的异或值。
【样例输入】
5
1 2
1 3
2 2
1 6
2 3
【样例输出】
3
【数据范围与规定】
对于第?组数据,? ≤ ? = 1000?。

技术分享
#include<iostream>
#include<cstdio>
#include<cmath>
#define maxn 400010
using namespace std;
int n,opt,x,sum[maxn];
long long ans=0;
int main(){
    //freopen("a.in","r",stdin);
    freopen("a.in","r",stdin);freopen("a.out","w",stdout);
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&opt,&x);
        if(opt==1){//插入一个数 
            int i;
            for(i=1;i*i<x;i++){
                if(x%i==0){
                    sum[i]++;
                    sum[x/i]++;
                }
            }
            int w=sqrt(x);
            if(w*w==x)sum[w]++;
        }
        if(opt==2)
            ans=ans^sum[x];
    }
    cout<<ans;
    fclose(stdin);fclose(stdout);
    return 0;
}
100分

 

b


【问题描述】
你是能看到第二题的 friends 呢。
——laekov
Hja 有一棵?个点的树,树上每个点有点权,每条边有颜色。一条路径的权
值是这条路径上所有点的点权和,一条合法的路径需要满足该路径上任意相邻
的两条边颜色都不相同。问这棵树上所有合法路径的权值和是多少。
【输入格式】
第一行一个数?。
一行?个数代表每个点的权值。
接下来? − 1行每行三个整数?,?,?,代表?到?之间有一条颜色为?的边。
【输出格式】
一行一个整数代表答案。
【样例输入】
6
6 2 3 7 1 4
1 2 1
1 3 2
1 4 3
2 5 1
2 6 2
【样例输出】
134
【数据范围与规定】
30%的数据,1 ≤ ? ≤ 1000。
数据随机 另外20%的数据,是一条链。
对于100%的数据,1 ≤ ? ≤ 3 × 10 5 ,1 ≤ ? ≤ 10 9 。

技术分享
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 300010
int n,w[maxn],num,head[maxn],s[maxn],col[maxn],nu[maxn];
bool vis[maxn];
long long ans;
struct node{
    int to,pre,v;
}e[maxn*2];
void Insert(int from,int to,int v){
    e[++num].to=to;
    e[num].v=v;
    e[num].pre=head[from];
    head[from]=num;
}
bool flag;
void dfs(int now,int father,int sum){
    flag=0;ans+=sum;
    for(int i=head[now];i;i=e[i].pre){
        int to=e[i].to;
        if(e[i].v==father)continue;
        flag=1;
        dfs(to,e[i].v,sum+w[to]);
    }
}
int du[maxn];
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("b.in","r",stdin);freopen("b.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&w[i]);
    int x,y,z;
    for(int i=1;i<n;i++){
        scanf("%d%d%d",&x,&y,&z);
        Insert(x,y,z);Insert(y,x,z);
        du[x]++;du[y]++;
    }
    bool fl=1;
    int st;
    for(int i=1;i<=n;i++){
        if(du[i]==1)st=i;
        if(du[i]>2){
            fl=0;
            break;
        }
    }
    if(fl){//是一条链 
        int cnt=0;
        s[1]=w[st];
        vis[st]=1;
        while(1){
            for(int i=head[st];i;i=e[i].pre){
                if(vis[e[i].to])continue;
                vis[e[i].to]=1;
                cnt=cnt+1;
                col[cnt]=e[i].v;
                st=e[i].to;
            }
            s[cnt+1]=s[cnt]+w[st];
            if(du[st]==1)break;
        }
        s[cnt+1]=s[cnt]+w[st];
        nu[1]=0;nu[2]=1;
        for(int i=2;i<=cnt;i++){
            if(col[i]!=col[i-1]){
                nu[i+1]=nu[i]+1;
            }
            else nu[i+1]=1;
        }
        for(int i=2;i<=cnt+1;i++){
            for(int j=1;j<=nu[i];j++){
                ans+=s[i]-s[i-j-1];
            }
        }
        cout<<ans;
        return 0;
    }
    for(int i=1;i<=n;i++){
        flag=0;
        dfs(i,0,w[i]);
        if(!flag)ans-=w[i];
    }
    ans/=2;
    cout<<ans;
    fclose(stdin);fclose(stdout);
    return 0;
}
50分 爆搜+链的特判

 

c


【问题描述】
你是能看到第三题的 friends 呢。
——aoao
Hja 特别有钱,他买了一个? × ?的棋盘,然后 Yjq 到这个棋盘来搞事。一
开始所有格子都是白的,Yjq 进行?次行操作?次列操作,所谓一次操作,是将对
应的行列上的所有格子颜色取反。 现在 Yjq 希望搞事之后棋盘上有?个黑色格子,
问 Yjq 有多少种搞事的方法。
【输入格式】
第一行五个整数?,?,?,?,?。
【输出格式】
一行一个整数代表答案对10 9 + 7取模之后的值。
【样例输入】
2 2 2 2 4
【样例输出】
4
【数据规模与约定】
对于100%的数据,1 ≤ ?,?,?,? ≤ 100000,0 ≤ ? ≤ ? × ?,有部分分。

 

以上是关于2017-10-4 清北刷题冲刺班p.m的主要内容,如果未能解决你的问题,请参考以下文章

2017-10-6 清北刷题冲刺班p.m

2017-10-3 清北刷题冲刺班p.m

2017-10-7 清北刷题冲刺班p.m

2017-10-4 清北刷题冲刺班a.m

清北刷题冲刺 11-02 p.m

清北刷题冲刺 10-30 p.m