前言

这个contest是div1的,div2的题其实也做了一下,但这里就不贴出了

CF 1142 A

题目大意:有nnn个城市排成一圈,相邻两个城市距离为kkk,一个人从起点SSS(SSS未给出)开始,每次走xxx(xxx未给出)的距离,当其第二次到达SSS时就不再走了
现在给出离起始位置最近的城市的距离aaa和离走一步后的位置最近的城市的距离bbb,求可能的走的步数的最大值和最小值
n,k≤105n,k\le10^5n,k≤105
题解:
这题的英文题意有点点难懂
首先,我们可以分类讨论aaa,bbb的情况(因为我们发现最近可以是左边也可以是右边,所以我们讨论的话有4种可能性),然后我们再讨论跨过的城市数,就可以唯一确定xxx(SSS其实也可以知道,但是这里用不到)
我们考虑步数的情况,设步数为lll圈数为ttt,那么满足lx=nktlx=nktlx=nkt即l=nktxl=\frac{nkt}{x}l=xnkt​
由于第一次走到SSS就不继续走了,所以一定满足t=xgcd(nk,x)t=\frac{x}{gcd(nk,x)}t=gcd(nk,x)x​
ttt已经固定,那么代入可得l=nkgcd(nk,x)l=\frac{nk}{gcd(nk,x)}l=gcd(nk,x)nk​,我们希望lll求最值,那么就对gcd(nk,x)gcd(nk,x)gcd(nk,x)求最值即可,复杂度O(n)\mathcal O(n)O(n)

#include<bits/stdc++.h>
typedef long long ll;
#define rg register
template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);}
template <typename T> inline T min(const T a,const T b){return a<b?a:b;}
template <typename T> inline T max(const T a,const T b){return a>b?a:b;}
template <typename T> inline T gcd(const T a,const T b){if(!b)return a;return gcd(b,a%b);}
ll n,k,a,b;
int main()
{read(n),read(k),read(a),read(b);ll mi=0x7fffffffffffffff,mx=0;for(int i=0;i<n;i++){ll x1=gcd(n*k,k-a-b+i*k),x2=gcd(n*k,k+b-a+i*k),x3=gcd(n*k,a+b  +i*k),x4=gcd(n*k,k+a-b+i*k);mi=min(mi,min(x1,min(x2,min(x3,x4))));mx=max(mx,max(x1,max(x2,max(x3,x4))));}print(n*k/mx),putchar(' '),print(n*k/mi);return 0;
}

CF 1142 B

题目大意:给定一个长度为nnn的排列AAA和一个长度为mmm的数组BBB
若干组询问,每次询问数组BBB的一个子段CCC(位置是lll到rrr)是否包含一个子序列DDD使得AAA与DDD循环同构
n,m≤2⋅105n,m\le2·10^5n,m≤2⋅105
题解: 我们考虑预处理每个端点lll,存在一个合法的DDD的rrr的最小值
由于这题中的AAA是个排列,所以以每个点开始的下一个位置都是唯一确定的
考虑倍增以每个位置开始走2k2^k2k步的最靠左位置,最后直接通过这个数组算出走n−1n-1n−1步的最靠左位置即可,复杂度O(nlogn)\mathcal O(nlogn)O(nlogn)

#include<bits/stdc++.h>
typedef long long ll;
#define rg register
template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);}
template <typename T> inline T min(const T a,const T b){return a<b?a:b;}
template <typename T> inline T max(const T a,const T b){return a>b?a:b;}
int n,m,q;
int las[200005],nxt[200005],a[200005],b[200005],f[200005][19],ml[200005];
int main()
{read(n),read(m),read(q);for(rg int i=1;i<=n;i++)read(a[i]);for(rg int i=1;i<=m;i++)read(b[i]);for(rg int i=1;i<n;i++)nxt[a[i]]=a[i+1];nxt[a[n]]=a[1];for(rg int i=1;i<=n;i++)las[i]=m+1;for(rg int j=0;j<=18;j++)f[m+1][j]=m+1;n--;ml[m+1]=m+1;for(rg int i=m;i>=1;i--){f[i][0]=las[nxt[b[i]]];las[b[i]]=i;for(rg int j=1;j<=18;j++)f[i][j]=f[f[i][j-1]][j-1];int tot=i;for(rg int j=0;j<=18;j++)if((1<<j)&n)tot=f[tot][j];ml[i]=min(ml[i+1],tot);}while(q--){int l,r;read(l),read(r);putchar((r>=ml[l])+'0');}return 0;
}

