2018 hncpc 部分题

A.字符画

签到

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2163

#include<bits/stdc++.h>
using namespace std;
int w;
void go(){
    for(int i=1;i<=w;i++)
            cout<<".";
}
int main(){
    cin>>w;
        cout<<"ooo";
        go();
        cout<<"ooo";
        go();
        cout<<"ooo";
        go();
        cout<<"ooo\n";
        cout<<"..o";
        go();
        cout<<"o.o";
        go();
        cout<<".o.";
        go();
        cout<<"o.o\n";
        cout<<"ooo";
        go();
        cout<<"o.o";
        go();
        cout<<".o.";
        go();
        cout<<"ooo\n";
        cout<<"o..";
        go();
        cout<<"o.o";
        go();
        cout<<".o.";
        go();
        cout<<"o.o\n";
        cout<<"ooo";
        go();
        cout<<"ooo";
        go();
        cout<<"ooo";
        go();
        cout<<"ooo\n";
    return 0;
}

B.2018

打表规律

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2164

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL dp[2005][2005];
int main(){
    int n,m;
    for(int i=1;i<=2000;i++){
        dp[1][i]=dp[i][1]=i;
    }

    for(int i=2;i<=2000;i++)
        for(int j=2;j<=2000;j++){
            dp[i][j]=dp[i-1][j]+dp[i][j-1]+1;
            dp[i][j]=dp[i][j]%1000000007;
        }
        while(~scanf("%d %d",&n,&m)){
            printf("%lld\n",dp[n][m]*dp[n][m]%1000000007);
        }
    return 0;
}

C.时间旅行

读题签到

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2165

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int main(){
    int n,m;
    while(~scanf("%d %d",&n,&m)){
        if(n>m) cout<<n<<"\n";
        else cout<<m+1<<"\n";
    }
    return 0;
}

D.卖萌表情包

贪心,找到表情优先级即可

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2166

#include<bits/stdc++.h>
#define LL long long
using namespace std;
char s[1005][1005];
bool vis[1005][1005];
void go(int i,int j){
    vis[i][j]=1;
}
int main(){
    int n,m;
    while(~scanf("%d %d",&n,&m)){
        int ans=0;
        memset(vis,0,sizeof(vis));
                memset(s,0,sizeof(s));
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]+1);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(vis[i][j]) continue;
                if(s[i][j]==‘^‘){
                    if(!vis[i+1][j-1]&&!vis[i+1][j+1]&&s[i+1][j-1]==‘v‘&&s[i+1][j+1]==‘v‘){
                        go(i+1,j-1);
                        go(i+1,j+1);
                        go(i,j);
                        ans++;
                    }else if(!vis[i][j+2]&&!vis[i+1][j+1]&&s[i][j+2]==‘^‘&&s[i+1][j+1]==‘v‘){
                        ans++;
                        go(i,j+2);
                        go(i+1,j+1);
                        go(i,j);
                    }
                }
                else if(s[i][j]==‘<‘){
                    if(!vis[i-1][j+1]&&!vis[i+1][j+1]&&s[i+1][j+1]==‘>‘&&s[i-1][j+1]==‘>‘){
                        ans++;
                        go(i+1,j+1);
                        go(i-1,j+1);
                        go(i,j);
                    }
                    else if(!vis[i+1][j+1]&&!vis[i+2][j]&&s[i+1][j+1]==‘>‘&&s[i+2][j]==‘<‘){
                        ans++;
                        go(i+2,j);
                        go(i+1,j+1);
                        go(i,j);
                    }
                }
            }
        }
        cout<<ans<<"\n";

    }

    return 0;
}

J.买一送一

因为题目是一棵树,u点的贡献 == u(fa)的贡献 + 商品的总数 -(第一次出现此商品前的商品个数)

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2172

