题目链接:戳我

小注:其中部分(大括号不换行的)代码是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. Web前端开发CSS基础

    CSS 层叠样式表(英文全称:Cascading Style Sheets),是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不 ...

  2. 并不对劲的复健训练-CF1187D

    题目大意 有两个长度为\(n\)的序列\(a_1,...,a_n\),\(b_1,...,b_n\)(\(a,b\leq n\leq 3\times 10^5\) ).一次操作是选取 \([l,r]\ ...

  3. Codeforces 1189D2. Add on a Tree: Revolution

    传送门 首先可以证明一颗树合法的充分必要条件是不存在某个节点的度数为 $2$ 首先它是必要的,考虑任意一条边连接的两点如果存在某一点 $x$ 度数为 $2$ ,那么说明 $x$ 还有连一条边出去,那么 ...

  4. es6 getter setter

    https://stackoverflow.com/questions/34517538/setting-an-es6-class-getter-to-enumerable 1. 我要 getter ...

  5. docker-compose.yml 部署Nginx、Java项目、MySQL、Redis

    version: "3.7" services: nginx: image: nginx restart: always container_name: nginx environ ...

  6. 你不知道的css各类布局(二)之流体布局、液体布局、栅格布局

    流体布局 什么是流 在谈论流体布局之前我们需要知道一件事情就是何为“流”,所谓“流”就是“文档流”,是css中的一种基本定位和布局 概念 流体布局(Liquid/Fluid Layout)指的是利用元 ...

  7. 初识python之了解程序设计基本方法

    对于用计算机解决一些问题,这里有一个程序设计的基本方法,主要分为六个步骤,其分析和实现过程如下: (1)分析问题:利用计算机解决问题需要结合计算机技术的发展水平和人类对问题的思考程度,在特定技术和社会 ...

  8. js之常用正则

    //用户名正则,4到16位(字母,数字,下划线,减号) let uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母, ...

  9. 美国cst时间和夏令时

    美国6 PM CST相当于北京时间几点? 换算北京时间是:8:00,上午8点,日期是第二天.(换算公式:18点+14小时=第二天8点) 6 PM CST:6:00 PM Central Standar ...

  10. java字符常量

    在Java程序中经常会遇到类似于"Hello"这样地字符串,那么这种类型的字符串是Java中是如何存储,下面就说明字符串常量在内存中存储方式: Java程序在编译时会将程序中出现的 ...