题目链接:https://codeforces.com/contest/1252
水题
#include<bits/stdc++.h>
using namespace std;
const int mx = 1e5+5;
struct node{
int id,x;
bool operator<(const node &a)const{
return x>a.x;
}
}a[mx];
int ans[mx];
int main(){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i].x),a[i].id = i;
sort(a+1,a+n+1);
for(int i = 1; i <= n; i++)
ans[a[i].id] = i;
for(int i = 1; i <= n; i++)
printf("%d%c",ans[i],i==n?'\n':' ');
return 0;
}
树形DP
0:以u节点为根节点的树,并且u最后不能是链的端点的个数
1:u的子树且u不是链的端点的个数
2:u可以做链的端点,后面也可以改变不做链端点的方案数
#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mid (l+r>>1)
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int mx = 1e5 + 10;
int n,m;
ll dp[mx][3];
vector <int> g[mx];
void dfs_dp(int u,int f) {
ll pre_1 = 1;
ll all_cnt = 1;
for (int i=0;i<g[u].size();i++) {
int v = g[u][i];
if (v == f) continue;
dfs_dp(v,u);
dp[u][1] = dp[u][1] * (dp[v][1] + dp[v][2]) % mod; // u不是端点
dp[u][1] = (dp[u][1] + (dp[v][0] + dp[v][2]) * (dp[u][0] + dp[u][2])) % mod;
// 是端点但要和其他点连接不让u是链的端点
dp[u][0] = dp[u][0] * (dp[v][1] + dp[v][2]) % mod; //不做连接点
dp[u][0] = (dp[u][0] + dp[u][2] * dp[v][2]) % mod;
ll mul = (all_cnt - pre_1 + mod) % mod;
dp[u][0] = (dp[u][0] + (dp[v][0] + dp[v][2])*mul) % mod;
// 是端点,但后面u可以作为端点也可以不做
dp[u][2] = (dp[u][2] * dp[v][1] + (dp[v][0] + dp[v][2]) * pre_1) %mod;
pre_1 = pre_1 * dp[v][1] % mod;
all_cnt = all_cnt * (dp[v][1] + dp[v][2]) %mod;
}
dp[u][2] = (dp[u][2] + pre_1) % mod;
}
int main(){
scanf("%d",&n);
int u1,v1;
for (int i=1;i<n;i++){
scanf("%d%d",&u1,&v1);
g[u1].push_back(v1);
g[v1].push_back(u1);
}
dfs_dp(1,0);
ll ans = dp[1][1] + dp[1][2];
printf("%lld\n",ans%mod);
return 0;
}
从行上来看和0/1表示奇偶来看,行要么是一样的要么是互斥的。要想连通一定是在连续的一样的行中。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int n, m;
int R[maxn], C[maxn];
int lr[maxn], rr[maxn];
int lc[maxn], rc[maxn];
void solve() {
for(int i=2; i<=n; i++) {
lr[i] = (R[i]%2 == R[i-1]%2) ? lr[i-1] : i;
lc[i] = (C[i]%2 == C[i-1]%2) ? lc[i-1] : i;
}
for(int i=n-1; i>=