CF 1142 C

题目大意:给定平面上的nnn个点,很显然,两个xxx坐标不同的点确定一个二次函数y=x2+bx+cy=x^2+bx+cy=x2+bx+c
问有多少个二次函数满足没有点被包在内部(一个点(xi,yi)(x_i,y_i)(xi​,yi​)被二次函数包在内部的定义是yi&gt;xi2+bxi+cy_i&gt;x_i^2+bx_i+cyi​>xi2​+bxi​+c)
n≤105n\le10^5n≤105
题解:
CCC题就计算几何了,但是这题并不麻烦
我们考虑把式子移项
变成y−x2=bx+cy-x^2=bx+cy−x2=bx+c
即如果每个点(xi,yi)(x_i,y_i)(xi​,yi​)变成(xi,yi−xi2)(x_i,y_i-x_i^2)(xi​,yi​−xi2​),就成了两个点确定一个一次函数了
考虑被包住的定义,同样移项变成yi−xi2&gt;bxi+cy_i-x_i^2&gt;bx_i+cyi​−xi2​>bxi​+c,相当于就是在这个一次函数的上方
我们发现,这样就好做了,考虑上下凸壳求凸包法,我们直接输出上凸壳的边数即可
求凸壳复杂度O(nlogn)\mathcal O(nlogn)O(nlogn)

#include<bits/stdc++.h>
typedef long long ll;
#define rg register
template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);}
template <typename T> inline T min(const T a,const T b){return a<b?a:b;}
template <typename T> inline T max(const T a,const T b){return a>b?a:b;}
int n,top=1;
struct Point
{ll x,y;bool operator <(const Point b)const{return x==b.x?y>b.y:x<b.x;}Point operator -(const Point b)const{return (Point){x-b.x,y-b.y};}
}Q[100001];
ll Cross(Point a,Point b){return a.x*b.y-a.y*b.x;}
int main()
{read(n);for(rg int i=1;i<=n;i++)read(Q[i].x),read(Q[i].y),Q[i].y-=Q[i].x*Q[i].x;std::sort(Q+1,Q+n+1);for(rg int i=2;i<=n;i++)if(Q[i].x!=Q[top].x){while(top>1&&Cross(Q[i]-Q[top-1],Q[top]-Q[top-1])<=0)top--;Q[++top]=Q[i];}print(top-1);return 0;
}

CF 1142 D

题目大意:定义一个数列AAA,满足如下性质:

给定一个字符串SSS,求有多少种作为一个子串出现的数xxx(x≥1x\ge1x≥1)满足xxx在数列AAA中
∣S∣≤105|S|\le10^5∣S∣≤105
题解:
cf的官方题解好像是建个自动机状物,反正我也没仔细的看
好像有个比较好写的做法
定义f[i][j]f[i][j]f[i][j]为从iii开始的子段,在前面匹配一个jjj之后出现在数列中的数的数量
考虑转移,首先我们发现两位数ab‾\overline{ab}ab当且仅当a&gt;ba&gt;ba>b才会在数列AAA中,那么,显然的,对于一个高位数abT‾\overline{abT}abT,如果a≤ba\le ba≤b,那么这个数一定不在数列中
考虑转移,如果想从cT‾\overline{cT}cT转移到abT‾\overline{abT}abT,那么就要保证c⇔ab‾c\Leftrightarrow\overline{ab}c⇔ab,即判定一个二位数是当前数列第几个,模111111即可,所以我们发现fff的第二维状态元素有111111个,这样的话总复杂度是O(n∗p)\mathcal O(n*p)O(n∗p)的(本题中p=11p=11p=11)

