旋转子段 (思维stl)】的更多相关文章

T1 旋转子段 30% 暴力枚举起点和长度,暴力判断,o(n3)  不知道为什么我拿了40分... 60% 每一个点都有一个固定的旋转中心可以转成固定点,枚举旋转点和长度. 100% 用一个vector存一下以此点为旋转中心,可以将哪些点转成好点,存区间的左右端点(i,a[i]),将区间长度从小到大排序,枚举中间点,再枚举以他为中心可以将哪些点转成固定点,由于按区间长度排序了,所以第几个点+1就是旋转后当前区间有的固定点个数.区间左右的用前缀和计算即可. #include<iostream>…
题目描述 $ZYL$有$N$张牌编号分别为$1,2,...,N$.他把这$N$张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第$i$个位置的牌的编号为$i$,我们就称之为固定点.旋转可以被认为是将其中的一个子段旋转$180$度,这意味着子段的第一张牌和最后一张牌交换位置,以及第二张牌和倒数第二张牌交换位置,等等.写一个程序,找到旋转子段(子段长度可以为$1$). 输入格式 第一行包含一个整数$N$.第二行有$N$个数,第$i$个数表示旋转之前第$i$个位置的牌的编号. 输出格…
旋转子段 连60分都没想,考试一直肝t3,t2,没想到t1最简单 我一直以为t1很难,看了题解发现也就那样 题解 性质1 一个包含a[i]旋转区间值域范围最多为min(a[i],i)----max(a[i],i) 感性理解 举个例子,例如3 7 1 4 5 6 2 这个子段包含a[2]的最大为值域范围2----7 具体证明我不会 性质2 翻转后满足固定点对的点满足 a[i]+i==a[j]+j 证明 因为翻转之前a[i]==j&&a[j]==i才满足翻转之后都构成点对 移项得到a[i]+i…
题目: 大概意思就是给你一个序列,你可以选择一段区间使它左右翻折一遍,然后呢,从1到n找一遍,看a[i]==i的数最多是多少. 其实刚才我已经把暴力思路说出来了,枚举每一个区间长度,枚举每一个左端点,再查询a[i]的值,时间复杂度O(n^3^). 稍微优化一点,枚举每一个中点,左右扩展的同时查询,复杂度O(n^2^)(注意中点有可能不是点,可能是两个点中间,不考虑这个会被卡20分) 正解: 我们需要考虑下面两个性质: 性质1:对于一个点i,如果想让它满足条件,它的翻折区间是从i到a[i],在这个…
题目链接:http://codeforces.com/problemset/problem/883/H 题目大意:给一段长度为n的字符串s,想让你把s切成几段长度相同的回文串,可以改变s中字符的排列,最少可以出现切成几段. 解题思路:看了大佬写的,自己思维还是有诸多不足,也学到了vector可以用pop_back()删除最后一个元素,还学到了处理字符数量的技巧.首先,每段回文串里肯定都有一个字符是单个的,假设每段回文串都没有字符是单个的,那说明可以合成一串,假设不成立.假设有的回文串中有字符是单…
作者的正解: 算法一:对于30%的数据: 直接枚举区间直接模拟,时间复杂度O(N3). 算法二:对于60%的数据:枚举旋转中心点,然后再枚举旋转的端点, 我们可以用O(n)的预处理求前缀和记录固定点,总时间复杂度O(N2). 算法三:对于100%的数据:假设有最优解为[i,j](i,j皆为下标,A[i],A[j]才是题目所要输出的答案).if(A[i]!=j&&A[j]!=i),就是A[i]和A[j]经过旋转之后都没有成为不动点,那么[i+1,j-1]也是一个最优解(如果i+1>j-…
Problem UVA1471-Defense Lines Accept: 297  Submit: 2776Time Limit: 9000 mSec Problem Description After the last war devastated your country, you - as the king of the land of Ardenia - decided it was high time to improve the defense of your capital ci…
原文地址:https://blog.csdn.net/weixin_39453270/article/details/80548442 博主已经讲的很好了 题意: 从一个序列中,选出一个集合,使得集合里的数两两差得绝对值为2得幂次 解析: 对于这个题目,我们需要发现这么一个结论,答案中形成的集合的大小最大只能达到3. 下面对这个命题进行简单的证明: 我们设当集合大小=3,三个数从小到大分别为a,b,c,即要符合条件,则需要满足: b-a=k1 (1) c-b=k2 (2) c-a=k3 (3)…
链接:https://ac.nowcoder.com/acm/contest/551/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld 题目描述 CSL 以前不会字符串算法,经过一年的训练,他还是不会--于是他打算向你求助. 给定一个字符串,只含有可打印字符,通过删除若干字符得到新字符串,新字符串必须满足两个条件: 原字符串中出现的字符,新字符串也必须包含. 新字符串中所有的字符…
description analysis 可以先用前缀和把原串不调整的方案数先求出来 对于一种翻转,肯定是把\([i..a[i]]\)或\([a[i]..i]\)这段区间翻转 也可以看做是以\({i+a[i]}\over 2\)这个点为翻转中心来翻转区间 于是把所有\(n\)个翻转中心搞出来,用\(vector\)存下翻转长度 对于每个翻转中心点,把翻转长度排一下序,从小到大做 由于当前长度翻转只会影响一个点从不合法点变成合法点,所以每次方案递增 左右端点\([l,r]\),每次\(l\)变小\…
迭代器是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物. 1 迭代器设计思维——STL关键所在 不论是泛型思维或STL的实际运用,迭代器都扮演这重要的角色.STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将它们撮合在一起.容器和算法的泛型化,从技术的角度来看是并不困难,C++的class template和function templates可分别达成目标. 以下是容器.算法.迭代器的合作展示,以算法find()为例,它接受两个迭代器和一个”搜索目标…
最近在看STL源码解析的迭代器(iterators)一章,涉及到c++ Traits的编程技法,刚开始看时一头雾水,反复看了好几遍之后才理解这个东西,因此来写写在这方面的理解,如有错误,希望读者指正. 1.迭代器(iterators) 在设计模式中,将迭代器进行如下定义:提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式. 2.迭代器的设计思维 STL的设计思想在于:将容器和算法分离开来,彼此独立设计,最后在以一帖胶着剂撮合在一起,这个胶着剂就是迭…
一.迭代器 1. 迭代器设计思维——STL关键所在 在<Design Patterns>一书中对iterator模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式. STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一贴胶着剂将它们撮合在一起.容器和算法的泛型化,从技术角度来看并不困难,C++ 的class templates 和 function templates…
先扔代码 调完自闭网络流了,新一轮考试前看看能不能赶完…… 考得极其爆炸,心态也极其爆炸,真的是认识到自己能力上的不足 思维跑偏,代码能力差 就这样吧,再努力努力,不行就AFO T1旋转子段: 因为我和正解的绝缘性,我上来先选择想暴力,搞了搞把暴力优化到n2,行了,就交了 大约是想正解的时候被奇怪的问题hack掉没有解决,于是被踢出了正解门外 这边正解用的是O(n)的做法.一个可以成为答案的旋转子段,如果它的两个端点旋转以后没有一个成为固定点,那么缩短这个子段的长度直到端点出现旋转以后的固定点,…
A - 大鱼吃小鱼(栈) 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右).问足够长的时间之后,能剩下多少条鱼?Input第1行:1个数N,表示鱼的数量(1 <= N <= 100000). 第2 - N + 1行:每行两个数A[i], B[i],中间用空格分隔,分别表示鱼的大小及游动的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1…
T1.rotate [问题描述] ZYL有N张牌编号分别为1, 2,……,N.他把这N张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第i个位置的牌的编号为i,我们就称之为固定点.旋转可以被认为是将其中的一个子段旋转180度,这意味着子段的第一张牌和最后一张牌交换位置,以及第二张牌和倒数第二张牌交换位置,等等.写一个程序,找到旋转子段(子段长度可以为1). [输入] 第一行包含一个整数 N (1 ≤ N ≤100 000). 第二行有N个数,第i个数表示旋转之前第i个位置的牌的…
垃圾成绩,一点都不稳定. 如果把数组开小的分得到的话..总分还挺不错.. 那又能怪谁,都快NOIP了还犯这种傻逼错误 nc哥是要阿卡的节奏..真是太强了 某kyh也不知道偷了谁的rp,分高的一批 wd从来很强..几乎就没失手过 就我一个渣渣还是这么没前途555 暴力的分不会拿555 想到正解拿不到分555 T1 旋转子段 貌似思路和题解并不一样,但是复杂度没区别,还比题解好理解(并不是) n^2:一个数要回到自己位置,旋转中心一定 用旋转中心的编号替代这个数的位置,不需旋转的数是他自己 用另一个…
我太难了 先说好没有代码T1 题目大意: 给定一些形如|ax+b|的式子,求最小的x使得它们的和最小. 算法一: 大家知道零点分段法 对于这n个式子我们有n+1个取值范围 使得展开这n个式子得到的新式子不同 而对于每一个形成的式子,因为我们有这个x的取值范围,所以我们可以在O(1)的复杂度求出它的最小值. 而我们从最左边的取值范围开始,对于相邻的两个取值范围我们可以用O(1)的复杂度转移,即我们可以用O(n)遍历所有可能形成的n个式子,每个算一下答案即可. 需要注意的是,对于所有a[i]=0,我…
当垃圾已经成为一种常态233333 A.旋转子段 考场上的$n^2$手残少了20分,555  (主要是因为实在打不出来$n^3$的做法所以写不了对拍?ccc为什么考场上没有想起有reverse()这么毒瘤的操作啊) 很显然要反转的区间两端一定是一对$i,a[i]$(具体谁在左谁在右看大小关系),因为如果不是的话它俩没啥用就完全可以去掉. 所以枚举所有的i和a[i]不断更新最优解就能得到答案,那么只要能够$O(1)$查询答案复杂度就可以保证了.不妨设当前枚举到的i<a[i],那么我们要查询的固定点…
T1旋转子段 一开始脑袋抽了花了近一个小时写了个跟这题毫无关系的莫名其妙的代码,一急代码就各种bug,最后t1就花了一个半小时多,然后后面时间不太够了,考得稀烂. 因为每个数存在唯一的中心使得绕这个中心翻转后成为”不动点“,容易想到枚举对称中心.因为把关于这个中心对称的所有点都翻转不一定最优(然而王巨直接全翻过了,数据大概是用脚造的),那么按到对称中心的距离排序后一一枚举翻到哪个位置的答案,不翻的部分用前缀和数组维护即可,每个点只会在它的对称中心被枚举到,所以复杂度是nlogn(set or 排…
前不久把STL细看了一遍,由于看得太"认真",忘了做笔记,归纳和总结这步漏掉了.于是为了加深印象,打算重看一遍,并记录下来里面的一些实现细节.方便以后能较好的复习它. 以前在项目中运用STL一般都不会涉及到空间配置器,可是,在STL的实现中,空间配置器是重中之重,因为整个STL的操作对象都存放在容器之内,而容器一定需要配置空间以置放资料.所以,在阅读STL源码时,最先需要掌握的就是空间配置器,没了它,容器,算法怎么存在? C++ STL的空间配置器将内存的配置.释放和对象的构造和析构分…
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(33)搜索旋转排序数组 一 题目描述! 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "无视要求,直接调用 indexOf 等函数" var search = function(nums, target) { return nums.indexOf(target); }; 2 方案2 1)代码: // 方案2 "无视要求,单指针" // 技巧: // 1)…
C. Functions again time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Something happened in Uzhlyandia again... There are riots on the streets... Famous Uzhlyandian superheroes Shean the Sheep…
N个整数组成的序列a11,a22,a33,…,ann,从中选出一个子序列(aii,ai+1i+1,…ajj),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如:4,-1,5,-2,-1,2,6,-2.-1,5,-2,-1,序列和为1,是最小的.   Input第1行:整数序列的长度N(2 <= N <= 50000) 第2 - N+1行:N个整数Output输出最小正子段和.Sample Input 8 4 -1 5 -2 -1 2 6 -2 Sample Ou…
#include <iostream>#include <algorithm>#include <vector>#include <iterator> using namespace std; int main(){ vector<int> vec1; for (int k=0;k<10;k++) { vec1.push_back(k); } vector<int>::iterator vec_iter1; for (vec_i…
N个整数组成的序列a[1],a[2],a[3],-,a[n],从中选出一个子序列(a[i],a[i+1],-a[j]),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如:4,-1,5,-2,-1,2,6,-2.-1,5,-2,-1,序列和为1,是最小的.   Input 第1行:整数序列的长度N(2 <= N <= 50000) 第2 - N+1行:N个整数 Output 输出最小正子段和. Input示例 8 4 -1 5 -2 -1 2 6 -2 Outpu…
Secrete Master Plan Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status Master Mind KongMing gave Fei Zhang a secrete master plan stashed in a pocket. The plan instructs how to deploy soldiers on the four…
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065 估计没人这么做吧-用一个set维护前缀和,但是set的lower_bound和upper_bound都是返回不小于x的最小值,这就很尴尬了.  重载了这个<,在树里面前序遍历出来的就是降序了. 然后二分的时候还是用的这个<,原本意思是找到不小于的第一个,但是重载以后,查找的位置不变,结果就是不大于的了. #include <bits/stdc++…
题目:https://www.luogu.org/problemnew/show/P1088 题意: 给定一个n个数的排列,要求得到这之后的第m个排列. 思路: next_permutation的简单应用. 题意本身是说找到m加上当前值之后在火星人的表示法里的数. 但是本身加减顺序是可换的,题意可以变换成当前的值之后的第m个 所以当前的排列之前的根本不需要管,只用从当前开始,跑m次next_permutation就可以了. #include<stdio.h> #include<stdli…
题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2736/pid/4359 具体思路: 首先分析一波,最大的连续字段和只有两种情况,第一中,在 n个中间直接找,第二种.这个数组的尾部取几个,然后再从头部找出几个,使得总和最大. 然后思路就来了,对于第一种情况,我们直接线性的跑过去就可以了.对于第二种情况,我们可以对整个数组进行取反,然后再对取反后的数组求一个最大连续和,这样就相当…