Link:

Codeoforces #188 传送门

A:

先全转为正数,后面就全是指数级增长了

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
ll x,y,m,res; int main()
{
cin>>x>>y>>m;
if(max(x,y)<m&&max(x,y)<=)
return puts("-1"),; while(x<m&&y<m)
{
if(x>y) swap(x,y);
ll t=(y-x)/y+;
res+=t;x+=t*y;
}
cout<<res;
return ;
}

Problem A

不断将$(x,y)$改为$(x+y,x)$要分类,在一数为负数时为线性增长

B:

首先要发现最终不为0的点的$x,y$的范围仅不到$[-100,100]$

又由于最终状态和操作顺序无关,因此每次将可能区域内的点暴力更新即可

不过我一开始使用了$bfs$,导致同一个位置可能每次进栈多次从而TLE……

以后$bfs$在同一层时一定要控制每个数的进栈次数!能每个位置暴力就不要$bfs$

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int ZERO=;
int n,t,x,y,a[*ZERO][*ZERO],flag=;
int dx[]={,,,-},dy[]={,-,,}; int main()
{
scanf("%d%d",&n,&t);
a[ZERO][ZERO]=n;
while(flag)
{
flag=;
for(int i=ZERO-;i<=ZERO+;i++)
for(int j=ZERO-;j<=ZERO+;j++)
if(a[i][j]>=)
{
flag=;
for(int k=;k<;k++)
a[i+dx[k]][j+dy[k]]+=a[i][j]/;
a[i][j]%=;
}
}
while(t--)
scanf("%d%d",&x,&y),printf("%d\n",abs(x)<=ZERO&&abs(y)<=ZERO?a[ZERO+x][ZERO+y]:);
return ;
}

Problem B

C:

其实是一道不算难的模拟题?可能当时被吓到了……

只要每个连通块里保证收支平衡就保证有解

接下来可以暴力枚举点对转移,保证是将多出的转入少的中,这样就可以忽略上限这个条件了

但也可以总共$O(n^2)$得做:

由于转移次数上限为$O(2*n^2)$,因此可以仅将每个连通块连成一棵树

将一个当前不够的点作为根先做一个预处理,只要$O(n)$的遍历就能使该点符合条件

过程中注意保证已经符合条件的点不能改变,将当前多出的转移

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+;
struct edge{int nxt,to;}e[MAXN<<];
struct result{int x,y,val;}res[MAXN<<];
int n,v,m,x,y,a[MAXN],b[MAXN],f[MAXN],head[MAXN],tot,cnt;ll sum[MAXN]; int find(int x)
{return f[x]==x?x:f[x]=find(f[x]);}
void add_edge(int x,int y)
{e[++tot]={head[x],y};head[x]=tot;e[++tot]={head[y],x};head[y]=tot;}
void add_res(int x,int y,int val)
{a[x]-=val,a[y]+=val,res[++cnt]={x,y,val};} void dfs(int x,int anc)
{
sum[x]=a[x]-b[x];
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=anc) dfs(e[i].to,x),sum[x]+=sum[e[i].to];
}
void solve(int x,int anc,int val)
{
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc||sum[e[i].to]<=) continue;
int w=sum[e[i].to]<val?sum[e[i].to]:val,tmp=a[e[i].to];
if(tmp>=w)
{
add_res(e[i].to,x,w);
if(a[e[i].to]<b[e[i].to]&&tmp>=b[e[i].to])
solve(e[i].to,x,b[e[i].to]-a[e[i].to]);
}
else
{
add_res(e[i].to,x,tmp);
if(tmp<b[e[i].to]) solve(e[i].to,x,w-tmp);
else solve(e[i].to,x,w-tmp+b[e[i].to]);
add_res(e[i].to,x,w-tmp);
}
val-=w;if(!val) return;
}
} int main()
{
scanf("%d%d%d",&n,&v,&m);
for(int i=;i<=n;i++) f[i]=i;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&b[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
int posx=find(x),posy=find(y);
if(posx!=posy) add_edge(x,y),f[posx]=posy;
}
for(int i=;i<=n;i++) sum[find(i)]+=a[i]-b[i];
for(int i=;i<=n;i++) if(sum[i]) return puts("NO"),; for(int i=;i<=n;i++)
if(a[i]<b[i]) dfs(i,),solve(i,,b[i]-a[i]);
printf("%d\n",cnt);
for(int i=;i<=cnt;i++)
printf("%d %d %d\n",res[i].x,res[i].y,res[i].val);
return ;
}

Problem C

D:

很明显的一道博弈论

找到所有极大的集合${X^s}$,对每个集合求$SG$值最后异或即可

其中数量大于2的集合可以$sqrt(n)$得找出,剩下数量为1的$SG=1$,可以统一计算

