【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

article/2025/10/13 7:01:31

文章目录

  • 问题引入
  • 介绍莫队算法及其实现过程
  • 时间复杂度
  • 莫队算法适用范围
  • 莫队奇偶优化
  • 普通莫队:小B的询问
  • 树上莫队:SP10707 COT2 - Count on a tree II
  • 回滚莫队:[PA2011]Kangaroos

upd:2021-08-11:重新对博客进行了外观美化修正,以及新增树上莫队
upd:2021-08-19:新增回滚莫队

问题引入

给定一个大小为 N N N的数组,数组中所有元素的大小 ≤ N \le N N。你需要回答 M M M个查询。
每个查询的形式是 L , R L,R L,R。你需要回答在范围 [ L , R ] [L,R] [L,R]中至少重复 2 2 2次的数字的个数


如果按照以往的想法,就会是 O ( n 2 ) O(n^2) O(n2)的暴力枚举

for ( int i = 1;i <= Q;i ++ ) {scanf ( "%d %d", &l, &r );for ( int j = l;j <= r;j ++ ) {count[a[j]] ++;if ( count[a[j]] == 3 )result ++;}}

就算加一些优化,用 l , r l,r l,r采取指针转移,但总归上还是在 [ 1 , n ] [1,n] [1,n]区间内进行移动

最坏多半也是逼近于 O ( n 2 ) O(n^2) O(n2)

void add ( int x ) {count[a[x]] ++;if ( count[a[x]] == 3 )result ++;
}
void removed ( int x ) {count[a[x]] --;if ( count[a[x]] == 2 )result --;
}
for ( int i = 1;i <= m;i ++ ) {scanf ( "%d %d", &l, &r );while ( curl < l )removed ( curl ++ );while ( curl > l )add ( -- curl );while ( curr > r )removed ( curr -- );while ( curr < r )add ( ++ curr );printf ( "%d\n", result );
}

add ​添加该位置的元素到当前集合内,并且更新答案

remove 从当前集合内删除该位置的元素,并更新答案


那么这个时候莫队算法就重磅登场了

在这里插入图片描述

为什么叫做莫队算法呢?

据说算法是由之前的国家队队长莫涛发明的,他的队友平日里称他为莫队,所以称之为莫队算法


介绍莫队算法及其实现过程

莫队算法就是一个离线算法,仅仅调整了处理查询的顺序

