2020 CCPC Wannafly Winter Camp Day3(部分题解)

这场待补的题蛮多……留个坑

7-1 3A. 黑色气球

听队友说随便搞搞就过了,没仔细听怎么写的,就康康代码吧
ps:坑点是n=2的时候答案是1 1

#include
#include
#include
#include
#include
#include
#define LL long long
#define inf 0x3f3f3f3f
#define test freopen("in","r",stdin);freopen("out","w",stdout);
#define PII pair
#define PLI pair
using namespace std;
int n;
const int maxn=1e3+5;
int mp[maxn][maxn];
int a[maxn];
int main()
{
    //test
    scanf("%d",&n);
    LL sum=0;
    for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&mp[i][j]),sum+=mp[i][j];
    if(n==2) 
    {
        printf("1 1\n");
        return 0;
    }
    sum/=(2*n-2);
    for(int i=1;i<=n;++i)
    {
        LL s=0;
        for(int j=1;j<=n;++j)
        {
            s+=mp[i][j];
        }
        printf("%lld%c",(s-sum)/(n-2)," \n"[i==n]);
    }
    return 0;
}

7-3 3C. 无向图定向

把独立集缩成点之后问题转换为给完全图定向求DAG最长路最短是多少。据说答案是结点数(缩点后的)-1. 没想太清楚,留坑

7-5 3E. 棋技哥

不被其他黑点控制的黑点(称为A)一定会被按下一次,那么这个黑点所控制的黑点,即使在A之前按下了,改变了一个区域,在A按下之后它和它控制的区域又会恢复原状。所以我们只要模拟按下不被控制的黑点的过程,并记录操作了几步就好。
用二维差分来模拟对区域的加1操作。

#include
#define ll long long
#define lowbit(x) ((x)&(-(x)))
#define mid ((l+r)>>1)
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
using namespace std;
const int maxn = 505;
int a[maxn][maxn];
int d[maxn][maxn];
char s[maxn];
int n, m;
int main()
{
    int T;cin>>T;

    while(T--){
        scanf("%d%d", &n, &m);
        memset(d, 0, sizeof d);
        for(int i = 1; i <= n; ++i){
            scanf("%s", s+1);
            for(int j = 1; j <= m; ++j){
                if(s[j] == '0') a[i][j] = 0;
                else a[i][j] = 1;
                //cout<<"i:"< 0; --i){
            for(int j = m; j > 0; --j){
                d[i][j] += d[i+1][j]+d[i][j+1]-d[i+1][j+1];

                if((a[i][j] + d[i][j])%2 == 1){

                    d[i][j]++;
                    ans++;
                }

            }
        }
        if(ans&1) cout<<"call\n";
        else cout<<"aoligei\n";
    }
}
/*
3
2 2
11
11
*/

7-7 3G. 火山哥周游世界

如果根是定的,那么答案等于:所有关键点和根构成的子树的边数*2 - 最长路。
可以用换根dp维护这两个东西。蛮经典的模型。

#include
#define ll long long
#define lowbit(x) ((x)&(-(x)))
#define mid ((l+r)>>1)
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
#define P pair
using namespace std;
const int maxn = 5e5 + 50;
int n, k;
vector

g[maxn]; int vis[maxn]; int sz[maxn]; ll sum[maxn]; ll first[maxn], second[maxn]; void update(ll x, int id){ if(x >= first[id]) second[id] = first[id], first[id] = x; else if(x > second[id]) second[id] = x; return; } void dfs(int u, int f){ if(vis[u]) sz[u]++; sum[u] = 0; first[u] = second[u] = 0; for(int i = 0; i < g[u].size(); ++i){ int v = g[u][i].first; ll w = g[u][i].second; if(v == f) continue; dfs(v, u); sz[u] += sz[v]; sum[u] += sum[v] + (sz[v]!=0)*2*w; ll t = first[v] + (sz[v]!=0)*w; //cout<<"v:"<= first[u]) second[u] = first[u], first[u] = t; // else if(t > second[u]) second[u] = t; } //cout<<"u:"<>n>>k; for(int i = 1; i < n; ++i){ int u, v; ll w; scanf("%d%d%lld", &u, &v, &w); g[u].push_back(P(v, w)); g[v].push_back(P(u, w)); } while(k--){ int x; scanf("%d", &x); vis[x] = 1; } dfs(1, 0); dfs1(1, 0); dfs2(1, 0); for(int i = 1; i <= n; ++i){ ll ans = sum[i]-first[i]; printf("%lld\n", ans); } }

Day2一题都没补,我是弟弟QAQ

你可能感兴趣的:(训练补题)