Walking Between Houses There are nn houses in a row. They are numbered from 11 to nn in order from left to right. Initially you are in the house 11. You have to perform kk moves to other house. In one move you go from your current house to some other…
D. Walking Between Houses time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output There are nn houses in a row. They are numbered from 11 to nn in order from left to right. Initially you are in th…
题意:从1开始走,最多走到n,走k步,总长度为n,不能停留在原地,不能走出1-n,问是否有一组方案,若有则输出 n<=1e9,k<=2e5,s<=1e18 思路:无解的情况分为两种:总长度太大,步数太多 每次贪心从1走到n或从n走到1,但要注意给剩下的步数留出空间 #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<iostream&…
题意: 现在有n个房子排成一列,编号为1~n,起初你在第1个房子里,现在你要进行k次移动,每次移动一都可以从一个房子i移动到另外一个其他的房子j里(i != j),移动的距离为|j - i|.问你进过k次移动后,移动的总和可以刚好是s吗?若可以则输出YES并依次输出每次到达的房子的编号,否则输出NO. 分析:首先观察下NO的情况,如果s<k 也就是说总步数都比不是次数的话,那肯定是NO拉,或者s>k*(n-1) 无论如何走都到吧了总步数,那也是NO; 什么时候是YES呢?我们可以贪心下,尽可能…
题意:一共有\(n\)个房子,你需要访问\(k\)次,每次访问的距离是\(|x-y|\),每次都不能停留,问是否能使访问的总距离为\(s\),若能,输出\(YES\)和每次访问的房屋,反正输出\(NO\). 题解:最优解一定是让每次访问的距离为\(s/k\),然后将余数\(s\ mod\ k\)平均分配到前s%k的房屋中,之后每次访问\(s/k\)即可,也就是构造一个类似于\(x\ 1\ x\ 1\ x\ 1\)这样的一个序列,但因为有余数,所以要修改. 代码: #include <iostre…
题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <iostream> #include <cmath> #include <map> #include <…
A B /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a,b) make_pair(a,b) #define pb push_back ][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }}; using namespace std; typedef long long ll; inline v…
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 这个是构造不太一样 最后也没能搞出来. 不过后了我wa了几发之后 我唯一的队友看不下去了 他来做这道题了 最后还是过了这道题.(有一个好队友就是很舒服 可以想到从叶子节点到跟的过程 每个叶子节点必须要向上合并 因为其父亲的那条边需要被覆盖. 这要到达某个节点会有很多叶子节点相遇 此时考虑父亲那条边…
LINK:Multiple Testcases 得到很多种做法.其中O(n)的做法值得一提. 容易想到二分答案 check的时候发现不太清楚分配的策略. 需要先考虑如何分配 容易发现大的东西会对小的产生影响 而 对于某个能放的位置 我们放大的一定比小的要优.所以为了防止出现对小的影响到了需要调整的局面和放大的的局面不会比放小的差的思想 可以得到策略. 有了贪心的思路 可以考虑先放大的 考虑对于每个桶中从大到小放. 放完一个数字之和容易二分到下一个位置 然后set取出相应的值即可.复杂度nlogn…
题意:有一个字符串和一组数,可以对字符串删去任意字符后为数组的长度,且可以随意排序,要求修改后的字符串的每个位置上的字符满足:其余大于它的字符的位置减去当前位置绝对值之和等于对应序列位置上的数. 题解:贪心,我们发现,数组中\(0\)的位置一定对应字符串中最大的字符,所以我们从这个位置来构造,我循环来找,每次找数组中为\(0\)的位置,然后记录字符,对其他没有取过的位置减去为\(0\)的位置,每次都这样搞就行了.具体的还是看代码吧,每一步都应该听清晰的. 代码: #include <iostre…
C. Epidemic in Monstropolis time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output There was an epidemic in Monstropolis and all monsters became sick. To recover, all monsters lined up in queue fo…
题目链接 题意:给你三个数n,k,sn,k,sn,k,s,让你构造一个长度为k的数列,使得相邻两项差值的绝对值之和为sss, ∑i=1n∣a[i]−a[i−1]∣,a[0]=1\sum_{i=1}^n|a[i]-a[i-1]|,a[0]=1∑i=1n​∣a[i]−a[i−1]∣,a[0]=1. 思路:遍历每一步,找到当前能走的步数的最大可能,然后走就好了. 写这个博客是因为看cf的时候,有个远古题没补..好像是去年暑假的题了..今天翻出来补了一下,发现现在的思路明显比当时清晰,好像真的进步了一点…
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最后死的人数最小值以及最大值. \((1 \le n \le 10^6)\) 题解 不难发现是一道思博构造题. 首先考虑下最大值,我们只需要把这张图分三种情况讨论: 单个自环,贡献为 \(1\) 一个大于 \(1\) 的环,贡献为 \(len - 1\) 一个基环树,贡献为 \(size - num_…
题目链接 \(Description\) 给定SA数组,求满足SA[]的一个原字符串(每个字符为小写字母),无解输出-1. \(Solution\) 假设我们现在有suf(SA[j]),要构造suf(SA[i]) (要满足i>j) 考虑后缀的比较方式,先比较第一位,再比较suf(SA[i]+1)与suf(SA[j]+1) 若suf(SA[i]+1)>suf(SA[j]+1),则两字符串第一位可以相同:否则一定要在第一位满足suf(SA[i])>suf(SA[j]) 按照这种方式构造,就能…
B. School Marks Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/540/problem/B Description Little Vova studies programming in an elite school. Vova and his classmates are supposed to write n progress tests, for each test the…
题面 https://www.lydsy.com/JudgeOnline/upload/201610/statements(1).pdf 题解 好神仙的贪心-- 首先无解的情况很容易判断,就是\(l=0\)且\(s\neq 1\)或者\(l=n-1\)且\(s\neq n\),显然了 我们考虑先往左跳再往右跳,那么肯定得先把左边所有能跳的跳完,如果\(l<s\),那么最优解肯定是一直往左跳直到次数不够为止,留下最后一次往左跳的次数跳到最左边,不断往右跳玩剩下的就行了 然而有可能\(l\geq s…
题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i  在pos 位置,那么如果 (pos-i)*2+i-1 <= n,那么可以操作一次换过来, 如果不行再换一种,如果他们之间元素是偶数,那么交换 i - pos,如果是奇数,交换 i - pos+1,然后再经过一次就可以换到指定位置. 代码如下: #pragma comment(linker, "/STACK:1…
[SDOI2019]热闹又尴尬的聚会 链接 luogu loj 思路 第一问贪心?的从小到大删除入度最小的点,入度是动态的,打个标记. 当然不是最大独立集. 第二问第一问的顺序选独立集,不行就不要.选出来的一定是满足不等式的. 每次最多删除p+1个,独立集个数是\(\lceil \frac{n}{p+1} \rceil >= \lfloor \frac{n}{p+1} \rfloor\) 代码 #include <bits/stdc++.h> using namespace std; c…
链接: https://codeforces.com/contest/1272/problem/B 题意: Recently you have bought a snow walking robot and brought it home. Suppose your home is a cell (0,0) on an infinite grid. You also have the sequence of instructions of this robot. It is written as…
A #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { int n; cin >> n; string a; cin >> a; ; ; ; i < a.size(); i++) { ') { one++; } else { zero++; } } ) { one--; } ; i <= one; i++) { cout <…
LINK:Permutation 对于这种构造神题 我自然是要补的.为啥就我没想出来哇. 30分还是很好写的 注意8!实际上很小 不需要爆搜 写bfs记录状态即可.至于判断状态是否出现与否 可以开map np一点的做法是利用康拓展开和逆康托展开(还需要hash 没啥用. 但是 经过不断的手玩排列为8的数列容易发现 对于最差的情况 8 7 6 5 4 3 2 1 也最多需要3次. 所以 可以直接去掉bfs的过程 直接三层2^n枚举 开map统计状态量 这样可以做的飞快.算法的名称估计可以叫做为 模…
题意:有长度为\(n\)的数组\(a\),要求构造一个相同长度的数组\(b\),使得\({b_{1},b_{2},....b_{i}}\)集合中没有出现过的最小的数是\(a_{i}\). 题解:完全可以按照题意直接构造,但是比较麻烦,这里我们先标记原数组中的数,然后将原数组中没出现过的数存进\(b\)中(\(a\)中出现的数在\(b\)中不能出现在\(a\)位置之前),然后我们遍历原数组,如果\(a[i]\ne a[i-1]\),直接输出前一个数,否则输出\(b\)的队头. 构造题还是要自己多想…
题意:给一个\(n\)X\(m\)的矩阵,矩阵中某个数字\(k\)表示其四周恰好有\(k\)个不为0的数字,你可以使任意位置上的数字变大,如果操作后满足条件,输出新矩阵,否则输出NO. 题解:贪心,既然能使任意位置加大任意数值,那么我们可以将所有位置都给他填满,这样的话,只要是满足条件的情况就都能这样输出,所以我们遍历每个位置,然后判断周围能填多少个,如果某个数大于周围能填的个数,那么就不满足条件. 代码: int t; int n,m; int a[400][400]; int dx[4]={…
正题 题目链接:https://codeforces.com/gym/103049/problem/J 题目大意 \(n\)个点\(m\)条边的一张无向图,选出一条路径后去掉路径上的点,然后将剩下的点分成点数相等的两份使得两份之间没有边连接. \(1\leq n,m\leq 2\times 10^5\) 解题思路 先跑出\(dfs\)树,这样就保证了所有的非树边都是返祖边. 发现如果我们选出树上一条根节点出发的路径那么其他子树之间一定是不连通的(因为要么子树之间有环,要么往上的环被删除). 所以…
一辆车,有n个车厢,每个车厢刚好有4个人 车上有n个学生,第i个车厢有a[i]个学生 如果一个车厢里面的学生数 <= 2,这个车厢里的学生会不开心 如果一个车厢里面的学生数 > 2,这个车厢里面的学生会开心 现在学生想和其他人换座位,使得每一位学生都开心 求最小的交换次数 思路: num[i]表示有num[i]个车厢里面刚好有i个学生 现在,主要的就是处理num[1] 和 num[2] 分情况进行处理就可以了,很简单 代码: //File Name: cf356C.cpp //Author:…
Polycarp invited all his friends to the tea party to celebrate the holiday. He has ncups, one for each of his n friends, with volumes a1, a2, ..., an. His teapot stores wmilliliters of tea (w ≤ a1 + a2 + ... + an). Polycarp wants to pour tea in cups…
Description Natasha is planning an expedition to Mars for nn people. One of the important tasks is to provide food for each participant. The warehouse has mm daily food packages. Each package has some food type ai. Each participant must eat exactly o…
题目链接 \(Description\) 一棵n个点的树,每次可以选择树上两个叶子节点并删去一个,得到的价值为两点间的距离 删n-1次,问如何能使最后得到的价值最大,并输出方案 \(Solution\) 树上距离,求最大,可以考虑下树的直径 假如已知树的直径u->v,那么任意一点x到达其他点的最远距离就是u,v中一点(如果不是这样,那直径一定可以更长而不是uv) 假设x距u最远,那肯定是删x 删直径上的点(直径端点)会导致一些点取不到最远距离 既然这样按顺序删非直径上的点,最后删直径端点 #in…
题意 https://vjudge.net/problem/CodeForces-1255D rxc的农场里'R'表示有米,现在有K只鸡,给这k只鸡选一些格子,每个鸡可以有多个格子(每个鸡至少吃一个米),但是每个鸡的格子必须连通.问吃到最多的米和最少的米的差最小是多少. 思路 如果农场一共有cnt个米,那么最优的分配肯定是差值为1或0,即给每个鸡先分cnt/k个米,然后把多余的分配给每个鸡.因为鸡的格子必须是连通的,所以可以考虑类似蛇形填数的方法,每找到cnt/k(多余的类似)个米就换下一只鸡,…
题目描述: Maxim and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Recently Maxim has found an array of n integers, needed by no one. He immediately come up with idea of changing it: he…