這場待補的題蠻多……留個坑
7-1 3A. 黑色氣球
聽隊友說隨便搞搞就過了,沒仔細聽怎麼寫的,就康康代碼吧
ps:坑點是n=2的時候答案是1 1
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define LL long long
#define inf 0x3f3f3f3f
#define test freopen("in","r",stdin);freopen("out","w",stdout);
#define PII pair<int,int>
#define PLI pair<LL,int>
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<bits/stdc++.h>
#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:"<<i<<" j:"<<j<<" a:"<<a[i][j]<<endl;
}
}
int ans = 0;
for(int i = n; 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<bits/stdc++.h>
#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<int, ll>
using namespace std;
const int maxn = 5e5 + 50;
int n, k;
vector<P> 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:"<<v<<" t:"<<t<<endl;
update(t, u);
// if(t >= first[u]) second[u] = first[u], first[u] = t;
// else if(t > second[u]) second[u] = t;
}
//cout<<"u:"<<u<<" sum:"<<sum[u]<<endl;
return;
}
void dfs1(int u, int f){
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;
sum[v] =sum[u]-2*w*(sz[v]!=0)+((n-sz[v]) != 0)*2*w;
dfs1(v, u);
}return;
}
void dfs2(int u, int f){
//cout<<"u:"<<u<<" first:"<<first[u]<<endl;
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;
if(sz[v] != n){
if(first[v]+w == first[u]){
update(second[u]+w, v);
}else update(first[u]+w, v);
}
dfs2(v, u);
}
return;
}
int main()
{
cin>>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