这场待补的题蛮多……留个坑
听队友说随便搞搞就过了,没仔细听怎么写的,就康康代码吧
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;
}
把独立集缩成点之后问题转换为给完全图定向求DAG最长路最短是多少。据说答案是结点数(缩点后的)-1. 没想太清楚,留坑
不被其他黑点控制的黑点(称为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
*/
如果根是定的,那么答案等于:所有关键点和根构成的子树的边数*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