#include<bits/stdc++.h>
#define LL long long
using namespace std;
vector<int> v[100005];
int a[100005];
LL f[100005];
int vis[100005];
int pre[100005];
void dfs(int u,int cnt){
        for(int i=0;i<(int)v[u].size();i++){
            int to=v[u][i];
            if(!vis[a[u]]) cnt++;
            vis[a[u]]++;
            f[to]=f[u]+cnt-pre[a[to]];
            int hv=pre[a[to]];
            pre[a[to]]=cnt;
            dfs(to,cnt);
            if(--vis[a[u]]==0) cnt--;
            pre[a[to]]=hv;
        }
}
int main(){
    int n;
    while(~scanf("%d",&n)){
            for(int i=1;i<=n;i++) v[i].clear();
            memset(vis,0,sizeof(vis));
            memset(f,0,sizeof(f));
            memset(pre,0,sizeof(pre));
        for(int i=2;i<=n;i++){
            int u;
            scanf("%d",&u);
            v[u].push_back(i);
        }
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
            dfs(1,0);
        for(int i=2;i<=n;i++)
            printf("%lld\n",f[i]);
    }
    return 0;
}

K.Use FFT

我们将多项式a * 多项式b 得出如下

a0*b0 a0*b1 a0*b2 a0*b3      等于a0 * b3前缀和

   a1*b0 a1*b1 a1*b2  等于a1 *b2前缀和

      a2*b0 a2*b1

         a3*b0

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2173

#include<bits/stdc++.h>
#define LL long long
#define mod 1000000007
using namespace std;
LL a[500005],b[500005];
LL sum[1000005];
int main(){
    int n,m,l,r;
    while(~scanf("%d %d %d %d",&n,&m,&l,&r)){
        for(int i=1;i<=n+1;i++)
                 scanf("%lld",&a[i]);
        for(int i=1;i<=m+1;i++){
            scanf("%lld",&b[i]);
            sum[i]=(sum[i-1]+b[i]+mod)%mod;
        }
        for(int i=m+2;i<=r+1;i++)
            sum[i]=sum[i-1];
        LL ans=0;
        for(int i=1;i<=n+1;i++){
            ans=(ans+a[i]*(sum[r+1]-sum[l]+mod)%mod+mod)%mod;
            if(l>0) l--;
            if(r>=0) r--;
            else break;
        }
        printf("%lld\n",(ans+mod)%mod);

    }
    return 0;
}

H.千万不要用树套树

对于每个查询 答案等于 -1r左边的线段个数 + l+1右边的线段个数(这样就不会重复)

我们用两个线段树维护 一个维护左线段 一个维护右线段

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2170