#include<bits/stdc++.h>
typedef long long ll;
#define rg register
template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);}
template <typename T> inline T min(const T a,const T b){return a<b?a:b;}
template <typename T> inline T max(const T a,const T b){return a>b?a:b;}
int n,mod=11;
char s[100001];
int f[100005][11];
ll ans;
int main()
{scanf("%s",s+1),n=strlen(s+1);for(rg int i=n;i>=1;i--){const int d=s[i]-'0';for(rg int j=0;j<mod;j++){if(j>d)f[i][j]=1+f[i+1][(j*(j-1)/2+d+10)%mod];}if(s[i]>'0')ans+=f[i+1][s[i]-'0']+1;}print(ans);return 0;
}

CF 1142 E

题目大意:交互题(即会根据你的输出给接下来的输入):一个nnn个点的完全图,每条边有个方向和颜色,现在有mmm条边是粉色的,告诉你这些粉色边的方向,剩下的边都是绿色的
每次我们可以询问一条绿色边的方向,我们需要使用不超过2∗n2*n2∗n次询问找到一个点xxx使得对于每个点yyy都满足xxx到yyy有一条只包含一种颜色的边的路径
题解:
我们先考虑没有粉色边的情况我们维护前iii个点中满足条件的点xxx,我们发现,对于新来一个点yyy,直接询问(x,y)(x,y)(x,y),即可,如果x−&gt;yx-&gt;yx−>y,那么保持不变,如果y−&gt;xy-&gt;xy−>x,那么yyy就替代xxx成为新的满足条件的点,这样我们只需要n−1n-1n−1次询问就可以找到这个点
考虑有粉色边的情况,首先我们可以通过模拟把联通的粉色边给全部消除,定义消除完后的点都叫粉色点,现在我们需要把这些点用绿边连起来,由于要求路径是同色的,所以在一条绿边x−&gt;yx-&gt;yx−>y的情况下,所有yyy的粉色出边都是不合法的,那么这个时候就要把yyy的粉色出边的点的度数粉边入度减少,若减到000了,那么就要把这个点恢复过来
然后由于每次绿边的询问都能删一个点,所以还是只需要n−1n-1n−1次询问
注意一件事,在模拟把粉色边连接的点合并的时候,要注意不能出现环的情况
我一开始的写法没有考虑这个问题,就wa了

