题目链接:戳我

小注:其中部分(大括号不换行的)代码是BLUESKY007神仙写的。

CF1184 A1

直接枚举,以根号的时间复杂度判断即可。注意x,y都是正整数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
#define ll long long
using namespace std;
ll r;
inline ll calc(ll x)
{
ll cur=r-x*x-x-1;
if(cur<=0) return -1;
if(cur%(2*x)==0) return cur/(2*x);
else return -1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%lld",&r);
for(ll i=1;i<=1000000;i++)
{
if(calc(i)>0)
{
printf("%lld %lld\n",i,calc(i));
return 0;
}
}
printf("NO\n");
return 0;
}

CF1184 A2

我们可以知道对于k,如果\(gcd(k,n)\)可以的话,那么k一定也可以。

所以我们就把枚举k才能计算的东西降低到了log的时间复杂度。

然后按每次长度为k在环上往后跳,直到跳到一个点第二次。在这期间,显然其中为1的边的个数为偶数才是可行方案。

那么直接把它们异或起来就行了。QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 200010
using namespace std;
int n,ans;
int cnt[MAXN],done[MAXN];
char s[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
scanf("%s",s);
for(int i=1;i<=n;i++) cnt[__gcd(i,n)]++;
for(int i=1;i<=n;i++)
{
if(cnt[i])
{
bool flag=false;
memset(done,0,sizeof(done));
for(int j=0;j<n;j++)
{
if(!done[j])
{
int cur_ans=0,x=j;
while(!done[x])
{
cur_ans^=(s[x]-'0');
done[x]=1;
x=(x+i)%n;
}
if(cur_ans) flag=true;
}
}
if(!flag) ans+=cnt[i];
}
}
printf("%d\n",ans);
return 0;
}

CF1184 B1

二分。

#include<bits/stdc++.h>

using namespace std;

const int N=1e5+5;

struct base{
int d,g,id;
bool operator<(const base&rhs)const{
return d!=rhs.d?d<rhs.d:id<rhs.id;
}
}ba[N]; int s,b,a[N]; long long sum[N]; int bs(int l,int r,int u){
if(l==r){
return l;
}
int mid=(l+r+1)>>1;
if(ba[mid].d<=u){
return bs(mid,r,u);
}
else{
return bs(l,mid-1,u);
}
} int main(){
scanf("%d%d",&s,&b);
for(int i=1;i<=s;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=b;i++){
scanf("%d%d",&ba[i].d,&ba[i].g);
ba[i].id=i;
}
sort(ba+1,ba+b+1);
for(int i=1;i<=b;i++){
sum[i]=sum[i-1]+ba[i].g;
}
for(int i=1;i<=s;i++){
printf("%lld%c",sum[bs(0,b,a[i])]," \n"[i==s]);
}
return 0;
}

CF1184 B2

CF1184 C1

暴力地找四个点,然后判断一下他们构成的矩形上是不是正好缺少一个点qwq

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
using namespace std;
int n;
struct Node{int x,y;}node[MAXN];
inline void calc(int a,int b,int c,int d)
{
int down=0x3f3f3f3f,up=0,ll=0x3f3f3f3f,rr=0,cnt=0;
ll=min(ll,node[a].x),ll=min(ll,node[b].x),ll=min(ll,node[c].x),ll=min(ll,node[d].x);
rr=max(rr,node[a].x),rr=max(rr,node[b].x),rr=max(rr,node[c].x),rr=max(rr,node[d].x);
down=min(down,node[a].y),down=min(down,node[b].y),down=min(down,node[c].y),down=min(down,node[d].y);
up=max(up,node[a].y),up=max(up,node[b].y),up=max(up,node[c].y),up=max(up,node[d].y);
int kkk;
for(int i=1;i<=n;i++)
{
if(ll<=node[i].x&&node[i].x<=rr&&(node[i].y==down||node[i].y==up)) cnt++;
else if(down<=node[i].y&&node[i].y<=up&&(node[i].x==ll||node[i].x==rr)) cnt++;
else kkk=i;
}
if(cnt==n-1)
{
printf("%d %d\n",node[kkk].x,node[kkk].y);
exit(0);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=4*n+1;i++)
{
scanf("%d%d",&node[i].x,&node[i].y);
}
n=4*n+1;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
for(int k=j+1;k<=n;k++)
for(int p=k+1;p<=n;p++)
calc(i,j,k,p);
return 0;
}

