http://codeforces.com/contest/899
http://codeforces.com/contest/899/problem/A
题意:
给出一串数字,只有1 和 2 ,然后三人一组才能比赛。之后 是 ,两个人的必须全部参赛
题解:
按照题意模拟即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn];
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
std::sort(a,a+n);
int ans=0;
int l=n-1;
for(int i=0;i<=l;i++)
{
if(a[i]+a[l]==3)
{
l--;
ans++;
}
else if(a[i]==1&&a[i+1]==1&&a[l]==1&&i+1<l)
{
i++;
l--;
ans++;
}
else break;
}
cout<<ans<<endl;
}
}
http://codeforces.com/contest/899/problem/B
#include <bits/stdc++.h>
using namespace std;
int a[13]={31,28,31,30,31,30,31,31,30,31,30,31};
int b[13]={31,29,31,30,31,30,31,31,30,31,30,31};
int d[26];
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>d[i];
}
int p=0,ans=0;
for(int i=0;i<12;i++)
{
ans=0;
for(int j=0;j<n;j++)
{
if(d[j]==29) ans++;
if(ans==2)
{
cout<<"No"<<endl;
return 0;
}
if(a[(i+j)%12]!=d[j]&&b[(i+j)%12]!=d[j]) break;
else if(j==n-1) p=1;
}
}
if(p) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
https://codeforces.com/contest/899/problem/F
题意:给出一串字符串,只有大小写和数字的字符串。
然后每次输入l r c ,把l区间到r区间的c字符删除掉。
最后输出字符。
题解:
线段树造62个线段树,一个字符一颗,另外一颗线段树标记前缀里面多少字符被删除了,以此确定剩下的准确位置。
之后代码略长。
输出的时候标记下输出,否则超时。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int tree[66][maxn * 4], tag[maxn * 4], zimu[maxn];
char str[200005];
int n, m;
void builds ( int l, int r, int t )
{
if ( l == r )
{
tag[t] = 1;
return ;
}
int mid = ( l + r ) / 2;
builds ( l, mid, t * 2 );
builds ( mid + 1, r, t * 2 + 1 ) ;
tag[t] = tag[t * 2] + tag[t * 2 + 1] ;
}
void updatetag ( int l, int r, int t, int v )
{
if ( l == r )
{
tag[t] = 0;
zimu[l] = 1;
return ;
}
int mid = ( l + r ) / 2;
if ( v <= mid )
updatetag ( l, mid, t * 2, v );
else
updatetag ( mid + 1, r, t * 2 + 1, v );
tag[t] = tag[t * 2] + tag[t * 2 + 1];
}
int tagsum ( int l, int r, int left, int right, int t )
{
if ( left > right )
return 0;
if ( l == left && r == right )
{
return tag[t];
}
int mid = ( l + r ) / 2;
int x = 0, y = 0;
x = tagsum ( l, mid, max ( l, left ), min ( mid, right ), t * 2 );
y = tagsum ( mid + 1, r, max ( l, mid + 1 ), min ( r, right ), t * 2 + 1 ) ;
return x + y;
}
void build ( int l, int r, int t, int tre[], char c )
{
if ( l == r )
{
if ( c == str[l] )
{
// cout<<c<<' '<<l<<endl;
tre[t] = 1;
}
return ;
}
int mid = ( l + r ) / 2;
build ( l, mid, t * 2, tre, c );
build ( mid + 1, r, t * 2 + 1, tre, c );
tre[t] = tre[t * 2] + tre[t * 2 + 1 ] ;
}
void change_s ( int l, int r, int t, int ttree[] )
{
if ( l == r )
{
updatetag ( 1, n, 1, l );
// cout<<"dddddddddddddd "<<l<<' '<<r<<' '<<t<<' '<<str[l]<<' '<<ttree[t]<<endl;
ttree[t] = 0;
return ;
}
ttree[t] = 0;
int mid = ( l + r ) / 2;
if ( ttree[t * 2] != 0 )
change_s ( l, mid, t * 2, ttree );
if ( ttree[t * 2 + 1] != 0 )
change_s ( mid + 1, r, t * 2 + 1, ttree ) ;
}
int update ( int l, int r, int left, int right, int t, int ttree[], int p )
{
//if(p) cout<<l<<' '<<r<<' '<<left<<' '<<right<<endl;
if ( left > right )
return 0;
if ( l == left && right == r )
{
if ( p && ttree[t] )
{
change_s ( l, r, t, ttree );
}
return ttree[t];
}
int mid = ( l + r ) / 2;
int x = 0, y = 0 ;
x = update ( l, mid, max ( left, l ), min ( right, mid ), t * 2, ttree, p );
y = update ( mid + 1, r, max ( left, mid + 1 ), min ( right, r ), t * 2 + 1, ttree, p ) ;
ttree[t] = ttree[t * 2] + ttree[t * 2 + 1];
return x + y;
}
int tage[66];
int findlr ( int x )
{
int l = 1, r = n, tt = n;
while ( l < r + 1 )
{
int mid = ( l + r ) / 2;
int sum = tagsum ( 1, n, 1, mid, 1 ) ;
// cout<<"asd "<<mid<<' '<<sum<<endl;
if ( sum < x )
l = mid + 1;
else if ( sum >= x )
r = mid - 1;
}
return r + 1;
}
int findr ( int x )
{
int l = 1, r = n, tt = n;
while ( l <= r )
{
int mid = ( l + r ) / 2;
int sum = tagsum ( 1, n, 1, mid, 1 ) ;
if ( sum <= x )
l = mid + 1;
else if ( sum >= x )
r = mid - 1, tt = min ( tt, mid );
}
return l - 1;
}
int main()
{
while ( cin >> n >> m )
{
// cin>>str;
str[0] = '0';
scanf ( "%s", str + 1 );
// cout<<str<<endl;
int x, y;
char c;
memset ( tree, 0, sizeof ( tree ) );
memset ( zimu, 0, sizeof ( zimu ) );
builds ( 1, n, 1 ) ;
for ( int i = 0; i < 62; i++ )
{
if ( i < 26 )
build ( 1, n, 1, tree[i], 'a' + i );
else if ( i < 52 )
build ( 1, n, 1, tree[i], 'A' + i - 26 );
else
build ( 1, n, 1, tree[i], '0' + i - 52 );
// cout<<i<<endl;
}
for ( int i = 0; i < m; i++ )
{
cin >> x >> y >> c;
int vis;
if ( c <= '9' )
vis = c - '0' + 52;
else if ( c >= 'a' )
vis = c - 'a';
else
vis = 26 + c - 'A';
x = findlr ( x );
y = findr ( y );
// cout<<"xxxxxxxxxxx "<<vis<<' '<<c<<' '<<int('9')<<' '<<x<<' '<<y<<endl;
// cout<<"find "<<update(1,n,1,n,1,tree[vis],ctree[vis],0)<<endl ;
update ( 1, n, x, y, 1, tree[vis], 1 ) ;
// cout<<"find "<<update(1,n,1,n,1,tree[vis],ctree[vis],0)<<endl ;
}
memset ( tage, 0, sizeof ( tage ) );
for ( int i = 1; i <= n; i++ )
{
if ( !zimu[i] )
cout << str[i];
}
cout << endl;
}
}