实现过程如下:

  • 将给定的输入数组分为 n \sqrt{n} n ​​​​​块。每一块的大小为 n n \frac{n}{\sqrt{n}} n n

    每个 L L L​​​​落入其中的一块,每个 R R R也落入其中的一块

    如果某查询的 L L L​​​落在第 i i i​​块中,则该查询属于第 i i i​块​​

  • 所有的询问首先按照所在块的编号升序排列(所在块的编号是指询问的L属于的块

    如果编号相同,则按R值升序排列

  • 莫队算法将依次处理第 1 1 1块中的查询,然后处理第 2 2 2 . . . ... ...直到最后一块

    有很多的查询属于同一块

e.g.

假设我们有 3 3 3​​个大小为 3 3 3​的块 ( 0 − 2 , 3 − 5 , 6 − 8 ) (0-2,3-5,6-8) (02,35,68) { 0 , 3 } { 1 , 7 } { 2 , 8 } { 7 , 8 } { 4 , 8 } { 4 , 4 } { 1 , 2 } \{0,3\} \{1, 7\} \{2, 8\} \{7, 8\} \{4, 8\} \{4, 4\} \{1, 2\} {0,3}{1,7}{2,8}{7,8}{4,8}{4,4}{1,2}

先根据所在块的编号重新排列它们

  • 1 1 1块: { 0 , 3 } { 1 , 7 } { 2 , 8 } { 1 , 2 } \{0, 3\} \{1, 7\} \{2, 8\} \{1, 2\} {0,3}{1,7}{2,8}{1,2}
  • 2 2 2块: { 4 , 8 } { 4 , 4 } \{4, 8\} \{4, 4\} {4,8}{4,4}
  • 3 3 3​块: { 7 , 8 } \{7, 8\} {7,8}

接下来按照R的值重新排列

  • 第一块: { 1 , 2 } { 0 , 3 } { 1 , 7 } { 2 , 8 } \{1, 2\} \{0, 3\} \{1, 7\} \{2, 8\} {1,2}{0,3}{1,7}{2,8}
  • 第二块: { 4 , 4 } { 4 , 8 } \{4, 4\} \{4, 8\} {4,4}{4,8}
  • 第三块: { 7 , 8 } \{7, 8\} {7,8}

上述过程只是重新排列了查询的顺序
在这里插入图片描述


时间复杂度

我们说了这么多,选用莫队算法无非就是想把时间复杂度给降下来

接下来我们来看看真正莫队的时间复杂度是多少,其实我看了很多博客也是有点懵逼

上面的代码就是起一个铺垫作用,所有查询的复杂性是由 4 4 4个``while`循环决定的

2 2 2​​个while循环可以理解为左指针curl的移动总量

2 2 2​​个 while循环可以理解为右指针curr的移动总量

这两者的和将是总复杂性


先算右指针

对于每个块,查询是递增的顺序排序,所以右指针curr按照递增的顺序移动

在下一个块的开始时,指针可能在最右端,将移动到下一个块中的最小的 R R R

又可以从本块最左端移动到最右端

这意味着对于一个给定的块,右指针移动的量是 O ( n ) O(n) O(n)(curr可以从 1 1 1跑到最后的 n n n

我们有 O ( n ) O(\sqrt{n}) O(n )​块,所以总共是 O ( n n ) O(n\sqrt{n}) O(nn )​​


接下来看看左指针怎样移动

对于每个块,所有查询的左指针落在同一个块中,从一个查询移动到下一个查询左指针会移动

但由于前一个 L L L​与下一个 L L L在同一块中,此移动是 O ( n ) O(\sqrt{n}) O(n )​​​(块的大小)

在每一块中左指针的移动总量是 O ( Q n ) O(Q\sqrt{n}) O(Qn )​​,( Q Q Q是落在那个块的查询的数量)

对于所有的块,总的复杂度为 O ( m ∗ n ) O(m∗\sqrt{n}) O(mn )​​


综上,总复杂度为 O ( ( n + m ) ∗ n ) = O ( n ∗ n ) O((n+m)∗\sqrt{n})=O(n∗\sqrt n) O((n+m)n )=O(nn )

实在无法理解就跳过吧(如果有通俗易懂的解释欢迎评论)

莫队算法适用范围

首先莫队算法是一个离线算法,所以如果问题是在线操作带修或者强制特殊的顺序

莫队就失去了它的效应
在这里插入图片描述


其次一个重要的限制性:addremove的操作

当有些题目的addremove耗时很大, O ( N ) O(\sqrt N) O(N )​​​​时就应该思考能否卡过

因为莫队本身就是一种优美的暴力而已

但是还是有很大一部分区间查询的题可以由莫队进行完成

莫队奇偶优化

sqt = sqrt( n )
bool cmp( node x, node y ) {return ( x.l / sqt == y.l / sqt ) ? ( ( ( x.l / sqt ) & 1 ) ? x.r < y.r : x.r > y.r ) : x.l < y.l;
}

在这里插入图片描述

普通莫队:小B的询问

小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,
每个询问给定一个区间[L…R],求Sigma(c(i)^2)的值,
其中i的值从1到K,其中c(i)表示数字i在[L…R]中的重复次数。
小B请你帮助他回答询问。

输入格式
第一行,三个整数N、M、K。
第二行,N个整数,表示小B的序列。
接下来的M行,每行两个整数L、R。
输出格式
M行,每行一个整数,其中第i行的整数表示第i个询问的答案。

输入输出样例
输入
6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6
输出
6
9
5
2
说明/提示
对于全部的数据,1<=N、M、K<=50000

简单题解

说了是算法模板入门题,肯定不会把你拒之门外,还是要让你摸摸门的

这个题就是要简单处理一下 ∑ c i 2 ∑c_i^2 ci2​,当 c i ± 1 c_i±1 ci±1​时,答案会发生怎样的转化?

完全平方公式大家都会吧!!!👇

( c [ i ] − 1 ) 2 = c [ i ] 2 − 2 ∗ c [ i ] + 1 (c[i]-1)^2=c[i]^2-2*c[i]+1 (c[i]1)2=c[i]22c[i]+1

( c [ i ] + 1 ) 2 = c [ i ] 2 + 2 ∗ c [ i ] + 1 (c[i]+1)^2=c[i]^2+2*c[i]+1 (c[i]+1)2=c[i]2+2c[i]+1

#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define LL l;ong long
#define MAXN 50005
struct node {int l, r, num;
}G[MAXN];
int n, m, k, apart, curl = 1, curr; 
int a[MAXN], cnt[MAXN];
LL result;
LL ans[MAXN];bool cmp ( node x, node y ) {return ( x.l / apart == y.l / apart ) ? x.r < y.r : x.l < y.l;
}void add ( int x ) {result += ( cnt[a[x]] << 1 ) + 1;cnt[a[x]] ++;
}
void removed ( int x ) {result -= ( cnt[a[x]] << 1 ) - 1;cnt[a[x]] --;
}int main() {scanf ( "%d %d %d", &n, &m, &k );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &a[i] );apart = sqrt ( n );for ( int i = 1;i <= m;i ++ ) {scanf ( "%d %d", &G[i].l, &G[i].r );G[i].num = i;}sort ( G + 1, G + m + 1, cmp );for ( int i = 1;i <= m;i ++ ) {int l = G[i].l, r = G[i].r;while ( curl < l ) {removed ( curl ++ );}while ( curl > l ) {add ( -- curl );}while ( curr > r ) {removed ( curr -- );}while ( curr < r ) {add ( ++ curr );}ans[G[i].num] = result;}for ( int i = 1;i <= m;i ++ )printf ( "%lld\n", ans[i] );return 0;
}

树上莫队:SP10707 COT2 - Count on a tree II

顾名思义就是把序列莫队搬到树上实现

分块的大小以及移动的操作与序列莫队无差别

唯一的区别就在于询问的l,r

在树上莫队询问的 l , r l,r l,r​要用欧拉序进行重新编号

e.g.

fasdfa

原图的欧拉序为1,2,4,6,6,7,7,5,5,4,2,3,3,1,对于点 i i i l i : l_i: li: 第一次访问 i i i r i : r_i: ri: 最后一次访问 i i i

树上莫队就是用欧拉序的 l i , r i l_i,r_i li,ri代替访问的 i i i

对于查询的(u,v)有两种情况

  • 是直系祖先关系(假设 u u u v v v的祖先)

    e.g. : u = 2 , v = 7 u=2,v=7 u=2,v=7​​,拿出 [ l u , l v ] [l_u,l_v] [lu,lv]​代替 u , v u,v u,v

    欧拉序为2,4,6,6,7

  • 不隶属同一棵子树(假设 l u < l v l_u<l_v lu<lv

    e.g : u = 7 , v = 3 u=7,v=3 u=7,v=3​,拿出 [ r u , l v ] [r_u,l_v] [ru,lv]

    欧拉序为7,5,5,4,2,3

不在路径上的点经过了恰好两次,真正在路径上的点都恰好只出现一次;对于不同子树的两点需要额外加上lca

source

#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 40005
#define maxm 100005
vector < int > G[maxn];
int n, Q, B, cnt, ans;
bool vis[maxn];
int c[maxn], MS[maxn], tot[maxn], ret[maxm];
int dep[maxn], l[maxn], r[maxn], id[maxn << 1];
int f[maxn][20];
struct node {int l, r, id, lca;
}q[maxm];void dfs( int u, int fa ) {dep[u] = dep[fa] + 1, l[u] = ++ cnt, id[cnt] = u;for( int i = 1;i <= 16;i ++ )f[u][i] = f[f[u][i - 1]][i - 1];for( auto v : G[u] ) {if( v == fa ) continue;else f[v][0] = u, dfs( v, u );}r[u] = ++ cnt, id[cnt] = u;
}int get_lca( int u, int v ) {if( dep[u] < dep[v] ) swap( u, v );for( int i = 16;~ i;i -- )if( dep[f[u][i]] >= dep[v] ) u = f[u][i];if( u == v ) return u;for( int i = 16;~ i;i -- )if( f[u][i] != f[v][i] ) u = f[u][i], v = f[v][i];return f[u][0];
}void Delete( int x ) { if( -- tot[c[x]] == 0 ) ans --; }void Insert( int x ) { if( ++ tot[c[x]] == 1 ) ans ++; }void modify( int x ) { vis[x] ? Delete( x ) : Insert( x ); vis[x] ^= 1; }int main() {scanf( "%d %d", &n, &Q );for( int i = 1;i <= n;i ++ )scanf( "%d", &c[i] ), MS[i] = c[i];sort( MS + 1, MS + n + 1 );int m = unique( MS + 1, MS + n + 1 ) - MS - 1;for( int i = 1;i <= n;i ++ )c[i] = lower_bound( MS + 1, MS + m + 1, c[i] ) - MS;B = sqrt( n );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs( 1, 0 );for( int i = 1, u, v;i <= Q;i ++ ) {scanf( "%d %d", &u, &v );q[i].id = i;if( l[u] > l[v] ) swap( u, v );int lca = get_lca( u, v );if( u == lca ) q[i].l = l[u], q[i].r = l[v], q[i].lca = 0;else q[i].l = r[u], q[i].r = l[v], q[i].lca = lca;}sort( q + 1, q + Q + 1, []( node x, node y ) { return ( x.l / B == y.l / B ) ? ( x.r < y.r ) : ( x.l < y.l ); } );int curl = 1, curr = 0;for( int i = 1;i <= Q;i ++ ) {while( curl < q[i].l ) modify( id[curl ++] );while( q[i].l < curl ) modify( id[-- curl] );while( curr < q[i].r ) modify( id[++ curr] );while( q[i].r < curr ) modify( id[curr --] );if( q[i].lca ) modify( q[i].lca );ret[q[i].id] = ans;if( q[i].lca ) modify( q[i].lca );}for( int i = 1;i <= Q;i ++ )printf( "%d\n", ret[i] );
}

回滚莫队:[PA2011]Kangaroos

普通莫队是能做到快速增添和删减操作的

但有些题目在区间转移时,可能会出现增加或者删除无法实现的问题

在只有增加不可实现或者只有删除不可实现的时候,就可以使用回滚莫队

同样在 O ( n n ) O(n\sqrt n) O(nn )的时间内解决问题

回滚莫队的核心思想就是既然只能实现一个操作,那么就只使用一个操作,剩下的交给回滚解决

回滚莫队分为只使用增加操作的回滚莫队和只使用删除操作的回滚莫队

以只使用添加操作的回滚莫队为例

  • 首先仍是按照区间左端点分块排序,然后右端点为第二关键字
  • 枚举区间左端点的块
    • 对于询问的左右端点都在同一区间的直接暴力做
    • 将左端点都在该块的按右端点升序排序
    • 每次都是右端点右移,加入答案
    • 左端点每次都回滚到这个块的末尾,然后暴力的往前移到本次询问的左端点处,记录这一路上的答案,但是不像右端点一样是永久的
      再回退到块末尾,这样的时间复杂度, m m m个询问,每次询问左端点最多暴力移整个区间 n \sqrt n n ,还是根号级别的复杂度
  • 到下一块的时候, l , r l,r l,r一起遍历了整个区间,扔掉所有的标记那些,然后手动重置为初始局面

只支持删除的话,我想应该就是右端点 r r r递减,不断前移,然后还是左端点 l l l在块中反复移动清空

可以看一下这道题 → \rightarrow 回滚莫队的例题——历史研究

Kangaroos比较难一点

区间过大,实际上区间相交只关系左右端点的大小关系,所以先离散化区间的端点,最多只有 2 n 2n 2n

然后按询问左端点分块,将询问挂到块上

接下来就是回滚莫队问题了

这道题主要是要维护最大连续区间

每次将新增区间的下标扔进去的时候,更新

可以用线段树维护最大连续区间,但是实际上可以用 l [ ] , r [ ] \rm l[],r[] l[],r[]数组来维护左右端点,省去 l o g \rm log log

这只是简单口胡,看不懂可以看代码,代码里有详细注释

#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 200005
#define maxB 320
struct node {int l, r, id;node(){}node( int L, int R, int ID ) {l = L, r = R, id = ID;}
}t[maxn];
struct Node {int val, id;Node(){}Node( int Val, int ID ) {val = Val, id = ID;}
}x[maxn];
vector < node > q[maxB];
int n, m, ans, top;
int block[maxn], L[maxB], R[maxB], l[maxn], r[maxn], ret[maxn];bool operator < ( Node s, Node t ) {return s.val == t.val ? s.id < t.id : s.val < t.val;
}struct opt {//记录操作前的相关信息 方便回滚 //flag 0:左 1:右 记录被更改的是哪边 int flag, pos, lst, ans;opt(){}opt( int  Flag, int Pos, int Lst, int Ans ) {flag = Flag, pos = Pos, lst = Lst, ans = Ans;}
}s[maxn << 4];
//l[i]:在当前已加入区间中i区间所能连的最左边区间下标 -> [l(i),i]的所有区间都与当前查询区间有交 
//r[i]:在当前已加入区间中i区间所能连的最右边区间下标 -> [i,r(i)]的所有区间都与当前查询区间有交 
void add( int i ) {if( l[i] || r[i] ) return;//已经算过了i的贡献 if( ! l[i - 1] and ! r[i + 1] ) {//左右的区间都还没有被加进来//只能自己这一个区间 长度为1 s[++ top] = opt( 0, i, l[i], ans );s[++ top] = opt( 1, i, r[i], ans );l[i] = r[i] = i, ans = max( ans, 1 );}else if( ! l[i - 1] ) {//i+1的区间被加入了 可以往左延伸和i接上 s[++ top] = opt( 0, r[i + 1], l[r[i + 1]], ans );s[++ top] = opt( 1, i, r[i], ans );r[i] = r[i + 1], l[r[i + 1]] = i;ans = max( ans, r[i] - i + 1 );}else if( ! r[i + 1] ) {//i-1的区间被加入了 可以往右延伸和i接上 s[++ top] = opt( 1, l[i - 1], r[l[i - 1]], ans );s[++ top] = opt( 0, i, l[i], ans );l[i] = l[i - 1], r[l[i - 1]] = i;ans = max( ans, i - l[i] + 1 );}else {//i-1 i+1都被加入 直接左右连接拼起来 s[++ top] = opt( 0, r[i + 1], l[r[i + 1]], ans );s[++ top] = opt( 1, l[i - 1], r[l[i - 1]], ans );s[++ top] = opt( 0, i, l[i], ans );s[++ top] = opt( 1, i, r[i], ans );//都连起来了 也没有i什么事了 所以随便记录i的一边l/r有值 下次就可以在第一个if语句直接return l[r[i + 1]] = l[i - 1], r[l[i - 1]] = r[i + 1], l[i] = r[i] = i;ans = max( ans, r[i + 1] - l[i - 1] + 1 );		}
}void remove( int lst ) {while( top > lst ) {if( ! s[top].flag ) l[s[top].pos] = s[top].lst;else r[s[top].pos] = s[top].lst;ans = s[top --].ans; }
}void solve( int id ) {remove( 0 );//移动到新块 莫队里的东西清空 for( int i = 1;i <= n;i ++ ) if( t[i].l < L[id] && R[id] < t[i].r )//完全覆盖该块且不在块内的区间一定会对块内所挂询问产生贡献 add( t[i].id );sort( q[id].begin(), q[id].end(), []( node x, node y ) { return x.r < y.r; } );//将块内询问按照右端点排序 只增加的回滚莫队 int lst = top;for( node now : q[id] ) //计算整个区间都在块内的询问的答案if( now.r > R[id] ) continue;else {for( int i = L[id];i <= R[id];i ++ )if( now.l <= t[x[i].id].r && t[x[i].id].l <= now.r )//与查询区间有交 可能会为答案贡献的区间 add( x[i].id );ret[now.id] = ans;remove( lst ); }remove( 0 );int cur = R[id];//处理r在其他块递增的询问 先把指针拨到块的最后for( int i = 1;i <= n;i ++ )if( t[i].l <= R[id] && R[id] <= t[i].r )//一定会与后面的查询有交点 R[id]add( t[i].id );for( node now : q[id] )if( now.r <= R[id] ) continue;else {while( cur < now.r ) add( x[++ cur].id );lst = top;for( int i = R[id];i >= now.l;i -- )//回滚莫队 滚到当前询问的左端 add( x[i].id );ret[now.id] = ans;remove( lst );//返回 回滚 抵消 }
}int main() {scanf( "%d %d", &n, &m );for( int i = 1, l, r;i <= n;i ++ ) {scanf( "%d %d", &l, &r );x[i] = Node( l, i );x[i + n] = Node( r, i );t[i] = node( l, r, i );}//为了块的大小能开出来 1e9首先要离散化 sort( x + 1, x + ( n << 1 ) + 1 );for( int i = 1;i <= n;i ++ ) {t[i].l = lower_bound( x + 1, x + ( n << 1 | 1 ), Node( t[i].l, 0 ) ) - x;t[i].r = upper_bound( x + 1, x + ( n << 1 | 1 ), Node( t[i].r, 1e9 ) ) - x - 1;}int N = n << 1;int B = sqrt( N );for( int i = 1;i <= N;i ++ )block[i] = ( i - 1 ) / B + 1;//L,R 记录块的左右端点 for( int i = N;i;i -- ) L[block[i]] = i;for( int i = 1;i <= N;i ++ ) R[block[i]] = i;for( int i = 1, l, r;i <= m;i ++ ) {scanf( "%d %d", &l, &r );l = lower_bound( x + 1, x + ( n << 1 | 1 ), Node( l, 0 ) ) - x;r = upper_bound( x + 1, x + ( n << 1 | 1 ), Node( r, 1e9 ) ) - x - 1;q[block[l]].push_back( node( l, r, i ) );}for( int i = 1;i <= block[N];i ++ )if( ! q[i].empty() )solve( i );for( int i = 1;i <= m;i ++ )printf( "%d\n", ret[i] );return 0;
}

http://chatgpt.dhexx.cn/article/XBGNILZ6.shtml

相关文章

超全的莫队算法一遍过

前置知识&#xff1a;双指针、分块 简单概括而言&#xff0c;莫队是一个离线算法&#xff0c;核心思想是将所有的询问按照分块进行排序后&#xff0c;对于每个询问可以通过双指针增删数据来达到总体的复杂度。 莫队通常用来解决求一段区间内不同数的个数相关的问题。 目录 1、…

莫队(普通操作)C++

由于&R闲着无聊&#xff0c;今天上午学习的莫队也并不是完全掌握&#xff0c;老师才发的PPT也没有保存&#xff0c;于是决定乱写一篇靠着自己的理解写一篇关于莫队用法的博客......如果有错的麻烦之处&#xff0c;纯属&R自己理解有问题哈。 一.莫队的含义 莫队是在一…

【算法笔记】莫队算法(基础莫队,带修莫队,回滚莫队,树上莫队,二次离线莫队)

整理的算法模板合集&#xff1a; ACM模板 目录 1. 基础莫队2. 带修莫队3. 回滚莫队4. 树上莫队5. 二次离线莫队6. 在线莫队 来这里学习莫队以及神奇的证明&#xff1a;莫队算法 --算法竞赛专题解析&#xff08;26&#xff09; 我们首先考虑双指针的暴力法&#xff0c;发现很容…

linux(vscode)配置coderunner for python3

1.Python3 安装路径查看 which python3 2.vscode扩展中安装coderunner 3.配置coderunner 管理->设置->扩展->coderunner,找到下图所示内容&#xff0c;选择在settings.json中编辑。 在文件中输入code-runner.executorMap&#xff0c;会自动补全代码&#xff0c;如…

问题解决:VSCode Code Runner输出中文乱码

用vscode code runner插件经常会出现输出中文乱码的问题 那么如何解决这个问题呢&#xff1f; 解决方法&#xff1a; 通过设置&#xff0c;可以把代码放到 VS Code 内置的 Terminal 来运行&#xff0c;那么问题就能迎刃而解了。 选择 文件 -> 首选项 -> 设置&#xff0c…

VSCode——使用CodeRunner开发python输出中文出现乱码的解决方法

目录 方法一&#xff1a;每次都要加 方法二&#xff1a;一劳永逸 方法一 在程序中加入如下代码强行控制输出格式为utf-8即可 # -*- coding: utf-8 -*- import sys import io sys.stdoutio.TextIOWrapper(sys.stdout.buffer,encodingutf8)#改变默认输出的标准编码 编码改变…

修改CodeRunner快捷键

默认运行是 alt ctrl N, 改为alt ctrl r. run改更合理。 停止改为alt ctrl s stop也更合理&#x1f43b;

vscode用CodeRunner运行C++文件,提示系统找不到路径

问题描述 如图&#xff0c;直接点运行出现如下提示&#xff1a; 但是分开执行还是正常的&#xff1a; 原因 cmd执行多条语句要使用" && “作为连接符&#xff0c;对应的powerShell要用” ; "。 解决 在用户设置中修改code-runner.executorMap中对应的值…

vscode_Code Runner(codeRunner)配置(自定义输入映射内容)/指定.c/.cpp编译选型/编译运行含有中文名的文件示例(最佳实践)

文章目录 声明:文件(目录)中包含中文的问题关于配置调试功能(推荐) 找到配置入口点击在setting.json中编辑可以指定各种语言的命令行映射,这里以c语言指定以c99编译修改为例.可见到,届时编译.c文件的时候就会是以C99的标准指定编译. 运行效果 声明:文件(目录)中包含中文的问题 …

用VSCode 编写C++ 引入自定义头文件容易犯的错 和CodeRunner配置

问题描述 undefined reference to log(char const*) collect2.exe: error: ld returned 1 exit status 原因分析&#xff1a; 一般是由于c编译时&#xff0c;.cpp源文件未找到引起的 解决方案&#xff1a; 1.正确操作 一.例如你一个文件下有一个.h的文件和一个.cpp的文件 在v…

VSCode用Code Runner编译运行c/c++

首先vscode需要在文件夹下打开&#xff0c;以下所有的文件都需要放到你编写程序文件夹下的.vscode文件夹里 平时可以右击文件夹&#xff0c;选择open with code&#xff0c;结构应该是这样的 配置CodeRunner 下载 左下角齿轮找到设置 在扩展中找到Run Code configuration,点击…

【Mac】VScode配置Python开发环境详细教程(报错解决Import Error No module named ) CodeRunner插件

文章目录 在VScode中安装python插件解决报错SyntaxError: Non-ASCII character \xef in file解决报错"No module named xxx "VScode上使用Jupyter Notebook的方法20.02.26 最新方法&#xff1a;Code Runner插件一键安装&#xff08;python、java、C&#xff09;终端目…

CodeRunner插件:自定义编译参数

在设置里找到Coderunner选项&#xff0c;然后找到executorMap 点击 在 settings.json 中编辑 &#xff0c;你将看到对不同语言的编译指令。 以下为本人设置&#xff0c;为Mac系统&#xff0c;指令有所不同&#xff0c;不过操作流程是一样的。 "code-runner.executorMap…

java扩展包_CodeRunner 的 Java 扩展 Jar 包支持

CodeRunner 介绍 CodeRunner 是 Mac 上一款功能强大但使用简单代码工具&#xff0c;官方介绍支持几乎所有语言(20种语言)&#xff0c;同时支持语法高亮、代码提示和多种界面主题&#xff0c;在学习新的语言或编写简单测试代码时非常实用。 我常常用它来管理一些代码片段和测试不…

vscode 中 coderunner无法运行dart程序

如果你的vscode使用了CodeRunner&#xff0c;运行dart文件出错找不到dart的情况下: /bin/sh: dart: command not found可以直接修改coderunner扩展配置信息, 将其路径改为你希望的位置

vscode使用codeRunner将c/c++程序运行到外部控制台窗口

需要先关闭codeRunner的Run in Terminal 只需要在codeRunner的setting中&#xff0c;在从c/c的设置命令中添加 start cmd /c //或者/k /** 如果添加的是/c&#xff0c;则需要在程序的末尾添加system("pause"),不然会一闪而过&#xff0c; /k则不需要&#xff0c;不…

CodeRunner破解

CodeRunner2是Mac系统下的一款编程软件&#xff0c;支持23种语言和.txt文档制作&#xff0c;比Xcode都强大&#xff0c;Xcode只支持4种语言&#xff0c;原来的破解补丁有联网验证的问题&#xff0c;现在我做了程序防止联网验证。 破解方法&#xff1a;先下载CodeRunner2&#x…

windows系统VS code coderunner 运行shell脚本

无需设置环境变量&#xff0c;即可运行。 shell脚本第一行不要指定shell&#xff0c;什么“#!/bin/bash"不要写&#xff0c;这个会覆盖掉coderunner的设置。 在vs code设置中搜索“Code-runner: Executor Map” 点击“在setting.json中编辑” 修改shellscript后面引号里…

macOS使用CodeRunner快速配置fortran环境

个人网站:xzajyjs.cn 由于一些项目的缘故&#xff0c;需要有fortran的需求&#xff0c;但由于是M1 mac的缘故&#xff0c;不能像windows那样直接使用vsivf这种经典配置。搜了一下网上主流的跨平台方案&#xff0c;主要是gfortran&#xff0c;最近用Coderunner&#xff08;主要…

coderunner运行c语言提示错误,vscode安装及使用coderunner运行C程序教程

vscode简介 ​ vscode 全称 visual studio code&#xff0c;是一个运行于 OS X&#xff0c;Windows 和 Linux 之上的&#xff0c;针对于编写现代web和云应用的跨平台编辑器。除了上述提到的&#xff0c;它在c/c的编写上也有非常优秀的表现&#xff0c;并且有着十分友好的快捷键…