#include<bits/stdc++.h>
#define LL long long
#define mod 1000000007
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 100005;
int sum1[maxn<<2],sum2[maxn<<2],cnt[maxn];
void update1(int l,int r,int rt,int pos){
    if(l==r){
        sum1[rt]+=1;
        return ;
    }
    int m=(l+r)>>1;
    if(pos<=m) update1(lson,pos);
    else update1(rson,pos);
    sum1[rt]=sum1[rt<<1]+sum1[rt<<1|1];
}
void update2(int l,int r,int rt,int pos){
    if(l==r){
        sum2[rt]+=1;
        return ;
    }
    int m=(l+r)>>1;
    if(pos<=m) update2(lson,pos);
    else update2(rson,pos);
    sum2[rt]=sum2[rt<<1]+sum2[rt<<1|1];
}
int query1(int l,int r,int rt,int L,int R){
    if(L<=l&&r<=R){
        return sum1[rt];
    }
    int m=(l+r)>>1;
    int ans=0;
    if(L<=m) ans+=query1(lson,L,R);
    if(R>m) ans+=query1(rson,L,R);
    return ans;
}
int query2(int l,int r,int rt,int L,int R){
    if(L<=l&&r<=R){
        return sum2[rt];
    }
    int m=(l+r)>>1;
    int ans=0;
    if(L<=m) ans+=query2(lson,L,R);
    if(R>m) ans+=query2(rson,L,R);
    return ans;
}
int main(){
    int  n,q;
    while(~scanf("%d %d",&n,&q)){
        int all=0;
        for(int i=1;i<=n*4;i++){
             if(i<=n) cnt[i]=0;
             sum1[i]=sum2[i]=0;
        }
        while(q--){
            int op,l,r;
            scanf("%d",&op);
            if(op==1){
                scanf("%d %d",&l,&r);
                if(l==r) cnt[l]++;
                update1(1,n,1,l);
                update2(1,n,1,r);
                all++;
            }else {
                scanf("%d %d",&l,&r);
                int ans=all;
                if(n>=l+1) {
                    ans-=query1(1,n,1,l+1,n);
                }
                if(r-1>=1) {
                    ans-=query2(1,n,1,1,r-1);
                }
                if(r-l==2) ans+=cnt[l+1];
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/MengX/p/10645119.html

时间: 2024-11-23 04:11:33

2018 hncpc 部分题的相关文章

网络流板子/费用流板子 2018南京I题+2016青岛G题

2018南京I题: dinic,链式前向星,数组队列,当前弧优化,不memset全部数组,抛弃满流点,bfs只找一条增广路,每次多路增广 #include <bits/stdc++.h> #define ll long long #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define rep(ii,a,b) for(int ii=a;ii<=b;++ii) using namespace std; con

2018十二月刷题列表

Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. 想都不要想啊当然是要去的啦,可以跑到这么远的地方交流一下还可以逃过一月月考(\(2019.1.24\to2019.1.31\)) 瞬间感觉有了点实质性的东西刺激一下自己了,而且离\(ZJOI\),真的不远了... LIst Luogu P3704 [SDOI2017]数字表格 大力的套路反演,只不

阿里2018前端测评题(Promise异步流程控制)

用Promise控制异步流程,三个异步任务,时间可能有先后,但是要按照想要的顺序输出. 我这里用四种方法解决,其实也就是考察你对Promise的理解,基础题了. //实现mergePromise函数,把传进去的数组顺序先后执行, //并且把返回的数据先后放到数组data中 const timeout = ms => new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, ms); }); const ajax

2018暑期做题部分整合

<Matrix>(HDU) 题意:n*m矩阵,每个点可黑可白,问有多少种方案使矩阵至少有A行B列全黑. 思路:第一反应当然是容斥,但是发现a+1行全黑的方案,并不是恰被a行全黑的方案多算a次,所以直接+1,-1,+1,-1这样的容斥系数就不可行. 而如果DP,复杂度太高,不可行. 于是考虑手推容斥系数,a行全黑的方案,被计数的次数取为([a>=A]-被更小的a计算次数)即可. 收获:对于复杂的计数问题,如果分类时,一种方案会在若干类中重复计数,可以使用推广的容斥来做. <Alway

2018宁夏A题

As an ACM-ICPC newbie, Aishah is learning data structures in computer science. She has already known that a stack, as a data structure, can serve as a collection of elements with two operations: push, which inserts an element to the collection, and p

2018上半年系统分析师真题及答案

系统分析师2018上半年真题及答案 (1)面向对象分析中,对象是类的实例.对象的构成成分包含了(1),属性和方法(或操作). A.标识 B.消息 C.规则 D.结构 参考答案[A] (2)UML2.0所包含的图中,(2) 描述由模型本身分解而成的组织单元,以及他们之间的依赖关系. A.组合结构图 B.包图 C.部署图 D.构件图 参考答案[B] (3)UML的结构包括构造块.规则和公共机制三个部分.在基本构造块中,(3)能够表示多个相互关联的事物的集合:规则是构造块如何放在一起的规定, 包括了(

【LeetCode】数学(共106题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [2]Add Two Numbers [7]Reverse Integer [8]String to Integer (atoi) [9]Palindrome Number [12]Integer to Roman [13]Roman to Integer [29]Divide Two Integers [43]Multiply Strings [50]Pow(x,

计算机考研复试真题 简单计算器

题目描述 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入描述:     测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非法表达式.当一行中只有0时输入结束,相应的结果不要输出. 输出描述:     对每个测试用例输出1行,即该表达式的值,精确到小数点后2位. 示例1 输入 1 + 2 4 + 2 * 5 - 7 / 11 0 输出 3.00 13.36 /* 天大2018考研编程题 程序设计思想:

2018-2 N substring with only one duplicate character

这是亚麻2018 年新题的第一题: // find all the N substring with only one duplicate character. #include <iostream> // std::cout #include <algorithm> // std::make_heap, std::pop_heap, std::push_heap, std::sort_heap #include <vector> // std::vector #inc