A.moe
题意
Solution
Code
#include<bits/stdc++.h>
inline int read()
{
int res=0,flag=1;
char ch=getchar();
while(!isalnum(ch)) (ch=='-')?flag=-1:1,ch=getchar();
while(isalnum(ch)) res=res*10+ch-'0',ch=getchar();
return res*flag;
}
const int inf=998244353;
struct info
{
int fa,pre,son;
int dep,size;
int top;
};
struct edge
{
int to,nxt;
int id;
};
int n,m,tot;
int head[100010],pre[100010];
int ans[100010];
struct info in[100010];
struct edge ed[200010];
std::vector<std::tuple<int,int,int> > ver;
void add_edge(int fr,int to,int val)
{
ed[++tot]=(edge){to,head[fr],val};
head[fr]=tot;
return ;
}
void init(int fr,int fa)
{
in[fr].fa=fa;
in[fr].size=0;
in[fr].dep=in[fa].dep+1;
for(int i=head[fr];i!=0;i=ed[i].nxt)
{
int to=ed[i].to;
if(fa==to)
continue;
init(to,fr);
in[to].pre=ed[i].id;
in[fr].size+=in[to].size;
if(in[in[fr].son].size<in[to].size)
in[fr].son=to;
}
return ;
}
void dfs(int fr,int fa)
{
if(in[fr].son!=0)
{
int to=in[fr].son;
in[to].top=in[fr].top;
dfs(to,fr);
}
for(int i=head[fr];i!=0;i=ed[i].nxt)
{
int to=ed[i].to;
if(fa==to||in[fr].son==to)
continue;
in[to].top=to;
dfs(to,fr);
}
return ;
}
int lca(int a,int b)
{
int fa=in[a].top;
int fb=in[b].top;
while(fa!=fb)
{
if(in[fa].dep<in[fb].dep)
std::swap(a,b),std::swap(fa,fb);
if(a==1) return 1;
a=in[fa].fa;
fa=in[a].top;
}
if(in[a].dep>in[b].dep)
std::swap(a,b);
return a;
}
void input()
{
n=read(),m=read();
for(int i=1;i<n;i++)
{
int fr=read(),to=read();
add_edge(fr,to,i);
add_edge(to,fr,i);
}
for(int i=1;i<=m;i++)
{
int fr=read(),to=read(),val=read();
ver.push_back(std::make_tuple(val,fr,to));
}
return ;
}
int find(int x)
{
if(pre[x]==x)
return x;
return pre[x]=find(pre[x]);
}
void calc(int &now,int val)
{
if(ans[in[now].pre]==inf)
ans[in[now].pre]=val;
pre[find(now)]=find(in[now].fa);
now=in[now].fa;
return ;
}
void solve()
{
init(1,0);
in[1].top=1;
dfs(1,0);
for(int i=1;i<=n;i++)
ans[i]=inf,pre[i]=i;
std::sort(ver.begin(),ver.end());
for(auto p:ver)
{
int val=std::get<0>(p);
int fr=find(std::get<1>(p));
int to=find(std::get<2>(p));
int Lca=lca(fr,to);
while(in[fr].dep>in[Lca].dep)
calc(fr,val);
while(in[to].dep>in[Lca].dep)
calc(to,val);
}
return ;
}
int main(int argc,const char *argv[])
{
freopen("moe.in","r",stdin);
freopen("moe.out","w",stdout);
input();
solve();
for(int i=1;i<n;i++)
printf("%d\n",(ans[i]==inf)?-1:ans[i]);
return 0;
}
B.potato
题意
Solution
Code
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int res=0,flag=1;
char ch=getchar();
while(!isalnum(ch)) (ch=='-')?flag=-1:1,ch=getchar();
while(isalnum(ch)) res=res*10+ch-'0',ch=getchar();
return res*flag;
}
int main(int argc,const char *argv[])
{
freopen("potato.in","r",stdin);
freopen("potato.out","w",stdout);
int n=read();
long long cnt=0;
long long a=-INT_MAX,b=INT_MAX,c=-INT_MAX,d=INT_MAX;
for(int i=1;i<=n;i++)
{
long long x=read()+1e9,y=read()+1e9,t=read();
a=std::max(a,x+y+t);
b=std::min(b,x+y-t);
c=std::max(c,x-y+t);
d=std::min(d,x-y-t);
}
printf("%.8f",(double)std::max(a-b,c-d)/2);
return 0;
}
C.seq
题意
Solution
Code
#include<bits/stdc++.h>
inline int read()
{
int res=0,flag=1;
char ch=getchar();
while(!isalnum(ch)) (ch=='-')?flag=-1:1,ch=getchar();
while(isalnum(ch)) res=res*10+ch-'0',ch=getchar();
return res*flag;
}
const int inf=INT_MAX;
struct postion
{
int x,fr,to;
int opt,id;
};
struct node
{
int val,tag;
int lson,rson;
node(){val=tag=-1;}
};
int n,m,cnt,tot=1,root=1;
int ans[80010],fa[80010],id[80010];
struct node nd[4000010];
struct postion pos[300010];
std::set<int> set[80010];
std::vector<int> son[80010];
void pushdown(int id)
{
if(nd[id].tag==-1)
return ;
nd[nd[id].lson].tag=nd[id].tag;
nd[nd[id].lson].val=nd[id].tag;
nd[nd[id].rson].tag=nd[id].tag;
nd[nd[id].rson].val=nd[id].tag;
nd[id].tag=-1;
return ;
}
void modify(long long left,long long right,int &id,int start,int end,int val)
{
//std::cout<<left<<" "<<right<<" "<<id<<" "<<start<<" "<<end<<" "<<val<<std::endl;
if(end<left||right<start) return ;
if(id==0) id=++tot;
if(start<=left&&right<=end)
{
nd[id].val=nd[id].tag=val;
return ;
}
long long mid=(left+right)>>1;
pushdown(id);
modify(left,mid,nd[id].lson,start,end,val);
modify(mid+1,right,nd[id].rson,start,end,val);
return ;
}
int query(long long left,long long right,int &id,int pos)
{
//std::cout<<left<<" "<<right<<" "<<id<<" "<<pos<<std::endl;
if(id==0) return -1;
if(left==right) return nd[id].val;
long long mid=(left+right)>>1,ans=0;
pushdown(id);
if(pos<=mid) ans=query(left,mid,nd[id].lson,pos);
else ans=query(mid+1,right,nd[id].rson,pos);
if(ans==-1) return nd[id].val;
else return ans;
}
void solve(int fr)
{
id[fr]=fr;
int max=fr;
for(auto to:son[fr])
{
solve(to);
if(set[id[to]].size()>set[id[max]].size())
max=to;
}
std::swap(id[fr],id[max]);
for(auto i:son[fr])
for(auto j:set[id[i]])
set[id[fr]].insert(j);
ans[fr]=set[id[fr]].size();
return ;
}
int main(int argc,const char *argv[])
{
freopen("colorful.in","r",stdin);
freopen("colorful.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++)
{
int a=read(),b=read(),c=read(),d=read();
pos[++cnt]=(postion){a,b,d,-1,i};
pos[++cnt]=(postion){c,b,d,1,i};
}
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),c=read();
pos[++cnt]=(postion){x,y,y,0,c};
}
std::sort(pos+1,pos+cnt+1,[](struct postion a,struct postion b){return (a.x==b.x)?a.opt<b.opt:a.x<b.x;});
for(int i=1;i<=cnt;i++)
{
//std::cerr<<"solve:"<<pos[i].opt<<" "<<pos[i].x<<" "<<pos[i].fr<<" "<<pos[i].to<<" "<<pos[i].id<<std::endl;
if(pos[i].opt==-1)
{
fa[pos[i].id]=query(1,inf,root,pos[i].fr);
if(fa[pos[i].id]==-1) fa[pos[i].id]=0;
//std::cout<<"merge:"<<pos[i].id<<" "<<fa[pos[i].id]<<std::endl;
son[fa[pos[i].id]].push_back(pos[i].id);
modify(1,inf,root,pos[i].fr,pos[i].to,pos[i].id);
}
if(pos[i].opt==0)
{
int res=query(1,inf,root,pos[i].fr);
if(res!=-1) set[res].insert(pos[i].id);
//std::cout<<res<<" "<<pos[i].id<<std::endl;
}
if(pos[i].opt==1)
modify(1,inf,root,pos[i].fr,pos[i].to,fa[pos[i].id]);
}
solve(0);
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}
D.114514
题意
Solution
Code
result