思维题
!
fffefw
这个作者很懒,什么都没留下…
展开
-
Gym - 101170I Iron and Coal (思维)
给一个有向图,然后一些点有铁一些点有煤,然后问你从1走,至少花费多少(走一个没走过的点花费1,走过的点再走一次是不用花费的)可以拿到一个铁一个煤,点可以重复走。 枚举从1节点到一个铁一个煤的交叉点即可,三遍bfs处理出dis[1,2,3][i]分别表示1号点到i的最小花费,i到铁的最小花费,i到煤的最小花费。#include<bits/stdc++.h>using n...原创 2019-09-29 12:26:27 · 244 阅读 · 0 评论 -
Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence
题目大意就是给一个长度为n括号序列,然后问你有几个位置,你将该位置的括号反转之后,这个括号序列可以变成合法的括号序列。合法的括号序列定义就是 1.括号序列里左右括号数量相等 2.对于i位置对应的前缀里左括号数量>=右括号数量(1<=i<=n)先设左括号为1,右括号为-1,然后求出括号序列对应的前缀和数组a假设要将pos位置的左括号改成右括号是满足条件的。那么必有 ...原创 2019-01-01 22:57:49 · 370 阅读 · 0 评论 -
Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task(构造)
传送门题目意思就是给一个长度为n的序列,然后你有2种操作,一种是对前i个数加上x,一种是对前i个数模x,然后问能否在n+1步内把序列变成严格递增序列。思路:首先对于任意序列是肯定能在n+1步内把序列变成严格递增序列。具体讲就是把每个ai变成i,要想达到这个目的,第一步是要对前n个数加上一个值maxn,然后从第一个数往第n个数进行如下处理,对每个数ai模上ai-i,那么ai就变成i了,然后为...原创 2018-12-05 13:13:48 · 186 阅读 · 0 评论 -
HDU - 5965 扫雷
因为第一列的状态一确定,那么它后一列的状态就可以确定了,而且第一列的状态就有3种,0个雷,1个雷,2个雷,所以可以枚举第一列的状态,求出在第一列状态确定的情况下这n列的方案数,然后对贡献求和即可。有几个细节需要注意。#include<bits/stdc++.h>using namespace std;#define fuck(x) cout<<#x<<...原创 2018-11-21 00:13:47 · 194 阅读 · 0 评论 -
CF1064B 【Equations of Mathematical Magic】
传送门 题目意思就是给定a,求a−(a⊕x)−x=0 这个方程的解的个数。 首先可以对这个方程变形可以得到a-x=a⊕x.相当于是a和x之间的相减得到的值和a异或x的值相等,即2种操作等效。 因为x>=0,a>=0,所以a⊕x>=0,因此a-x>=0,即a>=x,综合得a>=x>=0。然后把a和x都变成2进制形式来考虑,当ai==0,xi...原创 2018-11-14 00:48:17 · 190 阅读 · 0 评论 -
小K的疑惑 (找规律)
传送门画画图可以发现dis[i][j]==dis[j][k]==dis[i][k]这个连等式等于1是不可能的,只能是等于0。这个连等式等于0,说明了i到j的距离,j到k的距离以及i到k的距离都是偶数,此时我们选取一号节点作为树的根节点,则对i和j有个结论,若i到j的距离为偶数,则i到根节点,和j到根节点的距离的奇偶性相同,这里设到根节点距离为奇数的点的个数为x,为偶数的点的个数为y,则满足条件...原创 2018-11-08 00:13:22 · 310 阅读 · 0 评论 -
Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) B. Maximum Sum of Digits
传送门 题目大意就是给一个数c,然后拆成a和b,使得a+b=c,要求使得a的各数位之和+b的各数位之和达到最大。 我的想法就是可能不能单独考虑a的数位之和或b的数位之和,要综合考虑才能达到最优,先来看ci,ci=ai+b+flag的,这里的flag是前一位(较低位)的进位,存在是0,否则是1,若是ci-flag!=9的时候,ai+bi有2个取值,一种是ai+bi=ci-flag,另外一...原创 2018-11-09 12:40:03 · 150 阅读 · 0 评论 -
Educational Codeforces Round 51 (Rated for Div. 2) C. Vasya and Multisets
题目大意就是给你n个数,然后问你能否把这n个数分给2个集合,使得2个集合里的nice number个数相同,(nice number即在该集合里仅出现一次的数)。问是否存在分配方案,首先 一共有三种情况,如果n个数里仅出现一次的数的个数为偶数个,那么肯定存在。还有就是如果仅出现一次的数的个数为奇数个,那么还要看是否存在出现次数>=3的数,有的话就存在,没有的话就不存在。#include...原创 2018-10-30 18:55:17 · 249 阅读 · 0 评论 -
51Nod 1191 消灭兔子 (贪心+优先队列)
对兔子血量排个降序(即从血多的开始杀),对弓箭按伤害值降序排。对每一只兔子,都要把能杀死他的弓箭的价值入队,入队完毕以后,如果队列为空说明这个兔子杀不了,不为空说明这个兔子能杀,那就从能杀这个兔子的弓箭里选个最便宜的,按照这样对n只兔子操作#include<bits/stdc++.h>using namespace std;#define ll long longcon...原创 2018-10-21 20:21:55 · 183 阅读 · 0 评论 -
51nod 1596 搬货物
对于这n堆货物,能进行合并就进行合并,合并到不能合并为止,然后要算一下2的幂有多少个即可,合并的话是只有2个2的同次幂可以合并,2的不同次幂不可以合并。#include<bits/stdc++.h>using namespace std;const int maxn=1e6+30;int cnt[maxn];inline int read(){ int ...原创 2018-10-21 20:14:51 · 98 阅读 · 0 评论 -
51Nod-1625-夹克爷发红包(二进制枚举+贪心)
正解是枚举n行的全部情况,然后针对每种情况对m列进行贪心,求最大值,最后取最大值里的最大值。#include<bits/stdc++.h>using namespace std;#define ll long long#define fuck(x) cout<<#x<<" "<<x<<endl;ll mp1[15][205]...原创 2018-10-29 01:07:18 · 212 阅读 · 0 评论 -
Codeforces Round #377 (Div. 2)-D. Exams
传送门因为天数越大通过所有考试的可能性就越大,具有单调性所以可以二分天数,然后check的话,就要用到贪心的思想从后往前扫(因为越晚考试复习的时间就越多),设变量统计1到mid通过的考试的数量,还有通过这些考试所需要的复习时间。#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;int vis...原创 2018-10-19 01:38:07 · 129 阅读 · 0 评论 -
Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum
由题意可以知道a&b产生的值对答案有m次贡献,按次算贡献值是肯定超时的,所以按位算贡献,观察可以发现只有a这个二进制数里的1对答案有贡献,贡献值为pre[i]*这个1对应的值(即假如这个1是第i为,则这个1对应的值就是2^(i-1)),pre[i]表示二进制数b第i位及前面1的个数,用前缀和的思想求。#include<bits/stdc++.h>using name...原创 2018-10-13 20:57:43 · 173 阅读 · 0 评论 -
牛客练习赛27 水图(思维+暴搜)
画几个图就可以发现,经过每个点最少一次的最短路径即使,总边权*2-从x点出发走的一个最长的路径,可以想象成这个最长的路径对应的分支是最后走的,走到了该分支的叶子节点,就满足要求了,就不必回到x点了,#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=50000+10;...原创 2018-10-03 10:58:58 · 196 阅读 · 0 评论 -
CSU 2166: 卖萌表情(2018湖南省赛)
传送门这题需要确定每种表情的2种形式的优先级,然后直接遍历一遍矩阵即可。两种表情是第二个形式的优先级高/*通过 ^ ^ ^ 和 ^ ^ ^ 可以确定第一种 v v v v v v 通过 和 可以确定第二种 > < < > >...原创 2018-09-25 20:17:09 · 445 阅读 · 0 评论 -
小a与星际探索
题意就是让你找一条1到n的路径使得路径上点的异或和最大。 这里定义了f[i]表示为1到达n,耐久度为i是否可行,先判断p[1]是否是>p[n]的,否则的话无解,是的话先给f[p[1]^p[n]]=1,表示这个状态是可行的,然后利用p值在p[1],p[n]之间的点作为中转点,拓展可行的状态,(这里利用了异或运算满足交换律和异或的自反性)#include<bits/stdc...原创 2019-01-24 17:43:16 · 140 阅读 · 3 评论 -
CodeCraft-19 and Codeforces Round #537 (Div. 2) C. Creative Snap
题目大意就是有一个长度为2^n的区间,然后要求把这个区间摧毁的最小花费是多少。每次有2种操作,1.当目前区间长度>=2时,可以把整个区间对半分,然后分别摧毁(感觉这个和线段树有点类似)。2.对于当前区间可以直接摧毁 我的做法就是用暴力求出每个区间的最小摧毁花费,每个区间的最小摧毁花费就是min(直接摧毁的花费,将当前区间对半分然后分别摧毁的最小花费)。这样的话复杂度是2^n(因为要...原创 2019-02-04 11:38:14 · 185 阅读 · 0 评论 -
CodeCraft-19 and Codeforces Round #537 (Div. 2) B. Average Superhero Gang Power
先排序,直接暴力把前i个数删掉求最大平均值(0<=i<=min(n-1,m)),然后取最大即可#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=1e5+10;int a[maxn],n,k,m;ll pre[maxn],sum;double ans...原创 2019-02-04 11:41:53 · 285 阅读 · 0 评论 -
牛客练习赛13-幸运数字Ⅱ(暴力)
因为区间很大暴力搞不行,但是这个10位数以内的幸运数字只有2046种,所以可以先dfs预处理出所有的幸运数字,然后求每个幸运数字的贡献。#include<bits/stdc++.h>using namespace std;#define ls rt<<1#define rs (rt<<1)+1#define PI acos(-1)#defin...原创 2019-09-03 20:53:07 · 202 阅读 · 0 评论 -
P1338 末日的传说(贪心)
P1338题意就是求逆序对个数为m的字典序最小的序列 这题就是贪心安排每个位置的数,对于位置i,要放什么数取决于m和剩余的n-i个数能组成的逆序最大数(n-i)*(n-i-1)/2有关,①若是小于,则说明i位置可以放当前最小的数,能放最小的数肯定要放,因为要字典序最小,②若是大于,如果还是按当前最小的放到i位置,那么剩下的数就肯定不能构造出m个逆序对了,那么放...原创 2019-08-20 17:53:38 · 154 阅读 · 0 评论 -
Codeforces Global Round 3 B - Born This Way
比赛的时候一直在想怎么删航线A和航线B的航班才能最优,赛后才知道原来枚举删除个数,取max就好了,越来越菜了。 #include<bits/stdc++.h> using namespace std; #define fuck(x) cout<<#x<<" "<<x<<endl; const int maxn=2e5+...原创 2019-06-02 21:08:16 · 219 阅读 · 1 评论 -
2019河北省大学生程序设计竞赛 L .smart robot
https://ac.nowcoder.com/acm/contest/903/L题意就是给你n*n的数字矩阵,然后在矩阵格子里走,一个格子可以重复走,然后走过的格子里的数可以连接起来,问最小的无法得到的数是多少?首先,假设1到k位数都满足条件的话,那么就有必有10^k-1<=n^2*4^(k-1),然后由不等式10^k-1>n^2*4^(k-1) 可以得到地图为n*n 时...原创 2019-05-28 01:11:20 · 404 阅读 · 0 评论 -
C2 - Power Transmission (Hard Edition)
题意就是给你n个点,保证无重点,然后问你n个点两两相连构成直线,这些直线会有多少个交点?思路就是两条直线如果不是平行就是相交的,所有我们可以把全部直线都找出来,存到set里,然后对于一条直线在用map记录和它平行的直线的数量,那么对于这条直线产生的交点数量就是总的直线数-和它平行的直线数量了。要唯一表示一条直线需要记录它的斜率和截距(直线方程为y=x*(y1-y2)/(x1-x2)-x...原创 2019-05-15 21:00:11 · 215 阅读 · 0 评论 -
C. Serval and Parenthesis Sequence(贪心)
题意是给你一个s,包含?(),然后可以把?变成(或),然后问你是否存在一个方案可以使得s的所有严格前缀都是不合法的,然后s是合法的。可以这样想,假如有a个括号,其中有b个需要变(,c个需要变),我们就直接对s进行操作,把前b个变(,后c个变),这样做的原因是因为如果有解的话,肯定是对每个位置1到n-1的前缀而言(个数>)个数的,这样的话就能使得每一个前缀里(个数尽可能大于)个数,所以对?...原创 2019-05-20 16:57:06 · 158 阅读 · 0 评论 -
2019中山大学程序设计竞赛(重现赛)
Triangle题意:给你n个木棒,判断其能否组成三角形。这题就是斐波那契数数列的应用,把斐波那契数列打出来,可以知道第47项就大于2^31-1了,于是的话,最长的不能构成三角形的序列的长度就是46了,若序列长度>=47,那就必有一个长度>=2的区间不满足斐波那契数列,那就可以构成,若序列长度<47就暴力判断。#include<bits/stdc++.h>...原创 2019-04-23 20:46:47 · 780 阅读 · 0 评论 -
Codeforces Round #546 (Div. 2) D - Nastya Is Buying Lunch(贪心+模拟)
题意就是给1到n的一个排列,然后m对关系u,v。如果u在v的前面的话,u可以和v交换位置,问最后一个元素最多可以往前移多少位子? 可以从最后一个元素前面一个位置一直扫到1位置,能交换则交换。要注意可能存在u-v,v-u 这样两对关系,如果我们已经使用了u-v关系了的话, v-u关系就应该删除掉,不然就会成环,然后t。复杂度是o(n*log(m)),通过这题学到了算map[i]的复杂度...原创 2019-03-12 21:37:18 · 184 阅读 · 0 评论 -
Codeforces Round #546 (Div. 2) C Nastya Is Transposing Matrices
题意是给矩阵a和矩阵b,问能否把a矩阵里的k*k子矩阵转置,得到b矩阵,转置意思就是k*k的子矩阵里,a[i][j]和a[j][i]互换位置。在纸上画几组样例,就可以观察发现,我们可以通过每次只对2*2的子矩阵进行转置,就能将一条对角线的任意一个元素放在该对角线的任意位置,也就是一条对角线里的元素是可以互相交换的,所以我们只需要把所有a和b矩阵的所有对角线都找出来,一条条对比即可。...原创 2019-03-12 21:23:32 · 104 阅读 · 0 评论 -
ZOJ Monthly, June 2018 I - District Division ZOJ - 4045
题意:给你一颗n个点的树,让你把树分成n/k块,即每块要有k个点,然后每块里面的k个点都要是连通的才行。 先预处理出每个点对应的子树的大小,若是k的倍数则记录,然后按子树的大小,由小到大打印对应子树。#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;struct edge{ ...原创 2019-03-07 00:28:31 · 166 阅读 · 0 评论 -
Educational Codeforces Round 61 (Rated for Div. 2) C - Painting the Fence(前缀和)
题意是给q条线段,然后取q-2条,问最多能覆盖多少个点? 可以换个角度看成是舍弃掉2条线段后,最多覆盖多少个点。暴力枚举舍弃的2条线段,然后求舍弃后的值,然后取最大值。关键 就是要o(1)求出舍弃掉2条线段后的被覆盖点数,可以预处理出覆盖一次的点数量和覆盖2次的点数量的前缀和,,然后根据2条线段是具体位置关系进行操作,假如两个线段没有重叠部分的话,只需要总覆盖点数分别减去两条线段内...原创 2019-03-07 00:23:31 · 239 阅读 · 0 评论 -
Codeforces Round #544 (Div. 3) F1. Spanning Tree with Maximum Degree
题意是给个图,然后求生成树的最大度数的节点的度数最大化的值。 思路:生成树里最大度数的节点的度数取最大,所对应的那个节点必定是原图里度最大的节点,然后由该点向四周bfs,直至所有点都在一个树里。#include<bits/stdc++.h>using namespace std;const int maxn=2e5+10;vector<int>...原创 2019-03-09 00:49:18 · 244 阅读 · 0 评论 -
Codeforces Round #544 (Div. 3) B. Preparation for International Women's Day
题意就是给n个数字,然后如果2个数字之和%k==0,那么这2个数字可以组成一组,然后要求组成最多组数花费的数字。 感觉这道贪心很难想到。正解是存ai%k的值,然后对于余数i对应的数字就和余数k-i对应的数字配一组即可被k整除。#include<bits/stdc++.h>using namespace std;int cnt[105];int main(){...原创 2019-03-09 00:43:07 · 214 阅读 · 3 评论 -
51nod1097
从这题算是学到了排序的技巧 #include<bits/stdc++.h>using namespace std;string s[10000+10];bool cmp(string s1,string s2){ return s1+s2<s2+s1;}int main(){ int n,len=0; scanf("%d",&a...原创 2019-02-09 17:57:19 · 175 阅读 · 0 评论 -
A. Many Equal Substrings(思维)
传送门 写这题顺便学了下string类里substr的用法substr有2个参数,第一个参数为你需要截取的子串的起始位置的索引(下标),第二个参数为从起始位置开始截取的长度。 这题就用到了substr函数,这题首先要分2种情况,一种是t串里不含相同的前缀后缀时,s串里有多少个t串,就输出多少次t串就可以了,这样可以保证是最短的,第二种就是有相同前缀后缀,那就把最大的相同前缀后缀的长度求...原创 2018-09-19 11:44:48 · 438 阅读 · 0 评论 -
cf 990c(思维+括号匹配)
题目大意就是给你n个括号序列,然后问si+sj组成的序列能完美匹配,这样的(i,j)的个数是多少。 首先可以知道自身就是完美匹配的括号序列(假设数量为x)对答案的贡献为x^2,因为每一个自身就是完美匹配的括号序列可以和其本身或其他的自身就是完美匹配的括号序列组成一个符合条件的序列。然后其次对一个序列去掉了已经匹配的括号之后,剩下的括号里既有左括号又有右边括号的话是对答案没有贡献的,因为这...原创 2018-09-05 01:04:58 · 289 阅读 · 0 评论 -
Sherlock and his girlfriend CodeForces - 776B (数论)
一个数若是合数则必定可以分解为多个质数相乘。有了这个定理分类讨论一下就行了。#include<bits/stdc++.h>using namespace std;int a[100200],n,cnt;void getprim(){ memset(a,0,sizeof(a)); for(int i=2;i<=n+1;i++) { ...原创 2018-08-26 00:01:53 · 208 阅读 · 0 评论 -
CF 483B Friends and Presents(二分)
这里v是所选1到v这个序列的最大值,然后要求最小值,就要想到最大值最小化,就要用二分搜素#include<bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3fint main(){ ll cnt1,cnt2,x,y,xb,yb,xyb,low,up,mid,ans...原创 2018-08-06 19:59:43 · 198 阅读 · 0 评论 -
cf div3 B Obtaining the String
先贴上我的wa代码,至今仍未找到bughttps://paste.ubuntu.com/p/K3FWdQmQ9m/ 我的思路就是冒泡排序,最多冒n-1次。 后来看来大佬的做法,也是冒泡排序,不过,是给s串里每一个字符都赋予了一个值,这个值是依照t串赋予的,比如说我们遍历到了t串的i位置的字符,那么t串里i位置的字符对应的值为i,然后s串里和t[i]相等且未被赋予值的字符赋予和t[i]一...原创 2018-08-01 22:33:55 · 265 阅读 · 0 评论 -
HDU 5510 Bazinga 暴力匹配加剪枝
思路: 标记每个字符串前面的子串,如果一个字符串a,前面一个是字符串b,b是a的子串,然后就继续往前找,找到字符串c,然后 发现字符串c被标记了,说明c是b的子串,那么c必是a的子串,也可以这样理解如果b是a的子串,那么b的所有子串(即b串前被标记了的字符串)都是a的子串。就这样剪枝。#include<stdio.h>#include<string.h>usi...原创 2018-08-06 15:24:17 · 128 阅读 · 0 评论 -
Codeforces Round #451 (Div. 2) B
我一开始,同时暴力枚举2种东西的的数量,结果T了,后来看题解才知道要有技巧的暴力,就枚举第一种物品的数量就好了,然后判断一下剩余的钱能不能全部用来买第二种物品即可#include<bits/stdc++.h>using namespace std;int main(){ int n,a,b,maxc,maxb; cin>>n>>a&...原创 2018-08-01 16:56:57 · 85 阅读 · 0 评论 -
气温预测
气温预测Description 现有一个n天的气温表, 请你预测对于每一天,最迟多少天后可以升温(从现在到气温表中最后大于当前温度的那天)。如果不能升温,则当前输出0。Input 输入第一行为一个n代表天数。第二行为n个整数,第i个代表第i天的气温a[i]。1 <= n <= 1e60 < a[i] < 1e6.Output ...原创 2018-08-09 21:47:17 · 3028 阅读 · 0 评论