差分
# include <bits/stdc++.h>
using namespace std;
# define ll long long
ll light[ 500005 ] ;
ll cha[ 500005 ] ;
int main ( )
{
int n, q;
cin >> n >> q;
for ( int i = 1 ; i <= n; i++ ) {
cin >> light[ i] ;
cha[ i] = light[ i] - light[ i- 1 ] ;
}
while ( q-- ) {
int l, r, x;
cin >> l >> r >> x;
cha[ l] += x;
cha[ r+ 1 ] -= x;
}
for ( int i = 1 ; i <= n; i++ ) {
cha[ i] = cha[ i] + cha[ i- 1 ] ;
}
return 0 ;
}
最长公共子序列(不连续)
const int maxn= 1e3 + 10 ;
int s1[ maxn] ;
int s2[ maxn] ;
int dp[ maxn] [ maxn] ;
int main ( )
{
int n, m;
cin>> n>> m;
for ( int i= 1 ; i<= n; i++ ) { cin>> s1[ i] ; }
for ( int i= 1 ; i<= m; i++ ) { cin>> s2[ i] ; }
memset ( dp, 0 , sizeof ( dp) ) ;
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 1 ; j<= m; j++ ) {
if ( s1[ i] == s2[ j] ) dp[ i] [ j] = dp[ i- 1 ] [ j- 1 ] + 1 ;
else
dp[ i] [ j] = max ( dp[ i- 1 ] [ j] , dp[ i] [ j- 1 ] ) ;
}
}
printf ( "%d\n" , dp[ n] [ m] ) ;
return 0 ;
}
LIS(最长上升子序列)
for ( int i= 1 ; i<= n; i++ ) {
cin>> a[ i] ;
}
int len= 0 ;
dp[ ++ len] = a[ 1 ] ;
for ( int i= 2 ; i<= n; i++ ) {
if ( dp[ len] < a[ i] ) {
dp[ ++ len] = a[ i] ;
}
else {
int pos= upper_bound ( dp+ 1 , dp+ len+ 1 , a[ i] ) - dp;
dp[ pos] = a[ i] ;
}
}
Floyd
# include <iostream>
# include <string.h>
# include <queue>
# include <algorithm>
using namespace std;
const long long INF= 0x3f3f3f3f3f3f3f ;
long long mp[ 500 ] [ 500 ] ;
int n, m, q;
void init ( ) {
memset ( mp, INF, sizeof ( mp) ) ;
for ( int i= 1 ; i<= n; i++ ) {
mp[ i] [ i] = 0 ;
}
}
void Floyd ( )
{
for ( int k= 1 ; k<= n; k++ ) {
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 1 ; j<= n; j++ ) {
mp[ i] [ j] = min ( mp[ i] [ j] , mp[ i] [ k] + mp[ k] [ j] ) ;
}
}
}
}
int main ( )
{
cin>> n>> m>> q;
init ( ) ;
for ( int i= 1 ; i<= m; i++ ) {
long long u, v, w;
scanf ( "%lld%lld%lld" , & u, & v, & w) ;
if ( mp[ u] [ v] > w)
mp[ u] [ v] = mp[ v] [ u] = w;
}
Floyd ( ) ;
while ( q-- ) {
long long u, v;
cin>> u>> v;
if ( mp[ u] [ v] < INF)
printf ( "%lld\n" , mp[ u] [ v] ) ;
else
printf ( "-1\n" ) ;
}
return 0 ;
}
最小生成树(Kruskal)
# include <cstdio>
# include <iostream>
# include <algorithm>
# define N 100010
using namespace std;
int n, m, ans = 0 , cnt = 0 ;
int head[ N] , fa[ N] ;
struct edge {
int u, v, w;
} e[ N << 1 ] ;
inline int read ( ) {
int s = 0 ;
char ch = getchar ( ) ;
while ( ch < '0' || ch > '9' ) ch = getchar ( ) ;
while ( ch >= '0' && ch <= '9' ) { s = s * 10 + ch - '0' ; ch = getchar ( ) ; }
return s;
}
bool cmp ( edge a, edge b) { return a. w < b. w; }
int find ( int x) {
if ( x != fa[ x] ) fa[ x] = find ( fa[ x] ) ;
return fa[ x] ;
}
void Kruskal ( ) {
sort ( e + 1 , e + m + 1 , cmp) ;
for ( int i = 1 ; i <= n; i++ ) fa[ i] = i;
for ( int i = 1 ; i <= m; i++ ) {
int x = find ( e[ i] . u) , y = find ( e[ i] . v) ;
if ( x == y) continue ;
ans += e[ i] . w;
fa[ x] = y;
if ( ++ cnt == n - 1 ) break ;
}
}
int main ( ) {
n = read ( ) ; m = read ( ) ;
for ( int i = 1 ; i <= m; i++ ) {
int x, y, z;
x = read ( ) ; y = read ( ) ; z = read ( ) ;
e[ i] . u = x; e[ i] . v = y; e[ i] . w = z;
}
Kruskal ( ) ;
printf ( "%d\n" , ans) ;
return 0 ;
}
# include <iostream>
# include <cstdio>
# define inf 0x7fffffff
using namespace std;
int n, m, cnt, head[ 5005 ] ;
struct node { int next, to, w; } e[ 400005 ] ;
void addedge ( int x, int y, int z) { e[ ++ cnt] . to= y, e[ cnt] . w= z, e[ cnt] . next= head[ x] , head[ x] = cnt; }
int flag[ 5005 ] , dist[ 5005 ] ;
void prim ( )
{
for ( int i= 1 ; i<= n; ++ i) dist[ i] = inf; dist[ 1 ] = 0 ;
int ans= 0 ;
for ( int i= 1 ; i<= n; ++ i)
{
int minn= inf, k= - 1 ;
for ( int j= 1 ; j<= n; ++ j)
if ( dist[ j] < minn&& ! flag[ j] ) minn= dist[ j] , k= j;
if ( k== - 1 ) { puts ( "orz" ) ; return ; }
flag[ k] = 1 ; ans+= dist[ k] ;
for ( int j= head[ k] ; j; j= e[ j] . next)
if ( ! flag[ e[ j] . to] && dist[ e[ j] . to] > e[ j] . w) dist[ e[ j] . to] = e[ j] . w;
}
printf ( "%d\n" , ans) ;
}
int main ( )
{
scanf ( "%d%d" , & n, & m) ;
for ( int i= 1 , x, y, z; i<= m; ++ i) scanf ( "%d%d%d" , & x, & y, & z) , addedge ( x, y, z) , addedge ( y, x, z) ;
prim ( ) ;
return 0 ;
}
# include <iostream>
# include <cstdio>
# include <cstring>
# include <queue>
using namespace std;
int cnt, n, m, ans, head[ 5005 ] , dist[ 5005 ] , flag[ 5005 ] ;
struct node { int to, w, next; } e[ 400005 ] ;
void addedge ( int x, int y, int z) { e[ ++ cnt] . to= y; e[ cnt] . w= z; e[ cnt] . next= head[ x] ; head[ x] = cnt; }
typedef pair < int , int > pii;
priority_queue < pii, vector< pii> , greater< pii> > q;
void prim ( )
{
memset ( dist, 0x7f , sizeof ( dist) ) ; dist[ 1 ] = 0 ;
cnt= 0 ;
q. push ( make_pair ( 0 , 1 ) ) ;
while ( ! q. empty ( ) && cnt< n)
{
int d= q. top ( ) . first, u= q. top ( ) . second;
q. pop ( ) ;
if ( flag[ u] ) continue ;
++ cnt; ans+= d; flag[ u] = 1 ;
for ( int i= head[ u] ; i; i= e[ i] . next)
if ( e[ i] . w< dist[ e[ i] . to] ) dist[ e[ i] . to] = e[ i] . w, q. push ( make_pair ( e[ i] . w, e[ i] . to) ) ;
}
}
int main ( )
{
scanf ( "%d%d" , & n, & m) ;
for ( int i= 1 , x, y, z; i<= m; ++ i) scanf ( "%d%d%d" , & x, & y, & z) , addedge ( x, y, z) , addedge ( y, x, z) ;
prim ( ) ;
if ( cnt== n) printf ( "%d\n" , ans) ;
else puts ( "orz" ) ;
}