技巧题
文章平均质量分 77
围巾的ACM
啊啊什么时候也能成为一个大牛啊
展开
-
2017广东工业大学程序设计竞赛决赛E 倒水(二进制)
思路:先看样例,13 213个瓶子可以 8 4 1 这样合成3个,但是不满足,那么我们可以再买一个14个瓶子可以8 4 2还是3个,那么再买一个15个瓶子 8 4 2 1 好像并没有什么卵用啊,那么我们再买一个16个瓶子,显然就可以合并出来了嘛对二进制比较熟悉的可能就已经看出来了,最后合成的瓶子数一定是2^x,那么我们其实只需要把瓶子数里面的1通过不断的位原创 2017-03-27 15:38:30 · 762 阅读 · 0 评论 -
UVALive 6611 Alice's Print Service(二分)
思路:二分二分就好了#include #include #include #include #include #include #include #include #include #include #include #include #define INF 0x3f3f3f3f#define esp 1e-9typedef long long LL;u原创 2016-07-30 23:12:00 · 336 阅读 · 0 评论 -
Codeforces Round #364 (Div. 2) C They Are Everywhere(滑窗)
思路:大白上面有一道和这个很相似的经典尺取法。先O(n)求出总共有多少种字符num。把字符一个一个加到队列,统计队列里面的字符种数,不够num,继续加入,如果够了,更新答案,并且将第一个字符出队,重复上述操作。#includeusing namespace std;const int maxn = 100000+50;char a[maxn];mapvis;int main(原创 2016-07-24 20:17:30 · 511 阅读 · 0 评论 -
CodeForces 492D Vanya and Computer Game(二分)
题意:Vanya每秒钟可以砍x刀,Vova每秒可以砍y刀,有n次询问,给你一个怪兽的血量为ai,然后问你最后一刀是谁补的刀,同时补刀,输出Both思路:二分是多少s砍死这只怪兽,然后再check就好一下了#includeusing namespace std;#define LL long longint main(){ int n; LL x,y; scanf("%原创 2016-05-17 22:52:09 · 543 阅读 · 0 评论 -
codeforces 675C Money Transfers(想法题)
思路:想法题,前缀和出现次数最多的值就是 区间和为0的个数#include#include#includeusing namespace std;const int maxn = 100005;#define LL long longint a[maxn];mapmp;int res = 0;int main(){ int n; scanf("%d",原创 2016-05-17 21:01:42 · 674 阅读 · 0 评论 -
Codeforces Round #319 (Div. 2)E Points on Plane
题意:给出n个点,要求排序后,相邻两点的欧拉距离之和小于等于2.5e9做法:由于0≤ xi, yi ≤ 1e6,所以可以将x然后每一份中的点都按照y单调排序。拿任意一份点做实验,如果从最小的y开始往上走,那么y的贡献最多1e6,那么一千份就总共最多贡献1e9。最后考虑x的贡献,在某一份点中,从一个点走到另一个点最多贡献1e3,那么这份总共最多贡献1e9,也就是所有点都在这一份里原创 2016-05-29 11:11:13 · 623 阅读 · 0 评论 -
CodeForces 615E Hexagons
题意:有个人会在图上的六边形那样走,问走了n步之后在哪里思路:找规律…#include<bits/stdc++.h>using namespace std;int main(){ long long n; while(scanf("%lld",&n)!=EOF){ if(n==0)return puts("0 0"); n--;原创 2016-04-20 16:53:43 · 598 阅读 · 0 评论 -
CodeForces 672D Robin Hood(二分)
思路:二分一个最小值,然后再二分一个最大值,因为会加k,使得小于那个最小值的数都加成为大于等于他的数你会减去k,使得大于那个数,都降为小于等于的那个数#includeusing namespace std;#define LL long longconst int maxn = 5e5+7;int a[maxn];int main(){ int n,k;原创 2016-05-14 20:40:31 · 1522 阅读 · 3 评论 -
Codeforces Round #354 (Div. 2) C Vasya and String(尺取法二分)
思路:枚举结尾,然后暴力二分就好了,用前缀和预处理一下,那么前缀和之差,就是你需要改变的个数#includeusing namespace std;const int maxn = 1e5+7;int n,k;int sum[maxn];char s[maxn];int main(){ scanf("%d%d",&n,&k); scanf("%s",s+1)原创 2016-05-26 22:08:37 · 773 阅读 · 0 评论 -
CodeForces 660C Hard Process
题意:你有n个非0就是1的数字,你可以修改最多k个,使得0变成1,然后问你修改之后,最长的连续1的串是多长?思路:维护一个前缀0的个数,然后对于每个位置,直接暴力二分就好了,二分这个位置最远能够延展到哪儿#includeusing namespace std;const int maxn = 1e6;int n,k;int a[maxn],dp[maxn];int原创 2016-04-18 23:26:06 · 392 阅读 · 0 评论 -
南京理工大学第八届程序设计大赛 H 谁才是最强战舰!
思路:经典博弈#includeusing namespace std;int a[1005];int main(){ int T; scanf("%d",&T); int n; while (T--) { scanf("%d",&n); int sum = 0; int flag = 0; for (int i = 0;i<n;i++) {原创 2016-04-17 23:45:34 · 1041 阅读 · 1 评论 -
CodeForces 580B Kefa and Company
思路:滑窗一波#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define fuck printf("fuck")#define FIN freopen("input.txt","原创 2016-04-30 11:31:43 · 418 阅读 · 0 评论 -
CodeForces 616D Longest k-Good Segment
题意:给你n个数,你需要找到一个最长的区间,使得这个区间里面不同的数小于等于k个思路:直接扫一遍就好了#includeusing namespace std;const int maxn = 1000005;int a[maxn];int vis[maxn];int main(){ int n,k; scanf("%d%d",&n,&k); for (int i原创 2016-04-17 11:17:57 · 303 阅读 · 0 评论 -
ZOJ 3826 Hierarchical Notation
思路:哈希之后一直爬就是了#include #include #include #include #include #include #include #include #include using namespace std;const int N=10010;int T,q,n,bp[N],ep[N],ch[N],bro[N];char s[N*20*2]原创 2016-05-24 20:54:46 · 323 阅读 · 0 评论 -
hdu5241 Friends
题意:一个错综复杂的关系思路:看样例,猜一发规律是32^n,然后上个大整数就可以了,用心体会/*#includeusing namespace std;const int base=1e4;void trans(char *x,int *a) //将正序的字符串x转为10^4进制逆序大整数a{ int lx=strlen(x); int &la=a[0]=1; f原创 2016-04-26 15:16:39 · 694 阅读 · 0 评论 -
CodeForces 163B Lemmings 二分
题意:给你n个袋鼠,然后袋鼠要跳楼梯,你需要选出k个袋鼠出来,跳k个楼梯,第一个楼梯的高度为h,第二个为2h,第三个为3h,第n个为nh,每个袋鼠有两个属性,体重和速度,要求如果i的体重大于j的话,i只能跳比j高的楼梯你需要使得k个袋鼠跳的最慢的袋鼠的时间最小,然后让你把方案输出思路:二分最后的时间,然后贪心的去选就好了,袋鼠按照体重为第一关键字,速度第二关键字从小到大排序贪心去选原创 2016-04-13 16:09:26 · 325 阅读 · 0 评论 -
Codeforces Round #368 (Div. 2) D Persistent Bookcase(离线+DFS)
思路:离线把所有操作都存起来,并且对于前三个操作连i-1到i的边,第四个操作回到第K个结点那么连k到i的边,然后DFS记录变化就可以了,这个过程对于第一次接触可能不太好理解,可以结合代码看注意:加书本的时候如果本来就有的话这个操作相当于无效,同理对于去掉一本书,DFS的时候回溯的时候记得把原来标记的状态变回原来的#includeusing namespace std;const原创 2016-08-23 20:49:13 · 357 阅读 · 0 评论 -
CSU 1811 Tree Intersection(启发式合并)
思路:对于某一颗子树来说,只需要统计这颗子树拥有的颜色和这颗子树独有的颜色,两者一减就是答案,考虑一直DFS到子树,然后向上合并,合并的时候将结点数小的往大的合并,这样可以做到nlogn的复杂度#includeusing namespace std;const int maxn = 1e5+7;struct Edge{ int v,id; Edge(){}; Edge(i原创 2016-09-16 21:13:46 · 669 阅读 · 0 评论 -
2017广东工业大学程序设计竞赛决赛F tmk找三角(套路)
思路:一眼非常神,其实想一下,要满足三角形必须要a+b>c,那么最坏情况下就是a+b=c再多一点点,那么这不就是一个斐波那契吗?而50项的斐波那契数列就已经大于2^31-1了,那么所以当树上的点大于50个的时候是一定能组成的,少于50个的时候直接抠出来暴力即可#includeusing namespace std;const int maxn = 1e5+7;vector >e[原创 2017-03-27 15:26:44 · 1292 阅读 · 2 评论 -
HackerRank - almost-sorted-interval (思维)
题意:题意非常简单,给你n个数,范围都是1-n,问你这个序列中有多少个区间满足最小值在最左边,最大值在最右边思路:想了一个下午。。好久没做题感觉要eat shit了。。 假设我们从左往右扫过去,我们考虑维护两个序列以及它们的贡献值,一个为当前数字左边已合并区间的最小值,一个为当前数字左边已合并区间的最大值,设一个为s1,一个s2,那么比如我出一个样例为 1 2 4 3 5原创 2017-02-23 10:09:23 · 537 阅读 · 0 评论 -
Codeforces Round #379 (Div. 2) C. Anton and Making Potions(枚举+二分)
思路:枚举使用A的类型,然后二分B类型,注意有可能两个都不用,或者只用一个的情况#includeusing namespace std;#define LL long longconst int maxn = 2*1e5+7;LL a[maxn],apri[maxn],b[maxn],bpri[maxn];LL n,x,s;int main(){ int m,k;原创 2016-11-23 11:05:18 · 452 阅读 · 0 评论 -
哈理工第六届程序设计大赛 F 苦逼的单身狗(滑窗)
思路:比较显然的滑窗?需要注意的是左边界移过去的时候要判一下是否那个字符是LOVE唯一的#includeusing namespace std;const int maxn = 100005;char s[maxn];char ss[10] = "LOVE";int ans,vis[maxn],r,cnt;int main(){ int T; scanf("%d",&原创 2016-11-20 21:14:29 · 769 阅读 · 0 评论 -
Educational Codeforces Round 15 B Powers of Two
思路:ai+aj=2^x,移过去就是aj=2^x-ai嘛,由于ai的范围到10^9,所以其实x不会超过31,所以枚举一下x就可以了#includeusing namespace std;const int maxn = 1e5+7;#define LL long longmapvis;LL ans = 0;int main(){ int n=0; scanf("%d"原创 2016-12-02 16:54:02 · 352 阅读 · 0 评论 -
UVALive 7147 World Cup (智商题)
思路:先讨论最高不晋级分数,我们考虑把N个人分成m,1,n-m-1个人,那么中间那个人的分数就是答案,那么中间这个人和后半部分的人的比赛结果一定是要么全赢,要么全平,ans+=(n-m-1)*max(a,b),而与前面的人比赛,既然需要最高不晋级分,那么就可能和前面的人赢输对半,或者全平,ans+=max(m/2*a+m/2*b,m/2*b+m/2*b),而当m是奇数的时候,则多一轮,显然这轮的结原创 2016-11-15 19:15:20 · 841 阅读 · 0 评论 -
Codeforces Round #379 (Div. 2) E Anton and Tree(缩点)
思路:一个相同颜色的联通块可以把颜色反转,那么容易想到把这一个联通块缩点成一块,那么最后得出来的就是一颗黑白相间的树,那么最后的结果就是直径/2向上取整啦#includeusing namespace std;#define LL long longconst int maxn = 2*1e5+7;int c[maxn],d[maxn];vectore[maxn];void原创 2016-11-17 22:59:18 · 565 阅读 · 0 评论 -
Codeforces Round #382 (Div. 2) Tennis Championship (斐波那契)
题意:n个人两两PK,赢了留下,输了淘汰,问最后赢的人获胜需要的最大场数思路:令f[i]为赢i场需要的人数,容易发现是一个斐波那契....然后就做完了#includeusing namespace std;#define LL long longLL fic[105];void init(){ fic[0]=0; fic[1]=1; fic[2]=2; for(i原创 2016-11-29 15:37:23 · 266 阅读 · 0 评论 -
2016弱校联盟10.5台湾场 J Just Convolution(鸽巢&&暴力)
思路:注意到数组的数据范围都是0-n-1,那么它们的最大值最大到2*(n-1),从大到小枚举更新答案,如果已经出现过则不用再更新了,因为肯定不会更优#includeusing namespace std;const int maxn = 4*1e5+7;int a[maxn],b[maxn],c[maxn];int n;int main(){ while(scanf原创 2016-10-31 23:35:12 · 482 阅读 · 0 评论 -
51nod 1127 最短的包含字符串(滑窗)
思路:求解固定区间最大最小问题,一般都是滑窗#includeusing namespace std;const int maxn = 1e6+7;char s[maxn];mapvis;int main(){ scanf("%s",s+1); int ans = 1e9; int len = strlen(s+1); int num = 0; int原创 2016-10-05 17:46:25 · 701 阅读 · 0 评论 -
51nod 1267 4个数和为0
思路:先n^2预处理出所有两两的组合,那么就变成要找a+b==0的问题了,那么排序O(n)去找就可以了#includeusing namespace std;#define LL long longconst int maxn = 1005*1005;struct Node{ LL v; int x,y;}node[maxn];bool cmp(Node a,Node原创 2016-10-05 17:42:52 · 1171 阅读 · 0 评论 -
51nod 1065 最小正子段和(前缀和)
思路:处理一个连续区间的问题一般都要从前缀和开始考虑。。这是套路#includeusing namespace std;const int maxn = 50000+7;#define LL long longstruct Node{ LL v; int id;}a[maxn];bool cmp(Node aa,Node b){return aa.v==b.v?aa.原创 2016-10-05 17:39:21 · 403 阅读 · 0 评论 -
51nod 1393 0和1相等串(鸽巢)
思路:首先可以将问题抽象成一个括号问题,将0视为-1,1视为1,那么如果0和1的个数相等,他们的前缀和为0,这个时候就可以直接更新答案了,而如果不为0,这个时候如果前面有一段的前缀和等于现在这个前缀和,那么证明两个前缀和之间的和为0,那么更新答案,仔细想想是不是?#includeusing namespace std;const int maxn = 1000000+7;char原创 2016-10-05 16:27:29 · 407 阅读 · 0 评论 -
51nod 1105 第K大的数(二分)
思路:二分答案,然后利用排序之后的有序性直接判就可以了#includeusing namespace std;#define LL long longconst int maxn = 50000+7;LL a[maxn],b[maxn];LL n,k;LL check(LL x){ LL ans=0; int j=n; for(int i = 1;i<=n;i++)原创 2016-09-22 22:09:10 · 514 阅读 · 0 评论 -
Educational Codeforces Round 2 E Lomsat gelral(启发式合并)
思路:维护每个子树颜色最多的数量以及每个颜色拥有的数量,然后启发式合并一波#includeusing namespace std;#define LL long longconst int maxn = 1e5+7;vectore[maxn];int n,c[maxn],num[maxn]; //LL ans[maxn];mapcnt[maxn]; //cnt[u原创 2016-09-17 10:13:43 · 388 阅读 · 0 评论 -
ZOJ 3870 Team Formation(二进制找规律)
DescriptionFor an upcoming programming contest, Edward, the headmaster of Marjar University, is forming a two-man team from N students of his university.Edward knows the skill level of each stud原创 2016-04-13 10:00:51 · 373 阅读 · 0 评论 -
CodeForces 176C Playing with Superglue(游戏)
题意:给你一个n*m的棋盘,第一个人的目的是让两个棋子合在一起,第二个人是阻止两个棋子合在一起,然后给你两个棋子,第一个人先走,然后第二个人在地上涂胶水,涂过胶水的位置棋子踩了上去就不能动了,问你谁能够胜利思路:游戏题....慢慢找规律...在WA了快十次之后终于找到3 4这种数据#includeusing namespace std;int main(){ int原创 2016-04-13 09:54:13 · 1140 阅读 · 0 评论 -
CodeForces 645C Enduring Exodus
题意:有n个房间,现在有k只牛和你来住,其中0代表空闲,1代表已经有人了,求大家相距的距离的最大值要最小。思路:最值最小或者最大问题,显然二分答案,然后直接暴力check即可#include #include #include #include #include #include #include #include #include #include #incl原创 2016-03-26 16:51:49 · 1009 阅读 · 0 评论 -
2015浙江理工校赛C String Game
题解多试几次就能发现规律了…转一个题解的解释比较字符串,a字符串,与b字符串,可以证明的b字符串在a字符串中间,才是Alice赢,因为Bob从左边拿一个,Alice就可以从右边拿一个,Bob从右边拿一个,Alice就可以从左边拿一个,保证b字符串一直在a字符串中间,但是还有两种情况,就是如果有两个字符串与b匹配,那么只要这两个字符串关于a的中间对称,且两个字符串的位置差不超过2,那么也是Alice赢原创 2015-12-21 20:12:58 · 671 阅读 · 0 评论 -
UVA12174 Shuffle(滑窗)
题意:有一个播放器用于播放音乐,现在给出s(已有曲目的数量),n给出记录的长度。播放器有随机播放的功能,每次生成一个1~s的随机系列进行播放,当s首歌全部播放完后,重新生成一个播放序列。现在有一段长度为n的播放记录片段(即不完全,前后可能还有歌曲),问说该片段的第一首歌可能处于某个播放序列的哪个位置,输出位置的可能数。题解:枚举可能的开头,然后滑窗#includ原创 2016-01-22 16:06:21 · 280 阅读 · 0 评论 -
UVA12627 Erratic Expansion (递归找规律)
题意:一开始有一个红气球,每小时,一个红气球会变成3个红气球和1个蓝气球,而一个蓝气球会变成4个蓝气球,如图所示,经三小时变化后。根据图中给出的气球的分裂方式,求第K次分裂后,第A行到第B行的红色气球的数量。可以这么想,用前B行的红色气球的数量减去A-1行的红色球的数量就可以得到第A行到第B行的红色气球的数量。然后再观察第三小时和第二小时的图,发现第二小时的图和第三张图分成四块后的其中三块相同,而原创 2016-01-22 16:30:10 · 272 阅读 · 0 评论 -
uva1471 - Defense Lines (最长上升子序列变形)
题意:在序列中去掉某个连续的子序列使得序列的最长上升子序列最长题解:设l[i]为以i为结束的最长上升子序列的长度,r[i]为以i为开始的最长上升子序列的长度,那么dp[i]=r[j]+l[i],由于和普通的LIS类似,所以可以利用LIS的优化方法把该题的时间复杂的优化到O(nlogn)。方法仍是利用一个数组d[i]记录长度为 i 的连续递增序列的最后一个元素的最小值,显然该序列是单调递增的原创 2016-01-22 11:36:27 · 586 阅读 · 0 评论