CF1184 C2

CF1184 D1

开始还以为要用链表直接模拟即可,注意判断一下加入和删除的位置和当前主人公所在位置的大小。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
#define ll long long
using namespace std;
int n,m,k,t;
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d%d%d",&n,&k,&m,&t);
while(t--)
{
int op,pos;
scanf("%d%d",&op,&pos);
if(op==0)
{
if(pos>=k) n=pos;
else n-=pos,k-=pos;
}
else
{
if(pos<=k) k++,n++;
else n++;
}
printf("%d %d\n",n,k);
}
return 0;
}

CF1184 E1

二分一下桥1的值,看看能否在最小生成树中。

#include<bits/stdc++.h>

using namespace std;

const int N=1e6+6;

int n,m,fr[N],to[N],w[N],fa[N],siz[N];

bool usd[N];

int find(int u){
return fa[u]==u?fa[u]:fa[u]=find(fa[u]);
} struct edge{
int u,v,w,id;
bool operator<(const edge&rhs)const{
return w<rhs.w;
}
}e[N]; bool unifa(int u,int v){
if(find(u)==find(v)){
return 0;
}
fa[find(v)]=find(u);
return 1;
} bool can(int u){
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=2;i<=m;i++){
if(e[i].w<u){
unifa(e[i].u,e[i].v);
}
}
return unifa(e[1].u,e[1].v);
} int bs(int l,int r){
if(l==r){
return l;
}
int mid=(l+r+1)>>1;
if(!can(mid)){
return bs(l,mid-1);
}
else{
return bs(mid,r);
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
e[i].id=i;
}
printf("%d\n",bs(0,1e9));
return 0;
}

CF1184 E2

我们先构建最小生成树,然后每次处理到一条不在最小生成树上的边的时候,倍增往上面找最小的一条边的值就行了。

#include<bits/stdc++.h>
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
#define debug printf("%d %s\n",__LINE__,__FUNCTION__) using namespace std; const int N=1e6+6; int n,m,fa[N],dep[N]; vector<int>G[N],W[N]; bool vis[N];int ans[N]; int find(int u){
return fa[u]==u?fa[u]:fa[u]=find(fa[u]);
} bool unifa(int u,int v){
if(find(u)==find(v)){
return 0;
}
fa[find(v)]=find(u);
return 1;
} struct edge{
int u,v,w,id;
edge(int ru=0,int rv=0,int rw=0,int ri=0){
u=ru;v=rv;w=rw;id=ri;
}
bool operator<(const edge&rhs)const{
return w<rhs.w;
}
}e[N]; void addedge(int u,int v,int w){
G[u].push_back(v);W[u].push_back(w);
} int jump[N][18],mx[N][18]; void dfs(int u,int fr){
for(int i=0,v;i<(int)G[u].size();i++){
v=G[u][i];
if(v==fr){
continue;
}
dep[v]=dep[u]+1;
jump[v][0]=u;
mx[v][0]=W[u][i];
for(int j=1;j<18;j++){
jump[v][j]=jump[jump[v][j-1]][j-1];
mx[v][j]=max(mx[v][j-1],mx[jump[v][j-1]][j-1]);
}
dfs(v,u);
}
} pii lca(int u,int v){
int rep=0;
if(dep[u]<dep[v]){
swap(u,v);
}
for(int i=17;~i;i--){
if(dep[jump[u][i]]>=dep[v]){
rep=max(mx[u][i],rep);
u=jump[u][i];
}
}
if(u==v){
return mk(u,rep);
}
for(int i=17;~i;i--){
if(jump[u][i]!=jump[v][i]){
rep=max(rep,max(mx[u][i],mx[v][i]));
u=jump[u][i];
v=jump[v][i];
}
}
rep=max(rep,max(mx[u][0],mx[v][0]));
return mk(jump[u][0],rep);
} int query(int u,int v){
return lca(u,v).se;
} int main(){
scanf("%d%d",&n,&m);
for(int i=1,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
e[i]=edge(u,v,w,i);
}
for(int i=1;i<=n;i++){
fa[i]=i;
}
sort(e+1,e+m+1);
for(int i=1;i<=m;i++){
if(unifa(e[i].u,e[i].v)){
vis[e[i].id]=1;
addedge(e[i].u,e[i].v,e[i].w);
addedge(e[i].v,e[i].u,e[i].w);
}
}
dep[1]=1;dfs(1,0);
for(int i=1;i<=m;i++){
if(!vis[e[i].id]){
ans[e[i].id]=query(e[i].u,e[i].v);
}
}
for(int i=1;i<=m;i++){
if(!vis[i]){
printf("%d\n",ans[i]);
}
}
return 0;
}

