ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022icpc新疆省赛

2022-04-04 13:04:00  阅读:202  来源: 互联网

标签:新疆省 cout int nullptr cin 2022icpc root dp


 菜鸡第一次打icpc

 记录一下历程

 习惯#define int long long

 以下皆是按照我认为的难易顺序排序

 K.

  看题意大概就是说求从L加到R

1     ios::sync_with_stdio(false);
2     cin.tie(nullptr);
3     cout.tie(nullptr);
4     int a,b;
5     cin>>a>>b;
6     
7     if(a < b) swap(a,b);
8     int res =a-b+1;
9     cout<<(a+b)*res/2;    

 B.

  贪心,同一列1多就构造1,否则就构造0

 1 const int N = 1e3 + 10;
 2 char s[N][N];
 3 char res[N];
 4 
 5 void solve() {
 6     ios::sync_with_stdio(false);
 7     cin.tie(nullptr);
 8     cout.tie(nullptr);
 9 
10     int n, m;
11     cin >> n >> m;
12     for (int i = 1; i <= n; ++i) {
13         cin >> (s[i] + 1);
14     }
15     for (int j = 1; j <= m; ++j) {
16         int a = 0, b = 0;
17         for (int i = 1; i <= n; ++i) {
18             if (s[i][j] == '0') b++;
19             else a++;
20         }
21         if (a > b) res[j] = '1';
22         else res[j] = '0';
23     }
24     cout << (res + 1);
25 }

G.

  很裸的一个01背包问题,只不过多了一个背包,变二维了

  (数据范围很坑,比赛的时候就因为数据范围的时候一直爆内存错误,下来了把空间开大了就过了)

 1 const int N = 510;
 2 int n, v1, v2;
 3 int v[N], w1[N], w2[N];
 4 int dp[N][N];
 5 void solve() {
 6     cin >> n >> v1 >> v2;
 7     for (int i  = 1; i <= n; ++i) {
 8         cin >> v[i] >> w1[i] >> w2[i];
 9     }
10     for(int i  =1;i <= n;++i)
11         for(int j  = 0;j <= v1;++j)
12             for(int k = 0;k <= v2;++k){
13                 if(j >= v[i]) dp[j][k] = max(dp[j][k],dp[j-v[i]][k]+w1[i]);
14                 if(k >= v[i]) dp[j][k] = max(dp[j][k],dp[j][k-v[i]]+w2[i]);
15             }
16     cout<<dp[v1][v2]<<"\n";
17 }

A.

 可以说是dfs吧,从根节点搜到底,如果碰到节点没有后继,说明食物链+1

 从底层的节点向上更新数据,最后输出根节点的最大价值

 (比赛的时候想复杂了,用层序遍历从底层节点向上更新,虽然总的想法差不多,但是在处理边权的时候需要不断重复的搜边造成时间爆炸

  而且也没什么好的办法优化这种搜边的问题,最后卡在6s了)

const int N = 2e6+10,mod = 32416190071;
int n;
int f[N];
int pre[N];
bool st[N];
int ans = 0;
int e[N],ne[N],h[N],idx,w[N];
void add(int a,int b,int v){
    e[idx] = b,    w[idx] = v,    ne[idx] = h[a],    h[a] = idx++;
}

void dfs(int root){
    if(h[root] == -1){
        ans ++;
    }
    f[root] = pre[root] % mod;
    for(int i = h[root];~i;i = ne[i]){
        int j  = e[i],c = w[i];
        dfs(j);
        f[root] = (f[root]+f[j]*c)%mod;
    }
    
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>n;
    memset(h,-1,sizeof (h));
    for(int i = 1;i < n;++i){
        int a,b,v;
        cin>>a>>b>>v;
        add(a,b,v);
        st[b] = true;
    }
    int root = 0;
    for(int i = 1;i <= n;++i) if(!st[i]){
        root = i;
        break;
    }
    for(int i  =1;i <= n;++i){
        cin>>pre[i];
    }
    dfs(root);
    cout<<ans<<"\n"<<f[root]<<"\n";
    return 0;
}

菜鸡就只能做到这了,大概总结一下

比较有问题的地方在数据范围和c++输入输出没加速(血泪教训)

别的题感觉数论好多,难受不会

 

标签:新疆省,cout,int,nullptr,cin,2022icpc,root,dp
来源: https://www.cnblogs.com/empty-y/p/16098854.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有