同时$SG$值仅和集合内数量相关,可以预处理+打表

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int mx=,MAXN=1e5+;
//unordered_map<int,int> mp;
int n,k,pre[],vis[MAXN],rem,res;
int sg[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
/*
int solve(int x)
{
int &tmp=mp[x];
if(tmp) return tmp;
int ret=(1<<mx)-1;
for(int i=1;(1<<(i-1))<=x;i++)
if(x&(1<<(i-1)))
ret&=~solve(x&~pre[i]);
return tmp=ret&(-ret);
}
*/
int main()
{
/*
for(int i=1;i<=mx;i++)
for(int j=i;j<=mx;j+=i)
pre[i]|=(1<<(j-1));
mp.max_load_factor(0.30);
mp.reserve(750000);
for(int i=1;i<mx;i++)
sg[i]=__builtin_ctz(solve((1<<i)-1));
*/
scanf("%d",&n);
rem=n;res=;
for(int i=;i*i<=n;i++)
if(!vis[i])
{
k=;
for(ll j=i;j<=n;j*=i,k++)
if(j*j<=n) vis[j]=;
rem-=k;res^=sg[k];
}
res^=(rem&);
puts(res?"Vasya":"Petya");
return ;
}

Problem D

与次方相关的注意将大于1的和1次方分开考虑

注意该题各种位运算技巧和$unordered\_ map$以及$builtin\_ ctz,reserve(),max\_load\_factor$的使用

E:

[Codeforces #188] Tutorial的更多相关文章

  1. [Codeforces #172] Tutorial

    Link: Codeforces #172 传送门 A: 一眼看上去分两类就可以了 1.每个矩形只有两条边相交,重合的形状为菱形 2.每个矩形四条边都有相交 对于情况1答案为$h*h/sin(a)$ ...

  2. [Codeforces #514] Tutorial

    Link: Codeforces #514 传送门 很简单的一场比赛打崩了也是菜得令人无话可说…… D: 一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可 此题 ...

  3. [Codeforces #210] Tutorial

    Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...

  4. [Codeforces #196] Tutorial

    Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...

  5. [Codeforces #174] Tutorial

    Link: Codeforces #174 传送门 A: 求原根的个数,有一条性质是原根个数为$\phi(\phi(n))$,多了一个不会证的性质 如果要确定哪些是原根的话还是要枚举,不过对于每个数不 ...

  6. [Codeforces #190] Tutorial

    Link: Codeforces #190 传送门 A: 明显答案为$n+m-1$且能构造出来 #include <bits/stdc++.h> using namespace std; ...

  7. [Codeforces #211] Tutorial

    Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...

  8. [Codeforces #192] Tutorial

    Link: Codeforces #192 传送门 前两天由于食物中毒现在还要每天挂一天的水 只好晚上回来随便找套题做做找找感觉了o(╯□╰)o A: 看到直接大力模拟了 但有一个更简便的方法,复杂度 ...

  9. [Codeforces #201] Tutorial

    Link: 传送门 代码量很少的一套思维题 A: 试一试发现最后状态一定是所有$min,max$间$gcd$的倍数 直接判断数量的奇偶性即可 #include <bits/stdc++.h> ...

随机推荐

  1. MySQL查询 45道练习题

    SQL查询45道练习题 1.查询Student表中的所有记录的Sname.Ssex和Class列.select sname,ssex,class from student2.查询教师所有的单位即不重复 ...

  2. Lucene7.2.1系列(一)快速入门

    系列文章: Lucene系列(一)快速入门 Lucene系列(二)luke使用及索引文档的基本操作 Lucene系列(三)查询及高亮 Lucene是什么? Lucene在维基百科的定义 Lucene是 ...

  3. linux下删除已经不用的配置文件

    使用命令 dpkg -l | grep -v ^ii 查看当前未安装或者不用了的配置文件 例如我的显示如下

  4. linux编程之文件操作

    在linux下用文件描述符来表示设备文件盒普通文件,文件描述符是一个整型的数据,所有对文件的操作都是通过文件描述符来实现的. 文件描述符是文件系统中连接用户空间和内核空间的枢纽,当我们打开一个或者创建 ...

  5. Linux汇编教程01: 基本知识

    在我们开始学习Linux汇编之前,需要简单的了解一下计算机的体系结构.我们不需要特别深入的了解,理解了一些基本概念对与我们理解程序会很有帮助.现在计算机的结构体系都是采用冯诺依曼体系结构的基础上发展过 ...

  6. 网络知识===wireshark抓包出现“TCP segment of a reassembled PDU”的解释(载)

    网上胡说八道,众说风云,感觉这篇还算靠谱点. 原文链接:http://blog.csdn.net/dog250/article/details/51809566 为什么大家看到这个以后总是会往MSS, ...

  7. linux指令和文件系统

    linux root用户的主目录是 /root , 其余用户在 /home 中: tar 常用 tar -zxvf : 安装使用 yum or wget website: mv a.g b.g 重命名 ...

  8. 2015多校第6场 HDU 5354 Bipartite Graph CDQ,并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5354 题意:求删去每个点后图是否存在奇环(n,m<=1e5) 解法:很经典的套路,和这题一样:h ...

  9. 2.Python3标准库--文本

    (一)string:文本常量和模板 1.函数 import string ''' string模块在最早的Python版本中就已经有了.以前这个模块中提供的很多函数已经移植到str对象中,不过这个模块 ...

  10. 数据库简述(以MySQL为例)

    一.数据库中的概念 1.数据库是用户存放数据.访问数据.操作数据的存储仓库,用户的各种数据被有组织地存放在数据库中.可以随时被有权限的用户查询.统计.添加.删除和修改.可以说,数据库是长期存储在计算机 ...