CF1184 E3

#include<bits/stdc++.h>
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second using namespace std; const int N=1e6+6; int n,m,fa[N],afa[N],dep[N],eid[N]; vector<int>G[N],W[N],wid[N]; bool vis[N];int ans[N]; int find(int u){
return fa[u]==u?fa[u]:fa[u]=find(fa[u]);
} bool unifa(int u,int v){
if(find(u)==find(v)){
return 0;
}
fa[find(v)]=find(u);
return 1;
} int afind(int u){
return afa[u]==u?afa[u]:afa[u]=afind(afa[u]);
} bool aunifa(int u,int v){
if(afind(u)==afind(v)){
return 0;
}
afa[afind(u)]=afind(v);
return 1;
} struct edge{
int u,v,w,id;
edge(int ru=0,int rv=0,int rw=0,int ri=0){
u=ru;v=rv;w=rw;id=ri;
}
bool operator<(const edge&rhs)const{
return w<rhs.w;
}
}e[N]; void addedge(int u,int v,int w,int id){
G[u].push_back(v);W[u].push_back(w);wid[u].push_back(id);
} int jump[N][18],mx[N][18]; void dfs(int u,int fr){
for(int i=0,v;i<(int)G[u].size();i++){
v=G[u][i];
if(v==fr){
continue;
}
dep[v]=dep[u]+1;
jump[v][0]=u;
eid[v]=wid[u][i];
mx[v][0]=W[u][i];
for(int j=1;j<18;j++){
jump[v][j]=jump[jump[v][j-1]][j-1];
mx[v][j]=max(mx[v][j-1],mx[jump[v][j-1]][j-1]);
}
dfs(v,u);
}
} pii lca(int u,int v){
int rep=0;
if(dep[u]<dep[v]){
swap(u,v);
}
for(int i=17;~i;i--){
if(dep[jump[u][i]]>=dep[v]){
rep=max(mx[u][i],rep);
u=jump[u][i];
}
}
if(u==v){
return mk(u,rep);
}
for(int i=17;~i;i--){
if(jump[u][i]!=jump[v][i]){
rep=max(rep,max(mx[u][i],mx[v][i]));
u=jump[u][i];
v=jump[v][i];
}
}
rep=max(rep,max(mx[u][0],mx[v][0]));
return mk(jump[u][0],rep);
} int query(int u,int v){
return lca(u,v).se;
} int main(){
scanf("%d%d",&n,&m);
for(int i=1,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
e[i]=edge(u,v,w,i);
}
for(int i=1;i<=n;i++){
fa[i]=afa[i]=i;ans[i]=1e9;
}
sort(e+1,e+m+1);
for(int i=1;i<=m;i++){
if(unifa(e[i].u,e[i].v)){
vis[e[i].id]=1;
addedge(e[i].u,e[i].v,e[i].w,e[i].id);
addedge(e[i].v,e[i].u,e[i].w,e[i].id);
}
}
dep[1]=1;dfs(1,0);
for(int i=1,l,u,v;i<=m;i++){
if(!vis[e[i].id]){
ans[e[i].id]=query(e[i].u,e[i].v);
l=lca(e[i].u,e[i].v).fi;
u=afind(e[i].u);v=afind(e[i].v);
while(dep[u]>dep[l]){
if(aunifa(u,jump[u][0])){
ans[eid[u]]=e[i].w;
}
u=afind(jump[u][0]);
}
while(dep[v]>dep[l]){
if(aunifa(v,jump[v][0])){
ans[eid[v]]=e[i].w;
}
v=afind(jump[v][0]);
}
}
}
for(int i=1;i<=m;i++){
printf("%d\n",ans[i]);
}
return 0;
}

