Codeforces Round #485 Div. 1 vp记
A:对每种商品多源bfs一下每个点到该商品的最近距离,对每个点sort一下取前s个即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define int long long
#define N 100010
int n,m,k,s,a[N],p[N],d[][N],b[],q[N],t;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
struct data{int to,nxt;
}edge[N<<];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void bfs(int k)
{
int head=,tail=;memset(d[k],,sizeof(d[k]));
for (int i=;i<=n;i++) if (a[i]==k) q[++tail]=i,d[k][i]=;
do
{
int x=q[++head];
for (int i=p[x];i;i=edge[i].nxt)
if (d[k][edge[i].to]>d[k][x])
{
d[k][edge[i].to]=d[k][x]+;
q[++tail]=edge[i].to;
}
}while (head<tail);
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read(),k=read(),s=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=m;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
for (int i=;i<=k;i++) bfs(i);
for (int i=;i<=n;i++)
{
for (int j=;j<=k;j++) b[j]=d[j][i];
sort(b+,b+k+);
int ans=;
for (int j=;j<=s;j++) ans+=b[j];
printf("%d ",ans);
}
return ;
}
B:看起来非常玄乎事实上只是说两人交换次数的奇偶性不同。考虑将原排列变成该排列的最小交换次数,也即n-置换的循环节,这个东西的奇偶性是与交换次数的奇偶性有关的,因为每次交换会合并或拆开置换的两个循环。或者可以发现逆序对的奇偶性也是与其相关的,因为显然交换只会对两位置之间的区间产生影响,如果之间的数比两位置上的数都小或都大显然没有影响,否则每有一个这样的数逆序对变化两个。同时两位置本身带来一个逆序对变化,这样总逆序对变化量肯定是奇数。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1000010
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N];
bool flag[N];
ll s;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
int c=n;
for (int i=;i<=n;i++)
if (!flag[i])
{
c--;flag[i]=;
int x=a[i];while (!flag[x]) flag[x]=,x=a[x];
}
if ((c&))
{
if (n&) cout<<"Petr";else cout<<"Um_nik";
}
else
{
if (n&) cout<<"Um_nik";else cout<<"Petr";
}
return ;
}
1.5h之后C还是没有思路,自闭到结束。
result:rank 154
C:刚的过程中最接近正解的想法是对0~2n-1建一些辅助点,对每个点将每一位挖掉与其连边,然后将辅助节点取反后连边,但这样显然不对。事实上稍加(?)修改就行了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N (1<<22)
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,a[N],b[N],ans;
bool flag[N<<];
void dfs(int k)
{
flag[k]=;
if (k>(<<m))
{
if (!flag[a[k^(<<m)]]) dfs(a[k^(<<m)]);
}
else
{
for (int i=;i<m;i++)
if (!(k&(<<i))&&!flag[k|(<<i)]) dfs(k|(<<i));
if (b[k^(<<m)-]&&!flag[b[k^(<<m)-]+(<<m)]) dfs(b[k^(<<m)-]+(<<m));
}
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
m=read(),n=read();
for (int i=;i<=n;i++) b[a[i]=read()]=i;
for (int i=(<<m)+;i<=(<<m)+n;i++)
if (!flag[i]) dfs(i),ans++;
cout<<ans;
return ;
}
D:题意莫名其妙,实际上是设f(x)为x所有分解因子方式中最小的因子和,求f(x) (x>=n)的最小值。一个古老的结论是因子之和固定时尽量取3能使乘积最大,有剩余时补2,于是只需考虑这样的数。求对数可以大致求出答案范围。枚举每一种可能,高精度求出即可。这需要多项式快速幂。于是就被各种问题折腾了一天。有多惨我已经不想回顾了,最后也不知道怎么过的。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N (1<<19)
#define M 1500010
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[M],r[N],len,ans=;
ll f[N],c[N];
char s[M];
const double PI=3.14159265358979323846;
struct complex
{
double x,y;
complex operator +(const complex&a) const
{
return (complex){x+a.x,y+a.y};
}
complex operator -(const complex&a) const
{
return (complex){x-a.x,y-a.y};
}
complex operator *(const complex&a) const
{
return (complex){x*a.x-y*a.y,x*a.y+y*a.x};
}
}g[N],b[N];
void DFT(complex *a,int n,int op)
{
for (int i=;i<n;i++) if (i<r[i]) swap(a[i],a[r[i]]);
for (int i=;i<=n;i<<=)
{
complex wn=(complex){cos(*PI/i),op*sin(*PI/i)};
for (int j=;j<n;j+=i)
{
complex w=(complex){,};
for (int k=j;k<j+(i>>);k++,w=w*wn)
{
complex x=a[k],y=w*a[k+(i>>)];
a[k]=x+y,a[k+(i>>)]=x-y;
}
}
}
}
int work(int n,int c)
{
c*=pow(,n%);n/=;
memset(f,,sizeof(f));memset(b,,sizeof(b));memset(g,,sizeof(g));
g[].x=;b[].x=;int t;
for (t=;t<=(n<<);t<<=)
{
for (int i=;i<t;i++) r[i]=(r[i>>]>>)|(i&)*(t>>);
DFT(b,t,);
if (n&(t>>))
{
DFT(g,t,);
for (int i=;i<t;i++) g[i]=g[i]*b[i];
DFT(g,t,-);
for (int i=;i<t;i++) f[i]=g[i].x/t+0.5;
for (int i=;i<t;i++) if (f[i]>) f[i+]+=f[i]/,f[i]%=;
for (int i=;i<t;i++) g[i].x=f[i],g[i].y=;
}
if (t>n) break;
for (int i=;i<t;i++) b[i]=b[i]*b[i];
DFT(b,t,-);
for (int i=;i<t;i++) f[i]=b[i].x/t+0.5;
for (int i=;i<t;i++) if (f[i]>) f[i+]+=f[i]/,f[i]%=;
for (int i=;i<t;i++) b[i].x=f[i],b[i].y=;
}
for (int i=;i<t;i++) f[i]=g[i].x;
for (int i=;i<t;i++) f[i]=f[i]*c;
for (int i=;i<t;i++) if (f[i]>) f[i+]+=f[i]/,f[i]%=;
while (f[t]==) t--;return t+;
//c*729^n
}
int mul(ll *f,int c)
{
int n=N-;while (f[n]==) n--;
for (int i=;i<=n;i++) f[i]*=c;
for (int i=;i<=n;i++) f[i+]+=f[i]/,f[i]%=;
if (f[n+]) n++;
return n+;
}
bool check(ll *f,int len)
{
int m=(n-)/+;
if (len>m) return ;
if (len<m) return ;
for (int i=m-;~i;i--)
if (f[i]!=a[i]) return f[i]>a[i];
return ;
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
#endif
scanf("%s",s+);n=strlen(s+);
for (int i=;i<n;i++) a[i]=s[n-i]-'';
if (n==&&a[]==) {cout<<;return ;}
for (int i=;i<(n-)/+;i++) a[i]=a[i*]+a[i*+]*+a[i*+]*;
len=work(max(floor((n-)/log10())-,0.0),);
for (int k=max(floor((n-)/log10())-,0.0);k<=ceil(n/log10())+;k++)
{
memcpy(c,f,sizeof(c));
if (check(c,len)) {ans=min(ans,k*);break;}
if (check(c,mul(c,))) {ans=min(ans,k*+);break;}
if (check(c,mul(c,))) {ans=min(ans,k*+);}
len=mul(f,);
}
cout<<ans;
return ;
}
E:先考虑序列上怎么做。考虑每种质因子,问题变为求区间每个数和x取min之和。显然每个数的质因子数量不会很多,所以对每种质因子个数分别建个BIT即可,复杂度即为log2。可以线性筛预处理做到log分解质因数。树上问题直接树剖的话是log3,不太能接受,可以通过欧拉序去一个log,即在进入子树时加,退出子树时减。我又被,卡常了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define N 100010
#define M 10000000
#define P 1000000007
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,p[N],a[N],prime[M+],minp[M+],deep[N],fa[N][],in[N],out[N],ans[N],tree[][N<<],cnt,m,t;
bool flag[M+],tmp[];
struct data{int to,nxt;
}edge[N<<];
struct data2{int x,y,z,lca;
}q[N];
struct data3{int x,cnt;};
vector<data3> point[M+],Q[M+];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void add(int p,int k,int x){while (k<=*n) tree[p][k]+=x,k+=k&-k;}
int query(int p,int k){int s=;while (k) s+=tree[p][k],k-=k&-k;return s;}
int ksm(int a,int k)
{
int s=;
for (;k;k>>=,a=1ll*a*a%P) if (k&) s=1ll*s*a%P;
return s;
}
void dfs(int k)
{
in[k]=out[k]=++cnt;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k][])
{
fa[edge[i].to][]=k;
deep[edge[i].to]=deep[k]+;
dfs(edge[i].to);
out[k]=++cnt;
}
}
int lca(int x,int y)
{
if (deep[x]<deep[y]) swap(x,y);
for (int j=;~j;j--) if (deep[fa[x][j]]>=deep[y]) x=fa[x][j];
if (x==y) return x;
for (int j=;~j;j--) if (fa[x][j]!=fa[y][j]) x=fa[x][j],y=fa[y][j];
return fa[x][];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("e.in","r",stdin);
freopen("e.out","w",stdout);
#endif
flag[]=;cnt=;
for (int i=;i<=M;i++)
{
if (!flag[i]) prime[++cnt]=i,minp[i]=i;
for (int j=;j<=cnt&&prime[j]*i<=M;j++)
{
flag[prime[j]*i]=;
minp[prime[j]*i]=prime[j];
if (i%prime[j]==) break;
}
}
n=read();
for (int i=;i<n;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
cnt=;dfs();
fa[][]=;
for (int j=;j<;j++)
for (int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-];
for (int i=;i<=n;i++)
{
int x=a[i]=read();
while (x>)
{
int y=minp[x],cnt=;
while (minp[x]==y) cnt++,x/=y;
point[y].push_back((data3){i,cnt});
}
}
m=read();cnt=;
for (int i=;i<=m;i++)
{
q[i].x=read(),q[i].y=read(),q[i].z=read();q[i].lca=lca(q[i].x,q[i].y);ans[i]=;
int x=q[i].z;
while (x>)
{
int y=minp[x],cnt=;
while (minp[x]==y) cnt++,x/=y;
Q[y].push_back((data3){i,cnt});
}
}
fa[][]=;
int u=;
for (int i=;i<=M;i++)
if (!flag[i])
{
while (ksm(i,u)>M) u--;
for (int j=;j<point[i].size();j++)
{
add(point[i][j].cnt,in[point[i][j].x],);
add(point[i][j].cnt,out[point[i][j].x]+,-);
tmp[point[i][j].cnt]=;
}
for (int j=;j<Q[i].size();j++)
{
ll x=;
for (int k=;k<=Q[i][j].cnt;k++)
if (tmp[k]) x+=k*(query(k,in[q[Q[i][j].x].x])+query(k,in[q[Q[i][j].x].y])+
1ll*(P-)*query(k,in[q[Q[i][j].x].lca])%(P-)+1ll*(P-)*query(k,in[fa[q[Q[i][j].x].lca][]])%(P-));
for (int k=Q[i][j].cnt+;k<=u;k++)
if (tmp[k]) x+=Q[i][j].cnt*(query(k,in[q[Q[i][j].x].x])+query(k,in[q[Q[i][j].x].y])+
1ll*(P-)*query(k,in[q[Q[i][j].x].lca])%(P-)+1ll*(P-)*query(k,in[fa[q[Q[i][j].x].lca][]])%(P-));
ans[Q[i][j].x]=1ll*ans[Q[i][j].x]*ksm(i,((x%(P-))+P-)%(P-))%P;
}
for (int j=;j<point[i].size();j++)
{
add(point[i][j].cnt,in[point[i][j].x],-);
add(point[i][j].cnt,out[point[i][j].x]+,);
tmp[point[i][j].cnt]=;
}
}
for (int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}
Codeforces Round #485 Div. 1 vp记的更多相关文章
- Codeforces Round #485 (Div. 2)
Codeforces Round #485 (Div. 2) https://codeforces.com/contest/987 A #include<bits/stdc++.h> us ...
- Codeforces Round #485 (Div. 2) D. Fair
Codeforces Round #485 (Div. 2) D. Fair 题目连接: http://codeforces.com/contest/987/problem/D Description ...
- Codeforces Round #485 (Div. 2) F. AND Graph
Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...
- Codeforces Round #485 (Div. 2) E. Petr and Permutations
Codeforces Round #485 (Div. 2) E. Petr and Permutations 题目连接: http://codeforces.com/contest/987/prob ...
- Codeforces Round #485 (Div. 2) C. Three displays
Codeforces Round #485 (Div. 2) C. Three displays 题目连接: http://codeforces.com/contest/987/problem/C D ...
- Codeforces Round #485 (Div. 2) A. Infinity Gauntlet
Codeforces Round #485 (Div. 2) A. Infinity Gauntlet 题目连接: http://codeforces.com/contest/987/problem/ ...
- Codeforces Round #394 (Div. 2) 颓废记
昨天晚上(今天凌晨),又忍不住去打CF.(本蒟弱到只能打Div.2)... 我觉得我可以用一个词概括我这次的CF: 呵呵 刚一开赛,我就codeforces访问失败.. 后来好不容易能上了,两三分钟才 ...
- Codeforces Round#500 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round #402 (Div. 2) 阵亡记
好长时间没有打Codeforces了,今天被ysf拉过去打了一场. lrd也来参(nian)加(ya)比(zhong)赛(sheng) Problem A: 我去,这不SB题吗.. 用桶统计一下每个数 ...
随机推荐
- poj 1364 King(线性差分约束+超级源点+spfa判负环)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14791 Accepted: 5226 Description ...
- jQuery.bsgrid
http://thebestofyouth.com/bsgrid/ 支持json.xml数据格式,皮肤丰富并且容易定制,支持表格编辑.本地数据.导出参数构建等实用便捷的功能,容易扩展,更拥有丰富的示例 ...
- 20155313 杨瀚 《网络对抗技术》实验一 PC平台逆向破解(5)M
exp1 PC平台逆向破解(5)M 一.实验内容 1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发 ...
- 20155339 Exp7 网络欺诈防范
20155339 Exp7 网络欺诈防范 .基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 当连接局域网的时候应该最容易被攻击,比如说连接了一些不清楚是什么的WiFi其实是很容易收 ...
- 让vim成为VS的编辑器
编辑代码是还是感觉vim的比较方便--于是让vim成为VS的编辑器. 发现,安装了VsVim之后,也不失VS的便捷性,相当不错呢-- 对了我用的是VS2012---- 1.菜单栏->工具-> ...
- 开源软件License汇总
用到的open source code越多,遇到的开源License协议就越多.License是软件的授权许可,里面详尽表述了你获得代码后拥有的权利,可以对别人的作品进行何种操作,何种操作又是被禁止的 ...
- 【第五课】LNMP环境的入门
目录 一. LNMP环境介绍 二.Mysql的二进制免编译安装 三.PHP 7.2.5编译部署 四.Nginx的编译安装 五.YUM安装Nginx 一. LNMP环境介绍 LNMP(Linux + N ...
- mac终端将本地代码push到github总结
1.创建一个github账号 2.在本地目录下创建一个本地仓库,用来存放代码 mkdir prepass_repository (/Users/gejuncheng/文件/prepass_reposi ...
- 浅谈String模块ascii_letters和digits
本文介绍string模块ascii_letters和digits方法,其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字0-9. 示例如下: In [2]: c ...
- 吉他软件Guitar Pro播放无声音的解决方法
系统环境:适用于Windows操作系统和macOS的Guitar Pro . 问题表现:已成功安装Guitar Pro ,但用Guitar Pro 播放时没有任何声音或播放失真. 解决方案:首先确保安 ...