入口
1001 张煊的金箍棒(2)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod= 1e9 + 7 ;
const int M= 5e6 ;
const int N= 1e6 + 5 ;
struct node
{
int add, l, r, sum;
} t[ N] ;
int n, m;
void spread ( int p)
{
if ( t[ p] . add)
{
t[ ls ( p) ] . add= t[ rs ( p) ] . add= t[ p] . add;
t[ ls ( p) ] . sum= t[ p] . add* ( t[ ls ( p) ] . r- t[ ls ( p) ] . l+ 1 ) ;
t[ rs ( p) ] . sum= t[ p] . add* ( t[ rs ( p) ] . r- t[ rs ( p) ] . l+ 1 ) ;
t[ p] . add= 0 ;
}
}
void bulid ( int p, int l, int r)
{
t[ p] . l= l, t[ p] . r= r;
if ( l== r)
{
t[ p] . add= 0 ;
t[ p] . sum= 1 ;
return ;
}
int mid= ( l+ r) >> 1 ;
bulid ( ls ( p) , l, mid) ;
bulid ( rs ( p) , mid+ 1 , r) ;
t[ p] . sum= t[ ls ( p) ] . sum+ t[ rs ( p) ] . sum;
t[ p] . add= 0 ;
}
void update ( int p, int l, int r, int d)
{
if ( l<= t[ p] . l&& t[ p] . r<= r)
{
t[ p] . sum= ( t[ p] . r- t[ p] . l+ 1 ) * d;
t[ p] . add= d;
return ;
}
spread ( p) ;
int mid= ( t[ p] . l+ t[ p] . r) >> 1 ;
if ( l<= mid) update ( ls ( p) , l, r, d) ;
if ( mid< r) update ( rs ( p) , l, r, d) ;
t[ p] . sum= t[ ls ( p) ] . sum+ t[ rs ( p) ] . sum;
}
int ask ( int p, int l, int r)
{
if ( l<= t[ p] . l&& t[ p] . r<= r) return t[ p] . sum;
spread ( p) ;
int mid= ( t[ p] . l+ t[ p] . r) >> 1 ;
int ans= 0 ;
if ( l<= mid) ans+ = ask ( ls ( p) , l, r) ;
if ( mid< r) ans+ = ask ( rs ( p) , l, r) ;
return ans;
}
void solve ( )
{
cin>> n>> m;
bulid ( 1 , 1 , n) ;
while ( m-- )
{
int x, y, z;
scanf ( "%lld%lld%lld" , & x, & y, & z) ;
update ( 1 , x, y, z) ;
}
cout<< ask ( 1 , 1 , n) ;
}
signed main ( )
{
int T= 1 ;
cin>> T;
for ( int index= 1 ; index<= T; index++ )
{
solve ( ) ;
puts ( "" ) ;
}
return 0 ;
}
1002 I Hate It
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod= 1e9 + 7 ;
const int M= 5e6 ;
const int N= 1e6 + 5 ;
int n, m;
int tree[ N] ;
void bulid ( )
{
for ( m= 1 ; m<= n+ 1 ; m<<= 1 ) ;
for ( int i= m+ 1 ; i<= m+ n; i++ ) scanf ( "%lld" , & tree[ i] ) ;
for ( int i= m- 1 ; i; i-- ) tree[ i] = max ( tree[ ls ( i) ] , tree[ rs ( i) ] ) ;
}
void change ( int pos, int x)
{
pos+ = m;
tree[ pos] = x;
pos>>= 1 ;
for ( ; pos; pos>>= 1 ) tree[ pos] = max ( tree[ ls ( pos) ] , tree[ rs ( pos) ] ) ;
}
int ask ( int l, int r)
{
int ans= - 1e12 ;
for ( l= l+ m- 1 , r= r+ m+ 1 ; l^ r^ 1 ; l>>= 1 , r>>= 1 )
{
if ( ~ l& 1 ) ans= max ( ans, tree[ l^ 1 ] ) ;
if ( r& 1 ) ans= max ( ans, tree[ r^ 1 ] ) ;
}
return ans;
}
void solve ( )
{
int k;
while ( cin>> n>> k)
{
memset ( tree, 0 , sizeof ( tree) ) ;
bulid ( ) ;
int x, y;
char op[ 5 ] ;
while ( k-- )
{
scanf ( "%s%lld%lld" , op, & x, & y) ;
if ( op[ 0 ] == 'U' ) change ( x, y) ;
else printf ( "%lld\n" , ask ( x, y) ) ;
}
}
}
signed main ( )
{
int T= 1 ;
for ( int index= 1 ; index<= T; index++ )
{
solve ( ) ;
}
return 0 ;
}
1003 LCIS
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define eps 1e-8
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
using namespace std;
const int mod= 1e9 + 7 ;
const int M= 5e6 + 5 ;
const int N= 1e6 + 5 ;
int ll[ N] , rr[ N] ;
int a[ N] , sum[ N] ;
int n, m;
int t;
void push ( int p, int l, int r)
{
ll[ p] = ll[ ls ( p) ] ;
rr[ p] = rr[ rs ( p) ] ;
a[ p] = max ( a[ ls ( p) ] , a[ rs ( p) ] ) ;
int mid= ( l+ r) >> 1 ;
if ( sum[ mid] < sum[ mid+ 1 ] )
{
if ( ll[ ls ( p) ] == mid- l+ 1 ) ll[ p] + = ll[ rs ( p) ] ;
if ( rr[ rs ( p) ] == r- mid) rr[ p] + = rr[ ls ( p) ] ;
a[ p] = max ( a[ p] , rr[ ls ( p) ] + ll[ rs ( p) ] ) ;
}
}
void update ( int x, int c, int l, int r, int p)
{
if ( l== r)
{
sum[ x] = c;
return ;
}
int mid= ( l+ r) >> 1 ;
if ( x<= mid) update ( x, c, l, mid, ls ( p) ) ;
else update ( x, c, mid+ 1 , r, rs ( p) ) ;
push ( p, l, r) ;
}
int query ( int x, int y, int l, int r, int p)
{
if ( l>= x&& r<= y) return a[ p] ;
int mid= ( l+ r) >> 1 , ans= - 1e9 ;
if ( x<= mid) ans= max ( ans, query ( x, y, l, mid, ls ( p) ) ) ;
if ( y> mid) ans= max ( ans, query ( x, y, mid+ 1 , r, rs ( p) ) ) ;
if ( sum[ mid] < sum[ mid+ 1 ] && x<= mid&& y> mid) ans= max ( ans, min ( mid- x+ 1 , rr[ ls ( p) ] ) + min ( y- mid, ll[ rs ( p) ] ) ) ;
return ans;
}
void build ( int p, int l, int r)
{
if ( l== r)
{
ll[ p] = rr[ p] = a[ p] = 1 ;
return ;
}
int mid= ( l+ r) >> 1 ;
build ( ls ( p) , l, mid) ;
build ( rs ( p) , mid+ 1 , r) ;
push ( p, l, r) ;
}
void solve ( )
{
memset ( a, 0 , sizeof ( a) ) ;
memset ( ll, 0 , sizeof ( ll) ) ;
memset ( rr, 0 , sizeof ( rr) ) ;
scanf ( "%d%d" , & n, & m) ;
for ( int i= 1 ; i<= n; i++ ) scanf ( "%d" , & sum[ i] ) ;
build ( 1 , 1 , n) ;
while ( m-- )
{
int x, y;
char op[ 10 ] ;
scanf ( "%s%d%d" , op, & x, & y) ;
if ( op[ 0 ] == 'U' ) update ( x+ 1 , y, 1 , n, 1 ) ;
else
{
int ans= query ( x+ 1 , y+ 1 , 1 , n, 1 ) ;
printf ( "%d\n" , ans) ;
}
}
}
signed main ( )
{
int T= 1 ;
cin>> T;
while ( T-- ) solve ( ) ;
return 0 ;
}