Helvetic Coding Contest 2019的更多相关文章

  1. Helvetic Coding Contest 2019 差A3 C3 D2 X1 X2

    Helvetic Coding Contest 2019 A2 题意:给一个长度为 n 的01序列 y.认为 k 合法当且仅当存在一个长度为 n 的01序列 x,使得 x 异或 x 循环右移 k 位的 ...

  2. Helvetic Coding Contest 2019 online mirror (teams allowed, unrated)

    http://codeforces.com/contest/1184 A1 找一对整数,使x^x+2xy+x+1=r 变换成一个分式,保证整除 #include<iostream> #in ...

  3. CF 690C3. Brain Network (hard) from Helvetic Coding Contest 2016 online mirror (teams, unrated)

    题目描述 Brain Network (hard) 这个问题就是给出一个不断加边的树,保证每一次加边之后都只有一个连通块(每一次连的点都是之前出现过的),问每一次加边之后树的直径. 算法 每一次增加一 ...

  4. [Helvetic Coding Contest 2017 online mirror]

    来自FallDream的博客,未经允许,请勿转载,谢谢, 第一次在cf上打acm...和同校大佬组队打 总共15题,比较鬼畜,最后勉强过了10题. AB一样的题目,不同数据范围,一起讲吧 你有一个背包 ...

  5. 【Codeforces】Helvetic Coding Contest 2017 online mirror比赛记

    第一次打ACM赛制的团队赛,感觉还行: 好吧主要是切水题: 开场先挑着做五道EASY,他们分给我D题,woc什么玩意,还泊松分布,我连题都读不懂好吗! 果断弃掉了,换了M和J,然后切掉了,看N题: l ...

  6. Helvetic Coding Contest 2016 online mirror A1

    Description Tonight is brain dinner night and all zombies will gather together to scarf down some de ...

  7. Helvetic Coding Contest 2016 online mirror F1

    Description Heidi has finally found the mythical Tree of Life – a legendary combinatorial structure ...

  8. Helvetic Coding Contest 2016 online mirror B1

    Description The zombies are gathering in their secret lair! Heidi will strike hard to destroy them o ...

  9. Helvetic Coding Contest 2016 online mirror C2

    Description Further research on zombie thought processes yielded interesting results. As we know fro ...

随机推荐

  1. Python编程之注释

    一.注释 当你把变量理解透了,你就已经进入了编程的世界.随着学习的深入,用不了多久,你就可以写复杂的上千甚至上万行的代码啦,有些代码你花了很久写出来,过了些天再回去看,发现竟然看不懂了,这太正常了. ...

  2. Xshell~工作中访问Linux服务器

    1.下载Xshell 下载地址:https://xshell.en.softonic.com/ 2.安装(无特殊修改,自行安装即可) 3.使用 登录(1.新建->输入主机IP,点击确定-> ...

  3. 移动站Web开发图片自适应两种常见情况解决方案

    本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案.开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集, ...

  4. Navicat 12的安装与使用(附加破解)

    地址https://blog.csdn.net/tomos428/article/details/80483450?tdsourcetag=s_pctim_aiomsg

  5. vue 编辑

    点击文字修改 <div class="baseInfo"> <p class="title">基本信息</p> <p ...

  6. SokcetClient VC++6.0

    // SokcetClient.cpp: implementation of the SokcetClient class. // ////////////////////////////////// ...

  7. Shell脚本变量与判断

    变量 环境变量 局部变量 declare 定义变量类型 本地变量 local 在函数中使用 变量类型: 数值型: 1.整形 2.浮点型 3.布尔型 0 1 (真 假) (true false) 字符串 ...

  8. 【Day1】2.安装运行Python

     视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...

  9. contextlib:上下文管理器工具

    介绍 contextlib模块包含的工具可以用于处理上下文管理器和with语句 上下文管理器API ''' 上下文管理器(context manager)负责管理一个代码块中的资源,会在进入代码块时创 ...

  10. 如何在国内跑Kubernetes的minikube

    跑minikube start老是被卡住,得到如以下的结果 minikube start --registry-mirror=https://registry.docker-cn.com miniku ...