A
注意到
只要X符合 (X-1)%K==0 就可以由1向右跳得到
void Phantom_73()
{
ll ans=0,n,k; cin>>n>>k;
for(int i=0;i<n;++i)
{
ll x; cin>>x;
if((x-1)%K==0)
ans++;
}
cout<<ans;
}
B
注意到
A模上任意X即 A%X他的取值范围为 [0,A/2]; 然后即可循环贪心放置
第一个放0 第二个放1...... 第N个放N-1
void Phantom_73()
{
ll n; cin>>n;
for(int i=0;i<n;++i)
{
ll x; cin>>x;
if((x/2)<i)
{
cout<<"NO\n";
return;
}
}
cout<<"YES\n";
return;
}
C
注意到
咱们把数组排序得到 数组b。
如果 b[i] * b[n-1] < x ,说明b[i]这个元素无论和哪个元素组队都无法被替换。
即a[i]必须在b[i]这个位置不然他无论如何都无法排序到b[i]这个位置。
vec<ll>a;
vec<ll>b;
ll n,tttt=1;
void Phantom_73()
{
ll x; cin>>x;
for(int i=0;i<n-1;++i)
{
ll cj=b[i]*b[n-1];
if(cj<x&&b[i]!=a[i])
{
cout<<"No\n";
return;
}
else if(cj>=x) break;
}
cout<<"Yes\n";
return;
}
int main()
{
AC;
cin>>n>>tttt;
a.resize(n);
b.resize(n);
for(int i=0;i<n;++i)
{
cin>>a[i];
b[i]=a[i];
}
sort(b.begin(),b.end());
while(tttt--) Phantom_73();
return 0;
}
D
注意到
我们可以 枚举根,用树形DP
我们用f[u]表示u不指向父亲时子树的最大值g[u]表示u指向父亲时的最大值。
用dfs 遍历每个节点,算出把边改成 u 指向子节点的收益,排序后取收益最大的若干个.
枚举数量算出最优解,最后输出根节点不指向父亲的结果即可。
#define LINF 0x3f3f3f3f3f3f3f3f
vec<vec<ll>>t;
vec<ll>f,g;
void dfs(int u,int fa)
{
vec<ll>c;
ll zl=0;
for(int v:t[u])if(v!=fa)
{
dfs(v,u);
zl+=g[v];
c.push_back(f[v]-g[v]);
}
sort(c.rbegin(),c.rend());
ll k=c.size();
vec<ll>qz(k+1);
for(ll i=0;i<k;i++) qz[i+1]=qz[i]+c[i];
f[u]=-1e18;
g[u]=-1e18;
for(ll i=0;i<=k;i++)
{
f[u]=mx(f[u],i*i+zl+qz[i]);
g[u]=mx(g[u],(i+1)*(i+1)+zl+qz[i]);
}
}
void Phantom_73()
{
int n;cin>>n;
t.resize(n);
f.resize(n);
g.resize(n);
for(int i=0;i<n-1;++i)
{
ll u,v;cin>>u>>v;
u--;v--;
t[u].push_back(v);
t[v].push_back(u);
}
dfs(0,-1);
cout<<f[0]<<'\n';
}

京公网安备 11010502036488号