T1-革クリスプ
あなたが持っています\(m×n個\)パイ
たびにあなたはケーキの一部または行を食べることができる
し、最大で数回を食べるように頼まを
ソリューション
見つけることができ、それぞれ2つの形状を食べ\(1×X \)最高のケーキがあり
、その後、いくつかの式を見つけるためにテーブルをヒット
ACコード
#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007ll
#define inv_2 500000004ll
using namespace std;
ll n,m;
int main()
{
freopen("crisp.in","r",stdin);
freopen("crisp.out","w",stdout);
scanf("%lld%lld",&n,&m);
if((n&1)||(m&1))
n%=mod,m%=mod,printf("%lld\n",(1ll*n*m%mod+n+m-1)*inv_2%mod);
else n%=mod,m%=mod,printf("%lld\n",(1ll*n*m%mod+n+m-2)*inv_2%mod);
return 0;
}
T2-伝送技術
今送達システムが構成され、ツリーの辺の重みが有する
各ノードの範囲有する\([L_iを、R_iを] \)を、ノードがパラメータとして範囲内の任意の数を取ることができる\(\ a_iを)
2つのノードが転送のコストは、間にある(| a_iを-a_j | \ \
) 2つのノード間の転送コストが直接移動する低コストよりも必要とし
ますが、このようなシステムを構築できるかどうか尋ねるために
あなたは、最小見つけることができない場合は、\(xと\)全ての範囲となる([L_iを-X、R_iを\ + X] \) システムを構成することができた後に
ソリューション
簡単には、我々はちょうど隣接する点が要件を満たしているかどうかを確認する必要がある、と思うし
、それは範囲で息子から渡すことができ、すべての点についてだからアップ
これらの範囲のすべてのソリューションを持っている場合は、システムを構築することができ
ないならば、我々は、 2つの間隔の交点のために、と思うし、拡張し、すべての周りの2つのインターバル場合は\(X \)
、彼らが展開する交差点についてになります\(xと\) 、我々は最も正当な間隔を見つける、その後、計算されませんので、\(X \)へ
ACコード
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define pii pair<int,int>
#define mp make_pair
#define l first
#define r second
using namespace std;
namespace fast_IO
{
const int IN_LEN = 10000000, OUT_LEN = 10000000;
char ibuf[IN_LEN], obuf[OUT_LEN], *ih = ibuf + IN_LEN, *oh = obuf, *lastin = ibuf + IN_LEN, *lastout = obuf + OUT_LEN - 1;
inline char getchar_(){return (ih == lastin) && (lastin = (ih = ibuf) + fread(ibuf, 1, IN_LEN, stdin), ih == lastin) ? EOF : *ih++;}
inline void putchar_(const char x){if(oh == lastout) fwrite(obuf, 1, oh - obuf, stdout), oh = obuf; *oh ++= x;}
inline void flush(){fwrite(obuf, 1, oh - obuf, stdout);}
inline void read(int&x)
{
int fh=1;x=0;char c=getchar_();
for(;!isdigit(c);c=getchar_())if(c=='-')fh=-1;
for(;isdigit(c);c=getchar_())x=x*10+c-'0';
x*=fh;
}
inline void write(int x){if(x>9)write(x/10);putchar_(x%10+'0');}
inline void writeln(int x){write(x),putchar_('\n');}
};
using namespace fast_IO;
vector<int>e[1000010],w[1000010];
int T,opt,n,x,y,z,ans;
pii a[1000010];
pii f(pii x,int y){return mp(x.l-y,x.r+y);}
pii solve(pii x,pii y){return mp(max(x.l,y.l),min(x.r,y.r));}
void check(pii x){ans=max(ans,x.l-x.r);}
pii dfs(int u,int fa)
{
pii tmp=a[u];
int sz=e[u].size();
for(int i=0;i<sz;i++)if(e[u][i]!=fa)
check(tmp=solve(tmp,f(dfs(e[u][i],u),w[u][i])));
return tmp;
}
signed main()
{
freopen("transport.in","r",stdin);
freopen("transport.out","w",stdout);
read(T),read(opt);
while(T--)
{
read(n);
for(int i=1;i<=n;i++)
e[i].clear(),w[i].clear();
for(int i=1;i<=n;i++)read(a[i].l);
for(int i=1;i<=n;i++)read(a[i].r);
for(int i=1;i<n;i++)
read(x),read(y),read(z),
e[x].pb(y),w[x].pb(z),
e[y].pb(x),w[y].pb(z);
ans=0,dfs(1,0),ans=(ans+1)/2;
printf("%lld\n",opt?ans:(bool)ans);
}
return 0;
}
木のT3-故郷
ツリー、サブツリーを求めて各ノード、最小距離点と他の点について
ソリューション
ツリーの重心の中心である木、及び他の点までの最短距離では、全ての重心は、ツリーのサブツリーを求めるタイトルに変換され
、いくつかの結論を有しています(私はQWQを許可しません)
ツリーの重心は、最大2つ、およびいくつかの隣接有する
重量息子の重力ルートノードにこの鎖の中心における特定のツリーの重心Aセンター
のための\(F_X = MAX(をmaxP [ x]は、SZ [RT]を-sz [X])\) 、すなわち定義式の重心
本鎖においては谷の機能、即ち、減少後の最初の増加である必要があり
、その後、我々はこれらのいくつかの性質に応じてQWQダイレクト露光などの検索
で複雑\(O (N-)\) 、私は許可しません。訓練を受け、訓練を受け、訓練を受け、
ACコード
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define pb push_back
#define inf 0x3f3f3f3f
using namespace std;
namespace fast_IO
{
const int IN_LEN = 10000000, OUT_LEN = 10000000;
char ibuf[IN_LEN], obuf[OUT_LEN], *ih = ibuf + IN_LEN, *oh = obuf, *lastin = ibuf + IN_LEN, *lastout = obuf + OUT_LEN - 1;
inline char getchar_(){return (ih == lastin) && (lastin = (ih = ibuf) + fread(ibuf, 1, IN_LEN, stdin), ih == lastin) ? EOF : *ih++;}
inline void putchar_(const char x){if(oh == lastout) fwrite(obuf, 1, oh - obuf, stdout), oh = obuf; *oh ++= x;}
inline void flush(){fwrite(obuf, 1, oh - obuf, stdout);}
inline void read(int&x)
{
x=0;char c=getchar_();
for(;!isdigit(c);c=getchar_());
for(;isdigit(c);c=getchar_())x=x*10+c-'0';
}
inline void write(int x){if(x>9)write(x/10);putchar_(x%10+'0');}
inline void writeln(int x){write(x),putchar_('\n');}
};
using namespace fast_IO;
vector<int>e[1000010],ans[1000010];
int n,x,y,f[1000010],sz[1000010],ct[1000010],maxp[1000010];
void dfs1(int u,int fa)
{
sz[u]=1,f[u]=fa;
for(auto v:e[u])if(v!=fa)
dfs1(v,u),sz[u]+=sz[v],
maxp[u]=max(maxp[u],sz[v]);
for(auto v:e[u])if(v!=fa)
if(sz[v]==maxp[u])ct[u]++;
}
void dfs2(int u,int fa)
{
int nub;
for(auto v:e[u])if(v!=fa)
{
dfs2(v,u);
if(sz[v]==maxp[u])nub=v;
}
if(ct[u]!=1)ans[u].pb(u);
else
{
int nw=f[ans[nub][0]],lst=ans[nub][0];
while(nw!=f[u])
{
int tmp1=max(sz[u]-sz[nw],maxp[nw]);
int tmp2=max(sz[u]-sz[lst],maxp[lst]);
if(tmp1==tmp2){ans[u].pb(lst),ans[u].pb(nw);break;}
else if(tmp1>tmp2){ans[u].pb(lst);break;}
lst=nw,nw=f[nw];
}
if(!ans[u].size())ans[u].pb(u);
}
}
int main()
{
freopen("extree.in","r",stdin);
freopen("extree.out","w",stdout);
read(n);
for(int i=1;i<n;i++)
read(x),read(y),e[x].pb(y),e[y].pb(x);
dfs1(1,0),dfs2(1,0);
for(int i=1;i<=n;i++)
{
sort(ans[i].begin(),ans[i].end());
if(ans[i].size()==1)writeln(ans[i][0]);
else write(ans[i][0]),putchar_(' '),writeln(ans[i][1]);
}
flush();return 0;
}