精华内容
下载资源
问答
  • 【链接】 ... 【题意】 分最少的堆,使得1-n的数都可由...显然等比能够表示的长度更大,求二进制长度 【代码】 #include<bits./stdc++.h> using namespace std; int main() { int n; scanf("...

    【链接】

    http://codeforces.com/problemset/problem/1037/A

    【题意】

    分最少的堆,使得1-n的数都可由堆组合表示

    【思路】

    显然等比能够表示的长度更大,求二进制长度

    【代码】

    #include<bits./stdc++.h>
    using namespace std;
    int main() {
    	int n;
    	scanf("%d", &n);
    	int cnt =0;
    	while (n) {
    		n /= 2;
    		cnt++;
    	}
    	printf("%d\n", cnt);
    }

     

    展开全文
  • 题目链接:https://vjudge.net/contest/366677#problem/B Input 6 5 1 4 3 2 1 6 2 4 1 3 2 1 4 2 1 1 3 4 1 3 3 1 12 2 1 3 4 5 6 7 8 9 1 10 2 3 ...输入n个数,求是否能把这个长度为n的数组...

    题目链接https://vjudge.net/contest/366677#problem/B
    在这里插入图片描述
    Input

    6
    5
    1 4 3 2 1
    6
    2 4 1 3 2 1
    4
    2 1 1 3
    4
    1 3 3 1
    12
    2 1 3 4 5 6 7 8 9 1 10 2
    3
    1 1 1

    Output

    2
    1 4
    4 1
    1
    4 2
    0
    0
    1
    2 10
    0

    翻译

    输入n个数,求是否能把这个长度为n的数组分成两个全排列。
    记录有多少次方法,和每次分成的两个全排列的长度。
    例如:
    5
    1 4 3 2 1
    有2种办法 {1}+{4,3,2,1}and {1,4,3,2}+{1}

    分析
    全排列:如果m 个整数的序列包含了1~m的整数,且1到m正好出现一次。m这个数叫做全排列的长度。

    ma为数组中的最大值
    如果把数组a分成两个全排列p1和p2,那么ma一定是max(len1,len2)。(最大的数值为全排列的长度

    这里有两种情况:

    1. len1=ma,len2=n−ma
    2. len1=n−ma,len2=ma

    代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=2*1e5+10;
    int n,a[N];
    int mx;
    int index[2][2],cnt;
    void init()
    {
        mx=0;
        cnt=0;
        memset(index,0,sizeof(index));
    }
    bool solve(int a[],int n)
    {
        bool book[N];
        for(int i=1; i<=n; i++)
            book[i]=false;
        for(int i=0; i<n; i++)
            book[a[i]]=true;
        for(int i=1; i<=n; i++)
        {
            if(!book[i])
                return 0;
        }
        return 1;
    }
    bool judge(int len1,int n)
    {
        return solve(a,len1)&&solve(a+len1,n-len1);/*a  a+len1分别为数组的起始位置,从这个位置开始遍历*/
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            init();
            scanf("%d",&n);
            for(int i=0; i<n; i++)
            {
                scanf("%d",&a[i]);
                mx=max(mx,a[i]);
            }
            if(judge(n-mx,n))
            {
                index[cnt][0]=n-mx;
                index[cnt++][1]=mx;
            }
            if(mx*2!=n&&judge(mx,n))/*mx*2和n比较,排除两个全排列的长度相等的情况*/
            {
                index[cnt][0]=mx;
                index[cnt++][1]=n-mx;
            }
            printf("%d\n",cnt);
            for(int i=0; i<cnt; i++)
                printf("%d %d\n",index[i][0],index[i][1]);
        }
        return 0;
    }
    
    展开全文
  • 也就是开三倍长度的并查集,X:1-n,Y:n+1-2n,Z:2n+1-3*n 对于a,b两个元素,如果是同类那么我们union(a,b),同时知道被他们吃的元素a+n,b+n也是同类,所以union(a+n,b+n) 同时知道被a+n,b+n吃的元素也是同类,所以union...

    在这里插入图片描述在这里插入图片描述根据我们开三个集合:X,Y,Z.
    这三个集合的满足:X吃Y吃Z吃X,也就是下图
    在这里插入图片描述
    也就是开三倍长度的并查集,X:1-n,Y:n+1-2n,Z:2n+1-3*n

    对于a,b两个元素,如果是同类那么我们union(a,b),同时知道被他们吃的元素a+n,b+n也是同类,所以union(a+n,b+n)
    同时知道被a+n,b+n吃的元素也是同类,所以union(a+2n,b+2n)(同类吃的元素也是同类,能吃同类的元素也是同类)

    如果 a 吃 b 那么 a吃的元素和b是同类 也就是 union(a+n,b) , 吃b的元素和a也是同类 也就是union(b+2n,a)
    吃a的元素和b吃的元素是同类 也就是 union(a+2
    n,b+n)

    AC代码

    #include <iostream>
    #include <cstring>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <cstdio>
    #include <stdio.h>
    #include<queue>
    #include<math.h>
    using namespace std;
    
    // 初始化并查集
    #define N 200005
    
    int father[N];
    void init() {
    	for (int i = 0; i < N; i++)
    		father[i] = i;
    }
    
    
    int getfather(int x) {
    	if (x != father[x])
    		father[x] = getfather(father[x]); 
    	return father[x];
    }
    
    void un(int x, int y) {
    	x = getfather(x);
    	y = getfather(y);
    	if (x != y)
    		father[x] = y;
    }
    
    
    
    int main()
    {
    	int n, k;
    	scanf("%d %d", &n, &k);
    	init();
    	int ans = 0;
    	while (k--)
    	{
    		int m, x, y;
    		scanf("%d %d %d", &m, &x, &y);
    		if (x > n || y > n)
    		{
    			ans++;
    			continue;
    		}
    		if (m == 1)
    		{
    			if (getfather(x) == getfather(y + n) || getfather(x) == getfather(y + 2 * n))
    			{
    				ans++;
    			}
    			else
    			{
    				un(x, y);
    				un(x + n, y + n);
    				un(x + 2 * n, y + 2 * n);
    			}
    		}
    		else
    		{
    			if (getfather(x) == getfather(y) || getfather(x) == getfather(y + n))
    			{
    				ans++;
    			}
    			else
    			{
    				un(x, y + 2*n);
    				un(x + n, y);
    				un(x + 2 * n, y + n);
    			}
    		}
    	}
    	cout << ans << endl;
    }
    
    
    
    
    
    
    展开全文
  • 思维

    2019-01-22 20:57:41
    小a有一个长度为nn的排列。定义一段区间是"萌"的,当且仅当把区间中各个数排序后相邻元素的差为11 现在他想知道包含数x,yx,y的长度最小的"萌"区间的左右端点 也就是说,我们需要找到长度最小的...

    链接:https://ac.nowcoder.com/acm/contest/317/G
    来源:牛客网
     

    小a有一个长度为nn的排列。定义一段区间是"萌"的,当且仅当把区间中各个数排序后相邻元素的差为11
    现在他想知道包含数x,yx,y的长度最小的"萌"区间的左右端点

    也就是说,我们需要找到长度最小的区间[l,r][l,r],满足区间[l,r][l,r]是"萌"的,且同时包含数xx和数yy

    如果有多个合法的区间,输出左端点最靠左的方案。

     

     

    输入描述:

    第一行三个整数N,x,yN,x,y,分别表示序列长度,询问的两个数
    第二行有nn个整数表示序列内的元素,保证输入为一个排列

    输出描述:

    输出两个整数,表示长度最小"萌"区间的左右端点

    示例1

    输入

    复制

    5 2 3
    5 2 1 3 4

    输出

    复制

    2 4

    说明

    区间[2,4]={2,1,3}[2,4]={2,1,3}包含了2,32,3且为“萌”区间,可以证明没有比这更优的方案

    示例2

    输入

    复制

    8 3 5
    6 7 1 8 5 2 4 3

    输出

    复制

    5 8

    备注:

    保证2⩽n⩽105,1⩽x,y⩽n

    代码:

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
     
    const int maxn=1e5+5;
    int a[maxn];
    int b[maxn];
    int c[maxn];
    int l,r;
    int main ( )
    {
        int n,x,y;
        scanf("%d%d%d",&n,&x,&y);
        for (int i=0; i<n; i++ )
        {
            scanf("%d",&a[i]);
            c[a[i]]=i;
            if(a[i]==x)l=i;
            if(a[i]==y)r=i;
        }
        if(l>r)swap(l,r);
        int mina=0x7fffffff;
        int maxa=-1;
        while(true)
        {
            for (int i=l; i<=r; i++ )
            {
                mina=min(mina,a[i]);
                maxa=max(maxa,a[i]);
            }
            if(maxa-mina==r-l)
            {
                cout<<l+1<<" "<<r+1<<endl;
                return 0;
            }
            for (int i=mina; i<=maxa; i++ )
            {
                if(c[i]<l)l=c[i];
                else if(c[i]>r)r=c[i];
            }
        }
        return 0;
    }

    下面是自己(rmq做的)的提交显示爆内存(不是很明白,网大佬指导)

     

    #include<iostream>
    #include<queue>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    int lll,rrr;
    int n,xx,yy,x,y;
    
    
    const int MAXN=100010;
    int dmax[MAXN][20];
    int dmin[MAXN][20];
    int d[MAXN];
    struct Node
    {
        int l;
        int r;
        Node(int l,int r):r(r),l(l){}
    };
    void initMax(int n,int d[])
    {
        for(int i=1;i<=n;i++)dmax[i][0]=d[i];
        for(int j=1;(1<<j)<=n;j++)
            for(int i=1;i+(1<<j)-1<=n;i++)
                dmax[i][j]=max(dmax[i][j-1],dmax[i+(1<<(j-1))][j-1]);
    }
    int getMax(int L,int R)
    {
        int k=0;
        while((1<<(k+1))<=R-L+1)k++;
        return max( dmax[L][k],dmax[R-(1<<k)+1][k] );
    }
    void initMin(int n,int d[])
    {
        for(int i=1;i<=n;i++)dmin[i][0]=d[i];
        for(int j=1;(1<<j)<=n;j++)
            for(int i=1;i+(1<<j)-1<=n;i++)
                dmin[i][j]=min( dmin[i][j-1],dmin[i+(1<<(j-1))][j-1] );
    }
    int getMin(int L,int R)
    {
        int k=0;
        while((1<<(k+1))<=R-L+1)k++;
        return min( dmin[L][k],dmin[R-(1<<k)+1][k] );
    
    }
    int BFS()
    {
    
        queue<Node> Q;
        while(!Q.empty()) Q.pop();
        Q.push(Node(x,y));
        while(!Q.empty())
        {
            Node node=Q.front();Q.pop();
            int r=node.l,c=node.r;
    
            int minn=getMin(r,c);
            int maxx=getMax(r,c);
    
            if((maxx-minn)==(c-r))
            {
    
                lll=r;
                rrr=c;
                return 1;
            }
            else
            {
              if(r-1>=1)
              Q.push(Node(r-1,c));
              if(c+1<=n)
              Q.push(Node(r,c+1));
              if(r-1>=1&&c+1<=n)
              Q.push(Node(r-1,c+1));
    
            }
        }
       return 0;
    }
    
    
    
    int main()
    {
    
        //cin>>n>>xx>>yy;
        scanf("%d%d%d",&n,&xx,&yy);
    
       for(int i=1;i<=n;i++)
        {
            //cin>>d[i];
            scanf("%d",&d[i]);
            if(d[i]==xx)x=i;
            if(d[i]==yy)y=i;
    
        }
    
       if(x>y)swap(x,y);
       //cout<<x<<" "<<y<<endl;
            initMax(n,d);
            initMin(n,d);
            //cout<<getMin(x,y)<<getMax(x,y);
            if(BFS()==1)
            {
                //cout<<lll<<" "<<rrr<<endl;
                printf("%d %d\n",lll,rrr);
            }
            else
            {
                printf("0\n");
            }
    }
    

     

    展开全文
  • BowWow and the Timetable(思维) 题目链接:codeforces 1204A 题意: 城市从第1分钟开始, 每到4^k分钟的时候都有车离开, 现给出一个二进制串, 问在该时间到达城市, 已经离开了多少辆车 ? 题解: 字符串的...
  • 思维导图学网络——IPv6 完整的思维导图链接下载链接:链接:...IPv6报头由两部分组成,分别为长度固定的基本报头和拓展报头。 基本报头格式 拓展报头格式 IPv6地址 地址格式 地址类型 ...
  • 思维

    2018-12-03 21:36:00
     给定字符串长度,再输入该长度的字符串(只包含G和S),求交换一次两个字符位置后得到的G的最大连续长度。 题目思路:  统计连续的G数目,用cntg记录  记录下G的总数目,用sumg记录  记录下与该S紧紧相连...
  • 思维题——K序列

    2020-10-01 14:37:54
    思维题——K序列 题目描述 给一个数组 a,长度为 n,若某个子序列中的和为 K 的倍数,那么这个序列被称为“K 序列”。现在要你 对数组 a 求出最长的子序列的长度,满足这个序列是 K 序列。 输入描述 第一行为两个...
  • 思维风暴篇

    2019-05-01 21:45:57
    题意: 两个长度为n的数组,数组a位置不变,改变数组b的位置,构造数组c ci=(ai+bi)%n,使得数组c字典序最小。 题解: 使得数组c的字典序最小,即每次bi使得ai+bi大于n并且最接近n,因此用multiset维护数组b,lowe....
  • 图论思维习题

    2020-09-14 11:02:44
    最少:可以发现路径长度为偶数的话,可以设为以同一个数。奇数的话,就至少需要 3 个数。因此若叶节点两两之间的距离为偶数,那么答案就是 1,否则为 3 。 最多:可以发现如果两个叶节点距离为 2,
  • UVA 10881 思维

    2015-11-26 21:11:58
    UVA 10881 题目链接: ...题意: n只蚂蚁在长度为L的轴上运动,超出边界会
  • 题目链接 ... 类型:思维 分析:找二十六个字母中出现次数最少的,就是答案,每次构造的字符串全部用出现 最少的字符填满,如果存在没出现的字符,那长度显然为0 */ #include #include #include #i
  • HDU 4777 离线树状数组 + 思维 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4777 题意:区间不与其它数字互质的数的个数; 分析:可先求解互质的数的个数 再用区间长度减去即可; 维护数组l[i],r[i] : 第i个位置...
  • 题意:给你n个m长度的小写字符,现求一个字符ans,使得所有的n个字符和ans字符位数不同的字符小于等于1个。 做法:知道是暴力,但是并不是26个字符暴力的枚举,对第一个字符 当作模板 ,每次修改一个字符,修改的...
  • 题目链接 C. Kamal-ol-molk's Painting ...做法:暴力枚举a 和b的长度,然后暴力模拟即可,注意这里的时间复杂度应该是n方到n^3/2之间 代码参考:传送门 #include <bits/stdc++.h>...
  • 跳水板(思维题/DP)

    2020-07-08 23:55:35
    有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。 返回的长度需要从小到大排列。 示例: 输入: shorter = 1...
  • 括号匹配(思维

    2018-09-08 20:26:15
    给定括号长度N,给出一串括号(只包含小括号),计算出最少的交换(两两交换)次数,使整个括号序列匹配。 我们认为一个括号匹配,即对任意一个')',在其左侧都有一个'('与它匹配,且他们形成一一映射关系。 输入...
  • 对于链上点,求链长度+环大小。 显然本题没有固定的算法,纯靠想,思维难度比较大。这里参考洛谷题解高票。 代码 ```#include &lt;cstdio&gt; #include &lt;cstdlib&gt; #include &lt;cstring&...
  • 题目思路:长度越大,很明显越小(因为可以比你大的数字越多),如果长度为1,那就说明你是老大,后面肯定都比你小,所以先根据长度进行排序,如果长度相同就根据序号排序(序号的存在是为了方便这次操作后变回去,...
  • Codeforces 1084E - The Fair Nut and Strings - 思维 题解链接 https://lucien.ink 题目链接 https://codeforces.com/contest/1084/problem/E 题意   给你一个区间 [s,t][s, t][s,t],其中 sss 和 ttt 都是字符...
  • 一眼题 长度为1e5 QAQ 给我们一个数字字符串 操作若干次 每次移除它的子串,留下的数字重新拼接后 用ans累加起来 求最终的ans对1e9+7取模的结果 观察一下吧 , 从低位开始 也就是从右到左 每位可以取到的次数为i*(i-...
  • hdu 2197 本原串 思维

    2017-07-24 10:41:15
    这个题目的话我们可以从反面来考虑,题目要求我们求出本源串,那么非本源串的很好求,而且对于n位的二进制,一共有2^n种,假设当前长度为n,那么那些非本源串,可以拆成长度为x的串组成n,那么这个x一定是n的因子....
  • 看似数学题 (思维)

    2019-09-23 11:27:36
    本文链接:...给一个整数K,你需要找到满足如下条件数组B:1、数组长度也是N;2、数组中每个数字都是不超过K的正整数;3、存在两个正整数X和Y,使得A[i] * X == B[i] * Y 对所有1&...
  • 长度为222的444种情况已经全部出现过,长度为333的888种情况也已经出现过,因此我们一定能够利用长度为222或333的字母去填充,因此答案就是len/2len/2len/2。 #include<iostream> #include<algorithm>...
  • 《算法思维——一种问题驱动的思维方式》之第7篇:数据结构之动态链表篇——使用JavaScript语言实现 在数据结构的学习中,动态链表是动态数据结构的最基本的形式,也是最常见的一种线性数据结构,使用范围广。 在...
  • 题意:给出m个区间,使得每个区间在长度为n的数组内不存在重复的数并使得该数组字典序最小; 分析:开始可能想复杂了许多,可能也是没有屡清思路吧; 由于区间是递增的,显然是可以从左往右进行贪心的; 对于区间不断的...
  • 这样可知p中的数必定是两两配对的(互相映射),如果p的长度为奇数必定会剩余一个数与自己配对,则无法构成matching,故长度必为偶数。 cost中由于i与pi是对称的(如1映射到5时,|a1-a5|与|a5-a1|计算了两次)。所以除2...
  • Codeforces 864 C Bus 思维

    2017-09-26 22:07:00
     题目描述: 输入a, b, f, k , 一段长度为a的路来回走, 中间f的地方有一个加油站, 油罐的容量为b, 问想要走b次这条路至少需要加多少次油   解题思路: 由于K <= 1e4, 所以将每次需要走路的连续序列构造...
  • 模拟可以发现,增加01变换的方式有大致三种,一是在连续相同的字符串(这种子串记为s)内部找子串取反,这种能够增加01变换的s长度要大于等于3,如10001->10101;二是在s与其相邻非s取相应的部分取反,如

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 650
精华内容 260
关键字:

思维链长度