题目链接:戳我

小注:其中部分(大括号不换行的)代码是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. UAV图像拼接软件编译环境配置

    1,需要下载的软件: 依次安装qt-opensource.addin qt安装目录为C:\Qt\4.8.6 2,vs2010配置 *配置UAVBeta工程的属性,下图黑色字体部分与qt相关,取决于你的 ...

  2. 两个链表的第一个公共结点——牛客offer

    题目描述: 输入两个链表,找出它们的第一个公共结点. 题目分析: 只是数据域相同不是公共节点.公共结点代表该节点在两个链表中的数据域和指针域都是相同的,这意味着从该公共节点开始,后面的结点都是两个链表 ...

  3. winfrom_根据checkbox勾选项增减dgv字段列

    1.效果: 2.点击‘配置’按钮: private void btn_configure_Click(object sender, EventArgs e) { string sum = string ...

  4. day1-css练习[新浪首页顶部栏]

    直接贴代码吧: html代码 <div class="border-01"> <div class="border-001"> < ...

  5. Git——文件初始化及设置签名

    1. 本地库初始化 命令: git init 效果: 

  6. Joomla 3.0.0 - 3.4.6 RCE漏洞分析记录

    0x00  前言 今天早上看到了国内几家安全媒体发了Joomla RCE漏洞的预警,漏洞利用的EXP也在Github公开了.我大致看了一眼描述,觉得是个挺有意思的漏洞,因此有了这篇分析的文章,其实这个 ...

  7. 分享一个百万数量级的测试学习用的mysql数据集

    TEST_DB 带有集成测试套件的示例数据库,用于测试应用程序和数据库服务器 此存储库已从Launchpad迁移. 请参阅MySQL文档中的用法 它来自哪里 原始数据由西门子企业研究中心的Fushen ...

  8. Docker_云计算技术简述

    Docker官方网站 > https://www.docker.com/Docker博客 > https://www.docker.com/blog/Docker内容库 > http ...

  9. IPC之msg.c源码解读

    // SPDX-License-Identifier: GPL-2.0 /* * linux/ipc/msg.c * Copyright (C) 1992 Krishna Balasubramania ...

  10. Some ArcGIS Tools

    在矢量叠加,即将同一区域.同一比例尺的两组或两组以上的多边形要素的数据文件进行叠加产生一个新的数据层,其结果综合了原来图层所具有的属性.矢量叠加操作分为:交集(Intersect).擦除(Erase) ...