题意 给定一个D,以及一个长度为N的序列a,顺序执行这些数字: 对于一个数字x,会使得D=min(D,abs(D-x)) 有Q次询问,每次询问独立,给出i,能否修改a[i],使得D最后不为0. n,q<=500000 解法 我们设Low[i],表示当前D执行i+1..n的数字之后,不为0的最小值. 我们知道,对于每一次询问i, 求出前i-1个数字执行后的结果D, 通过修改a[i],我们可以使得D变成[1,D], 那么如果D>=Low[i+1]就回答"YES",否则回答&qu…
Atcoder 题面传送门 & 洛谷题面传送门 首先求出 \(s_i\) 表示经过 \(i\) 次操作后机器人会位于什么位置,显然 \(s_0=D\),\(s_i=\min(s_{i-1},|s_{i-1}-a_i|)\). 考虑修改某个位置的 \(a_i\) 的本质是什么.注意到不论你将 \(a_i\) 改为什么值,最终的 \(s_i\) 一定在 \([0,s_{i-1}]\) 中,也就是说我们需求出是否 \(\exist v\in [0,s_{i-1}]\) 使得将 \(s_i\) 改为 \…
题意 有一个体积为L的水池,有N天 每天早上进水Vi体积的Ti温度的水. 每天晚上可以放掉任意体积的水. 问每天中午,水池满的情况下,水温最高多少. 水的温度只受新加进的谁的影响,对于水\(W1(T1,V1),W2(T2,W2)\) 那么\(W1+W2((T1*V1+T2*V2)/(V1+V2),V1+V2)\) N<=500000 做法 首先我们要知道的是如果进水的水温递增, 那么肯定要保留的是最后L体积的水混合起来,新水温就是答案. 每天先放水,然后 加入进的水不递增,那么就混合最后两天的水…
题意:给你一个H*W的字符矩阵,一次操作可以任意将两行或者两列交换.问你是否能通过任意多次操作,使得其变为对称矩阵.对称的含义是:对于任何格子A(i,j),其都等于A(H-i+1,W-j+1). 显然,先换行还是列不影响结果,不妨假设先换行再换列. 行不必真换,只需找出哪些行成对即可,然后这些对的顺序无关,这样的方案数只有1*3*5*7*...*n,只有10000左右. 这个怎么枚举呢,假设行数是1,2,3,4,5,6, 那么就(1,2)-(3,4)-(5,6) -(3,5)-(4,6) -(3…
题意:有个沙漏,一开始bulb A在上,bulb B在下,A内有a数量的沙子,每一秒会向下掉落1.然后在K个时间点ri,会将沙漏倒置.然后又有m个询问,每次给a一个赋值ai,然后询问你在ti时刻,bulb A的沙子数.保证A和B的总沙子数为X. 函数ft(x)表示t时刻,初始bulb A中的沙子数为x时,当前的bulb A中的沙子数是多少. 最开始时函数恰好为f(x)=x. 然后在第一次翻转之前,函数会逐渐向下移动变为<2>的样子,然后在翻转之后,函数又会逐渐向上移动,直至变成<3>…
题意:给你一个排列a,每次可以交换相邻的两个数.让你用最少的交换次数使得a[i] != i. 对于两个相邻的a[i]==i的数,那么一次交换必然可以使得它们的a[i]都不等于i. 对于两个相邻的,其中一个a[i]==i,另一个a[i]!=i的数,一次交换也必然可以使得它们的a[i]都不等于i. 于是可以把序列划分成多段连续的a[i]==i的段落,它所贡献的交换次数就是[(长度+1)/2]. #include<cstdio> using namespace std; int n,a[100005…
给你一个1~n的排列p,n是偶数,每次从中任选一对相邻的数出来,插到排列q的开头,如此循环,问你所能得到的字典序最小的排列q. 我们先确定q开头的两个数q1,q2,q1一定是p的奇数位的最小的数,而q2一定是q1后面最小的偶数位的数,这很显然. 然后记q1,q2在p中的位置分别是L,R,把p分成三段[1,L],[L+1,R-1],[R+1,n],递归处理,当前区间[l,r],每次取的一对的左端点L必然是与当前区间左端点l奇偶性相同的最小的数,而R必然是L右侧与当前区间左端点l奇偶性不同的最小的数…
对每个点的取值都取最小的可能值. 那个图最多一个环,非环的点的取值很容易唯一确定. 对于环上的点v,其最小可能取值要么是mex{c1,c2,...,ck}(ci这些是v直接相连的非环点)(mex是).要么是这个值+1. 并且如果环上的一个点的值确定了,其他的值也就唯一确定了. 那么就一共只有两种可能性,枚举一下即可.…
每次将最大的数减到n以下,如此循环直到符合题意. 复杂度大概是n*n*log?(?). #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int n; typedef long long ll; ll ans,a[60]; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ cin&g…
从n个t变化到n个t-1,恰好要n步,并且其中每一步的max值都>=t,所以把50个49当成最终局面,从这里开始,根据输入的K计算初始局面即可. #include<cstdio> #include<iostream> using namespace std; typedef long long ll; ll K; int main(){ cin>>K; int n=50; printf("%d\n",n); ll a=K/(ll)n; ll b…
题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. 可以通过搜索+剪枝解决. 我主要运用的剪枝有: 1.填了一位之后,可以立刻填出对称的另外一位. 2.看当前的rev(x)-x是否与给定的目标差距过远.…
题意 给定一个n*m的池塘,每个格子上可能有叶子. 从一个叶子出发,可以跳到相同行或相同列的叶子. 问至少去掉多少叶子,使得起点不能到达终点. \(n,m<=100\) 解法 很显然的最小割模型. 每列每行都新建一个点. 每片叶子拆成两个点,一个向另一个连一条容量为1的边. 另外一个就要向本行本列新建的那个点连一条容量无穷的边. 然后新建的那个点给所有本行或本列的叶子的第一个点连一条容量无穷的边. 然后跑一遍最小割就行了.…
题意 给你一个形如"SS"的串S,以及一个函数\(f(x)\),\(x\)是一个形如"SS"的字符串,\(f(x)\)也是一个形如"SS"的字符串. \(x\)是\(f(x)\)的一个前缀,并且要让\(f(x)\)尽量短. 问在\(f^{10^{100}}(S)\)中,[L,R]中所有字符的出现次数. \[字符集为小写字母,|S|<=100000,1<=L<=R<=1e18\] 解法 可以发现的是S只用考虑前一半,因为进行…
A.GPA計算 题意:\(n\) 个人,一个字符串表示每个人的等第,每种等第对应一种分数.问平均分 做法:算 #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db double #define ld long double #define ull unsigned long long #define REP(a,b,c) for(register int a=(b),a##end=(c);…
A.うるう年 题意:判断闰年 做法:.. #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db double #define ld long double #define ull unsigned long long #define REP(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a) #define DEP(a,b,…
A.センター採点 题意:给一个只包含1.2.3.4的字符串,求出现次数最多和最少的字符 做法:还能怎么做... #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db double #define ld long double #define ull unsigned long long #define REP(a,b,c) for(register int a=(b),a##end=(c)…
题意:平面上给你N个点.对于一个“凸多边形点集”(凸多边形点集被定义为一个其所有点恰好能形成凸多边形的点集)而言,其对答案的贡献是2^(N个点内在该凸多边形点集形成的凸包内的点数 - 该凸多边形点集的点数).问你N个点的所有凸多边形子点集的贡献之和是多少. 因为是2的多少次方的形式,容易发现,它其实是一种在集合内取点的方案. 于是对于N个点的任意一个子集而言,只要其凸包面积非零,它就会对答案恰好贡献1.因为你把它的凸包上的点拿出来当成一个“凸多边形点集”,把剩下的点当成一种取点方案,这样是不重复…
题目传送门:https://arc072.contest.atcoder.jp/tasks/arc072_c 题目翻译 给你一个数组\(D\),然后给你一个操作序列\(d\),每次操作可以将\(D\)变成\(min(D,|D-d[i]|)\).假如这一个操作序列执行完了之后你的\(D\)变成\(0\)了,那么就称这个操作序列是合法的.现在有\(Q\)个询问,每个询问由一个\(q[i]\)表示,问你假如你可以把\(d[i]\)变成任意正整数,你能否将这个操作序列变成不合法的.\(N,Q\leqsl…
只有两维的时候,我们显然要按照Ai-Bi排序,然后贪心选取. 现在,也将人按照Ai-Bi从小到大排序,一定存在一个整数K,左侧的K个人中,一定有Y个人取银币,K-Y个人取铜币: 右侧的X+Y+Z-K个人中,一定有X人取金币,Y+Z-K个人取铜币. 现在,简化一下,我们把每个人的金币数和银币数减去其铜币数,然后默认取上所有人的铜币,这样不影响最终答案. 于是我们依次枚举K,计算前K个人中,银币数之和最大的Y个人,后X+Y+Z-K个人中,金币数之和最大的X个人,然后求和,更新答案. 可以用堆轻松实现…
假设我们一开始选取所有的运动项目,然后每一轮将当前选择人数最多的运动项目从我们当前的项目集合中删除,尝试更新答案.容易发现只有这样答案才可能变优,如果不动当前选取人数最多的项目,答案就不可能变优. 我这最外面那个二分是卖萌的. #include<cstdio> #include<set> #include<cstring> #include<algorithm> using namespace std; typedef pair<int,int>…
从大到小排序,相邻两项作差,求gcd,如果K是gcd的倍数并且K<=max{a(i)},必然有解,否则无解. 可以自己手画画证明. #include<cstdio> #include<algorithm> using namespace std; int n,K,a[100010]; int main(){ scanf("%d%d",&n,&K); for(int i=1;i<=n;++i){ scanf("%d"…
题意 有n个问题答案为YES,m个问题答案为NO. 你只知道剩下的问题的答案分布情况. 问回答完N+M个问题,最优策略下的期望正确数. 解法 首先确定最优策略, 对于\(n<m\)的情况,肯定回答YES: 对于\(n>m\)的情况,肯定回答NO. 所以到最后,肯定由MIn(n,m)个问题可以回答正确. 最后可能正确的情况在于,n==m的情况,有一半的几率正确. 所以加上这部分的期望即可,通过组合数算出路径数目即可.…
题意 盒子里有n块砖,每块的颜色可能为蓝色或红色. 执行m次三步操作: 1.从盒子里随便拿走一块砖 2.放入一块蓝砖和红砖到盒子里 3.从盒子里随便拿走一块砖 给定n,m 问拿出来的砖,可能有多少种不同的颜色序列. n,m<=3000 解法 容易想到一个dp, 设f[i][j]表示已经执行了i次的操作,然后目前盒子里有j块蓝砖,和n-j块红砖. 共有四种转移,分别是一次操作拿走的砖头为红红.红蓝.蓝红.蓝蓝. 边界为f[0][0..n]=1 然后就会发现算重了, 这是因为不同的颜色序列可能会有不…
AtCoder Regular Contest 085 C HSI 没学概率论还不怎么看得懂,虽然感觉不难,其实明明可以猜出来的..... 参考博客:https://www.cnblogs.com/guoyongheng/p/7821298.html #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef lo…
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有方案的数字和. 思路 \(2^{|S|-1}\)枚举加号的放置状态 代码 Many Formulas D.Snuke's Coloring 题意 在一个\(H \times W(3 \le H,W \le 10^9)\)的棋盘上,有\(N(N \le 10^5)\)个格子被染成黑色,其余格子为白色.…
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$题解 本次$ARC$可谓是手速场.当时由于博主实在zz导致滚粗,rk89. 下面是题解. 总结了一下,三道结论题.样例都不错,猜到结论基本上就可以过掉了. 严重差评!!!大概要涨不了多少rating了QAQ(暴露了我的Rating是多么低),xza怎么没来?? (UPD:2018-04-07 21:…
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\)类点.每个\(A\)类点可以和横纵坐标都比它大的\(B\)类点匹配,求最大匹配数. 分析: 网络流裸题. #include <bits/stdc++.h> using namespace std; #define MAXN 110 #define inf 0x7fffffff int head[5…
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n\le 2e5\) 分析: 可以通过观察发现,无论删去那个点,比全部都走所差距的距离都是\(|a_i-a_{i-1}|-|a_{i+1}-a_i|+|a_{i-1}-a_{i+1}|\) 所以直接枚举即可. #include <bits/stdc++.h> using namespace std;…
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几次操作将三个数变为相同的数. 分析: 可以发现如果三个数的奇偶性相同直接加就可以了,对于奇偶性不同的,先把奇偶性相同的两个数都+1,然后按照相同的处理就可以了.可以证明没有更好的方案. #include <bits/stdc++.h> using namespace std; int a,b,c,…
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: 发现题目范围支持\(nlogn\)做法. 我们可以对这些数字建立一棵平衡树,先全加进去,再一边删除一边find一边再加,非常容易想到的解法,但是真要这么写估计排名高不到哪里去. 考虑删除一个数之后中位数的情况,明显只有两种,一种是你删除的数小于等于中位数,还一种是大于中位数,那么可以先排序找出中位…