A.神グラフ理論の問題(god.cpp)
トピックリンク
問題の意味
無向グラフが与えられると、各点が厳守する権利を有し、点の削除のコストで、それに接続されたすべてのノードを削除していない重量と全ての点を削除する最小コストを見つけます。
ソリューション
接続された任意の2点を考慮して\(U \)と\(Vの\) 。
設定\(U \)の重量を有する点を\(\) 。
\(V \)は、重量に点\(Bの\) 。
そして\(U \)重量ノードの値とが減算することにより、接続された\(V \)ポイントの重みを、結果は\(C \) 。
そして\(V \)重量ノードの値と接続され、減算することによって\(U \)ポイントの重みを、結果は(D \)を\します。
削除のであれば、\(U \)を、その後、削除します\(V \)のため、価格\(B + C + D \を)。
あなたは、削除した場合、\(V \) 、その後、削除します\(U \) 、を考慮\(A + C + Dの\を)。
その場合は\(A> Bの\)は、削除する必要があります\(U \)を削除し、その後、(V \)\を。
そうでなければ、あなたは削除する必要があります\を(V \) 、その後、削除します\(U \) 。
それは削除する必要があります\(U、V \)ポイントで大きなウェイトを。
明らかに、この結論は、すべてのポイントに一般化することができます。
だから、貪欲な戦略は、大規模な降下重みポイントを削除することです。
コード
#include<bits/stdc++.h>
const int SIZE=200005;
int x[SIZE],head[SIZE],nex[SIZE],to[SIZE],Tot,Ans[SIZE];
void Link(int u,int v)
{
nex[++Tot]=head[u];head[u]=Tot;to[Tot]=v;
nex[++Tot]=head[v];head[v]=Tot;to[Tot]=u;
}
struct node
{
int x,pos;
bool operator <(const node &p)const
{
return x>p.x;
}
}Tem[SIZE];
bool Removed[SIZE];
long long Tot_Ans;
int main()
{
freopen("god.in","r",stdin);
freopen("god.out","w",stdout);
int n,m,u,v;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&x[i]);
Tem[i]=(node){x[i],i};
}
std::sort(Tem+1,Tem+1+n);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
Link(u,v);
Ans[u]+=x[v];
Ans[v]+=x[u];
}
for(int o=1;o<=n;o++)
{
u=Tem[o].pos;
for(int i=head[u];i;i=nex[i])
{
v=to[i];
if(Removed[v])continue;
Ans[v]-=x[u];
}
Tot_Ans+=Ans[u];
Removed[u]=1;
}
printf("%lld",Tot_Ans);
return 0;
}
B.ビット単位(bit.cpp)
トピックリンク
問題の意味
カスタム番号\(N \)の値は\(k個\)がされた\(| N | \)合計の数字。
未満を満たすために探している(\ N-)\、値\を(K +を1 \) 、および最大数。
\(| N | \ 10 ^ {100000} \) 。
ソリューション
カテゴリー話。
場合\(\ N-)が負であり、第一の下位ビットからのものではない検索する\(9 \)の位置に、位置\(+ \ 1)することができる。すべてのビットがある場合、\(9 \ )、上部に作る\(1 \を)。
場合は\(N- \)非負、考慮すべき位置を見つけるために:
- この位置であってもよい\( - 1 \) (すなわち、この位置の数ではない\(0 \) )。
- 右の位置とその位置の番号とすることができる\(+ 2 \) 。
限り、あなたはこのような位置を見つけることができるよう、あなたが質問の意味を満たすために正の数を見つけることができます...