#include<bits/stdc++.h>
typedef long long ll;
#define rg register
template <typename T> inline void read(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T> inline void printe(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T> inline void print(const T x){if(x<0)putchar('-'),printe(-x);else printe(x);}
template <typename T> inline T min(const T a,const T b){return a<b?a:b;}
template <typename T> inline T max(const T a,const T b){return a>b?a:b;}
const int maxn=100001;
int n,m,ip;
std::vector<int>E[maxn],M[maxn];
bool vis[maxn],in[maxn];
int d[maxn];
void dfs(const int u)
{vis[u]=in[u]=1;for(std::vector<int>::iterator Pos=E[u].begin();Pos!=E[u].end();Pos++){if(!in[*Pos])M[u].push_back(*Pos),d[*Pos]++;if(!vis[*Pos])dfs(*Pos);}in[u]=0;
}
int Q[maxn],top;
int query(int x,int y)
{printf("? %d %d\n",x,y),fflush(stdout);int z;scanf("%d",&z);return z;
}
void ans(int x)
{printf("! %d\n",x),fflush(stdout);
}
int main()
{scanf("%d%d",&n,&m);for(rg int i=1;i<=m;i++){int u,v;read(u),read(v);E[u].push_back(v);}for(rg int i=1;i<=n;i++)if(!vis[i])dfs(i);for(rg int i=1;i<=n;i++)if(!d[i])Q[++top]=i;ip=Q[1];for(rg int i=2;i<=top;i++){int u=Q[i];if(!query(ip,u))std::swap(ip,u);for(std::vector<int>::iterator Pos=M[u].begin();Pos!=M[u].end();Pos++)if(--d[*Pos]==0)Q[++top]=*Pos;}ans(ip);return 0;
}

codeforces contest 1142相关推荐

  1. codeforces contest 1166 E. The LCMs Must be Large---思维

    题目链接:https://codeforces.com/contest/1166/problem/E 题解: 代码: #include<bits/stdc++.h> using names ...

  2. codeforces contest 1140(D~G)

    前言 A~C不想写博客了,就不写了,后面的题还是要推一推的,所以写一下 CF 1140 D 题目大意: 给出一个正多边形,顶点按顺序标号为111~nnn,一个三角划分的权值是每个三角形三个顶点的编号乘 ...

  3. codeforces contest 1119

    CF 1119 A 题目大意:给一个数组aia_iai​,求最大的i−ji-ji−j使得ai≠aja_i\neq a_jai​̸​=aj​,输出这个i−ji-ji−j的值 题解: 这题可以做到O(n) ...

  4. CodeForces Contest #1114: Round #538 (Div. 2)

    比赛传送门:CF #1114. 比赛记录:点我. 又 FST 了. [A]Got Any Grapes? 题意简述: 有三个人,第一个人需要吃绿色葡萄至少 \(a\) 个,第二个人需要吃绿色和紫色葡萄 ...

  5. Codeforces Contest 1138 problem B Circus —— 死亡1700,暴力

    Polycarp is a head of a circus troupe. There are n - an even number - artists in the troupe. It is k ...

  6. codeforces contest 869 problem C(组合数)

    The Intriguing Obsession time limit per test 1 second memory limit per test 256 megabytes input stan ...

  7. Codeforces Contest 1144 E Median String —— 水题

    This way 题意: 给你两个字符串,问你字典序在这两个字符串正中间的字符串是什么 题解: 好几个星期没做题目了,连1900都想了一段时间,一开始想着用2进制来做,但是想着想着发现直接用2进制做不 ...

  8. Codeforces Contest 1110 problem E Magic Stones —— 更改算式

    Grigory has n magic stones, conveniently numbered from 1 to n. The charge of the i-th stone is equal ...

  9. codeforces contest 985E. Pencils and Boxes+思维

    类似指针的想法 E. Pencils and Boxes time limit per test 2 seconds memory limit per test 256 megabytes input ...

最新文章

  1. Mysql 宕机引发索引丢失很可怕,文件 IO 中如何保证掉电不丢失数据?
  2. 分享:手把手教你如何免费且光荣地使用正版IntelliJ IDEA
  3. matlb中如何设置坐标轴的参数以及进行绘图的如何进行注释
  4. 消费者做出购买决策的流程
  5. 前端学习(729):函数导读
  6. vector占用内存的释放
  7. HTML5和Intersection Observer的响应式图像优化简介
  8. CV Code | 计算机视觉开源周报 20190601期
  9. UVA10921 Find the Telephone【编码】
  10. 【上交OJ】1002:二哥种花生(二维前缀和+二维差分---模版题)
  11. 信息收集--空间搜索引擎/网盘
  12. hfss螺旋平面_微波射频网HFSS平面螺旋天线设计
  13. html 背景透明颜色代码,html,body设置背景色透明
  14. ubuntu永久修改mac地址
  15. 【RL系列】马尔可夫决策过程——Gambler's Problem
  16. 修改Cisco交换机ntp服务器,Cisco交换机时间服务(NTP)的设置步驟
  17. 微信朋友圈里,微信群里的早报新闻简报都是哪里来的呢?
  18. html table space,html – white-space:nowrap中断显示:table
  19. iphone开发每日一练1【2011-09-30】
  20. error: invalid key: user.name

热门文章

  1. Redis中的代理Sharding
  2. MyBatis常用配置解析-environments标签
  3. Junit_@Before@After
  4. ActiveMQ的几种集群配置
  5. 时间轮算法解析(Netty HashedWheelTimer源码解读)
  6. myeclipse 项目右键没有svn_新建SVN仓库并上传项目
  7. ios键盘横屏_iOS横竖屏旋转及其基本适配方法 转
  8. 某化大学,教授亲自手把手,从零基础交我们Python利用开发公众号
  9. 以持续集成工具实现DevOps之禅
  10. RPM   YUM