Codeforces Round #510 Div. 2 Virtual Participate记
这场打的顺手到不敢相信。如果不是vp的话估计肯定打不到这个成绩。
A:最大显然,最小的话每次暴力给最小的+1。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
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;
}
#define N 110
int n,m,a[N],mx,s;
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read(),m=read();
for (int i=;i<=n;i++) a[i]=read(),s=max(s,a[i]);
s+=m;
for (int i=;i<=m;i++)
{
int mx=;
for (int j=;j<=n;j++) if (a[j]<a[mx]) mx=j;
a[mx]++;
}
int mx=;for (int i=;i<=n;i++) mx=max(mx,a[i]);
cout<<mx<<' '<<s;
return ;
}
B:每种蔬菜集合取最小值,枚举选哪些即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
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;
}
#define N 1010
int n,ans=,f[];
struct data{int x,y;
}a[N];
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read();for (int i=;i<;i++) f[i]=ans;
for (int i=;i<=n;i++)
{
a[i].x=read();
char c=getchar();
while (c<'A'||c>'Z') c=getchar();
while (c>='A'&&c<='Z')
{
a[i].y+=<<c-'A';
c=getchar();
}
f[a[i].y]=min(f[a[i].y],a[i].x);
}
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++)
if ((i|j|k)==) ans=min(ans,f[i]+f[j]+f[k]);
if (ans==) cout<<-;
else cout<<ans;
return ;
}
C:显然就是取一些数使乘积最大。讨论一下各种情况。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
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;
}
#define N 200010
int n,a[N];
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read();
int cnt=;
for (int i=;i<=n;i++)
{
a[i]=read();
cnt+=a[i]<;
}
int last=;
if (cnt%==)
{
int cnt=;
for (int i=;i<=n;i++)
if (a[i]==)
{
cnt++;
if (last) printf("%d %d %d\n",,last,i);
last=i;
}
if (last&&cnt<n) printf("%d %d\n",,last);
last=;
for (int i=;i<=n;i++)
if (a[i]!=)
{
if (last) printf("%d %d %d\n",,last,i);
last=i;
}
}
else
{
int mx=,cnt=;
for (int i=;i<=n;i++)
if (a[i]<&&(!mx||a[i]>a[mx])) mx=i;
for (int i=;i<=n;i++)
if (a[i]==) cnt++,printf("%d %d %d\n",,i,mx);
if (cnt<n-) printf("%d %d\n",,mx);
last=;
for (int i=;i<=n;i++)
if (a[i]!=&&i!=mx)
{
if (last) printf("%d %d %d\n",,last,i);
last=i;
}
}
return ;
}
D:前缀和后即每次询问有多少个数与x的和小于y。随便拿个数据结构维护一下,感觉treap比较方便。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
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;
}
#define N 200010
#define ll long long
#define lson tree[k].ch[0]
#define rson tree[k].ch[1]
int n,root,cnt=;
ll m,a[N],ans;
struct data{ll x;int p,ch[],s;
}tree[N];
void up(int k){tree[k].s=tree[lson].s+tree[rson].s+;}
void move(int &k,int p)
{
int t=tree[k].ch[p];
tree[k].ch[p]=tree[t].ch[!p],tree[t].ch[!p]=k,up(k),up(t),k=t;
}
void ins(int &k,ll x)
{
if (k==){k=++cnt;tree[k].x=x,tree[k].s=,tree[k].p=rand();tree[k].ch[]=tree[k].ch[]=;return;}
tree[k].s++;
if (x<tree[k].x) {ins(lson,x);if (tree[lson].p>tree[k].p) move(k,);}
else {ins(rson,x);if (tree[rson].p>tree[k].p) move(k,);}
}
ll query(int k,ll s)
{
if (k==) return ;
if (tree[k].x>s) return query(lson,s);
else return query(rson,s)+tree[lson].s+;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
cin>>n>>m;m--;
srand();
for (int i=;i<=n;i++) a[i]=a[i-]+read();
ins(root,);
for (int i=;i<=n;i++)
{
ans+=i-query(root,a[i]-m-);
ins(root,a[i]);
}
cout<<ans;
return ;
}
E:从小到大倒退期望即可。每次需要知道某格子到其他小于他的格子的距离平方之和,显然横纵坐标可以分别计算,然后展开即可维护。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
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;
}
#define N 1010
#define P 998244353
int n,m,s,sum,Sum[],Sqr[],Cnt[];
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;
}
int trans(int x,int y){return (x-)*m+y;}
struct data{int x,y,v,ans;
}a[N*N];
bool cmp(const data&a,const data&b)
{
return a.v<b.v;
}
void update(int k,int x,int p)
{
a[k].ans=(a[k].ans+1ll*x*x%P*Cnt[p]%P+Sqr[p]-2ll*x*Sum[p]%P+P)%P;
}
void ins(int x,int p)
{
Cnt[p]++;Sum[p]=(Sum[p]+x)%P;Sqr[p]=(Sqr[p]+1ll*x*x%P)%P;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
a[trans(i,j)].x=i,a[trans(i,j)].y=j,a[trans(i,j)].v=read();
int x=read(),y=read();s=trans(x,y);
sort(a+,a+n*m+,cmp);
for (int i=;i<=n*m;i++)
{
int t=i;
while (t<n*m&&a[t+].v==a[i].v) t++;
for (int j=i;j<=t;j++)
{
a[j].ans=sum;
update(j,a[j].x,),update(j,a[j].y,);
a[j].ans=1ll*a[j].ans*ksm(i-,P-)%P;
}
for (int j=i;j<=t;j++)
{
ins(a[j].x,),ins(a[j].y,);
sum=(sum+a[j].ans)%P;
}
i=t;
}
for (int i=;i<=n*m;i++)
if (trans(a[i].x,a[i].y)==s) {cout<<a[i].ans;return ;}
}
F:想了半天觉得一点也不可做,于是大力贪心,莫名其妙就过了。设f[i]为i子树内划分集合的最少数量,g[i]为i子树中这些集合的最大深度的最小值。dp时贪心地合并各子树内最大深度最小的那些集合,即把小的合并在一块,大的不管了。并没有想清楚为什么对。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
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;
}
#define N 1000010
int n,m,p[N],degree[N],deep[N],fa[N],f[N],g[N],b[N],root,t=;
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 dp(int k)
{
bool flag=;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k]) flag=,dp(edge[i].to);
if (flag) f[k]=,g[k]=;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k]) f[k]+=f[edge[i].to];
int cnt=;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k]) b[++cnt]=g[edge[i].to]+;
sort(b+,b+cnt+);
if (cnt) g[k]=b[];
for (int i=;i<cnt;i++)
if (b[i]+b[i+]<=m) f[k]--,g[k]=b[i+];
}
void dfs(int k)
{
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);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read();
for (int i=;i<n;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
degree[x]++,degree[y]++;
}
for (int i=;i<=n;i++) if (degree[i]>) {root=i;break;}
dfs(root);
dp(root);
cout<<f[root];
return ;
}
result:rank 5
Codeforces Round #510 Div. 2 Virtual Participate记的更多相关文章
- Codeforces Round #510 (Div. 2)
Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 #include<iostream> usi ...
- Educational Codeforces Round 58 Div. 2 自闭记
明明多个几秒就能场上AK了.自闭. A:签到. #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- Codeforces Round #510 (Div. 2) D. Petya and Array(离散化+反向树状数组)
http://codeforces.com/contest/1042/problem/D 题意 给一个数组n个元素,求有多少个连续的子序列的和<t (1<=n<=200000,abs ...
- Codeforces Round #510 (Div. 2) B. Vitamins
B. Vitamins 题目链接:https://codeforces.com/contest/1042/problem/B 题意: 给出几种药,没种可能包含一种或多种(最多三种)维生素,现在问要吃到 ...
- Codeforces Round #510 (Div. 2) D. Petya and Array(树状数组)
D. Petya and Array 题目链接:https://codeforces.com/contest/1042/problem/D 题意: 给出n个数,问一共有多少个区间,满足区间和小于t. ...
- Codeforces Round#402(Div.1)掉分记+题解
哎,今天第一次打div1 感觉头脑很不清醒... 看到第一题就蒙了,想了好久,怎么乱dp,倒过来插之类的...突然发现不就是一道sb二分吗.....sb二分看了二十分钟........ 然后第二题看了 ...
- Codeforces Round #554 (Div. 2)自闭记
A 签到 #include<bits/stdc++.h> using namespace std; ],t[],ans; int main() { scanf("%d%d&quo ...
- Codeforces Round #545 Div. 1自闭记
A:求出该行该列各有多少个比其小的取max,该行该列各有多少个比其大的取max,加起来即可. #include<iostream> #include<cstdio> #incl ...
- Codeforces Round #510 (Div. 2)(C)
传送门:Problem C https://www.cnblogs.com/violet-acmer/p/9682082.html 题意: 给你n个数,定义有两种操作 ① 1 i j : (i != ...
随机推荐
- 深圳Uber司机本周(7.13-7.19凌晨4:00)的奖励政策
本周(7.13-7.19凌晨4:00)的奖励政策为: 佣金返还: 车费的20%适用于所有产品(不包括Tesla)无获取条件 翻倍补贴: 每周一到周四07:00-10:00/17:00-22:00:车费 ...
- 成都Uber优步司机奖励政策(3月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 成都Uber优步司机奖励政策(3月11日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- springboot shiro没有注解解决方案
颓废的悠然 springboot shiro开启注释 shiroconfiguration中增加 1 2 3 4 5 6 7 @Bean public AuthorizationAttri ...
- php session存入redis
php的会话默认以文件的形式存在,可以配知道NOSQL中,既可以提高访问速度又能好好的实现回话共享,在后期做负载均衡时实现多台服务器session 同步也是比较方便: 一:在php配置文件中改 修改p ...
- Ubuntu主题美化篇
主题美化篇 Ubuntu自带的主题简直不敢恭维,这里博主将它美化了一番,心情瞬间都好了一大截,码代码也会飞起!!先放一张我美化后的效果. 桌面和终端效果如下: unity-tweak-tool 调整 ...
- 「LeetCode」0001-Two Sum(Ruby)
题意与分析 题意直接给出来了:给定一个数,返回数组中和为该数(下为\(x\))的两个数的下标. 这里有一个显然的\(O(n)\)的实现:建立一个hash表,每次读入数(记作\(p\))的时候查询has ...
- 下落的树叶 (The Falling Leaves UVA - 699)
题目描述: 原题:https://vjudge.net/problem/UVA-699 题目思路: 1.依旧二叉树的DFS 2.建树过程中开个数组统计 //紫书源代码WA AC代码: #include ...
- 收割大厂offer需要具备的条件
转载出处 本人也一直在关注互联网,觉得还是有些了解.互联网要求是越来越高了,竞争的人太多了,不过你不用担心,个人觉得,你到了中层的水平,拿二线offer应该没问题,人多也有人多的好处,我比别人多努力一 ...
- js经典试题之w3规范系列
js经典试题之w3规范系列 1:w3c 制定的 javascript 标准事件模型的正确的顺序? 答案:事件捕获->事件处理->事件冒泡 解析:先事件捕获从windows > doc ...