ホームページ > ウェブフロントエンド > htmlチュートリアル > Codeforces Round #264 (ディビジョン 2) E. Caisa と Tree Operation での暴力_html/css_WEB-ITnose

Codeforces Round #264 (ディビジョン 2) E. Caisa と Tree Operation での暴力_html/css_WEB-ITnose

WBOY
リリース: 2016-06-24 11:55:33
オリジナル
942 人が閲覧しました

http://codeforces.com/contest/463/problem/E

ノードの合計数が n のツリーがあるとすると、各ノードには重みがあり、q 個の操作が実行され、各操作には 2 つのオプションがあります:
1. ノード v とルートの間のパス上の各ノードをクエリし、条件 gcd(val[i], val[v]) > 1 を満たす v に最も近いノードの添え字を見つけます。

2. ノード v の値を w に変更します。


暴力は実際になくなりました!

#include
#include
#include
#include
#include
#include #include
#include
#include
#include
#include
名前空間 std; を使用
#define RD(x) scanf(" %d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))
typedef long long LL;
const int maxn = 400005;
structedge{
int next,to;
}e[maxn];
int head[maxn],n,q,w[maxn],cntn,f[maxn];
void add(int u,int v)
{
e[cntn] = (edge){head[u],v};
head[u] = cntn++;
e[cntn] = (edge){head[v] ],u};
head[v] = cntn++;
}
int gcd(int x,int y)
{
return y == 0 ? x:gcd(y,x%y);
}
void dfs (int u,int fa)
{
f[u] = fa;
for(int i = head[u];i != -1;i = e[i].next){
int v = e[ i].to;
if(v == fa) continue;
dfs(v,u);
}
}
int find_gcd(int v)
{
int u = f[v];
while(u ! = -1){
int res = gcd(w[v],w[u]);
if(res > 1){
return u;
}
u = f[u];
}
return - 1;
}
int main() {
RD2(n,q);
for(int i = 1;i RD(w[i]);
int m = n - 1,u,v,ww;
memset(head,-1,sizeof(head)),clr0(f);
while(m--){
RD2(u,v);
add(u,v) );
}
dfs(1,-1);
while(q--){
RD2(u,v);
if(u == 1){
printf("%dn",find_gcd(v) );
}
else{
RD(ww);
w[v] = ww;
}
}
return 0;
}

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート