门户:Codeforces Round #277 (Div. 2)

486A. Calculating Function

裸公式= =

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ; typedef long long LL ; LL n ; int main () {
while ( ~scanf ( "%I64d" , &n ) ) printf ( "%I64d\n" , n / 2 - ( n % 2 ? n : 0 ) ) ;
return 0 ;
}

486B. OR in Matrix

依据题意,将a矩阵必须为0的地方先填充为0,其它地方置为1,然后对b矩阵中为1的bij推断第i行或第j列是否有1,没有输出NO,推断到最后假设全部的bij都是合法的,则输出YES。

#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std ; typedef long long LL ; #define rep( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define clr( a , x ) memset ( a , x , sizeof a )
#define mid ( ( l + r ) >> 1 ) int a[105][105] ;
int b[105][105] ;
int R[105] , C[105] ;
int n , m ; void solve () {
clr ( R , 0 ) ;
clr ( C , 0 ) ;
For ( i , 1 , n ) For ( j , 1 , m ) a[i][j] = 1 ;
For ( i , 1 , n ) For ( j , 1 , m ) {
scanf ( "%d" , &b[i][j] ) ;
if ( !b[i][j] ) {
For ( k , 1 , m ) a[i][k] = 0 ;
For ( k , 1 , n ) a[k][j] = 0 ;
}
}
For ( i , 1 , n ) For ( j , 1 , m ) {
R[i] += a[i][j] ;
C[j] += a[i][j] ;
}
For ( i , 1 , n ) For ( j , 1 , m ) if ( b[i][j] ) {
if ( a[i][j] ) continue ;
if ( R[i] || C[j] ) continue ;
printf ( "NO\n" ) ;
return ;
}
printf ( "YES\n" ) ;
For ( i , 1 , n ) For ( j , 1 , m ) printf ( "%d%c" , a[i][j] , j < m ? ' ' : '\n' ) ;
} int main () {
while ( ~scanf ( "%d%d" , &n , &m ) ) solve () ;
return 0 ;
}

486C. Palindrome Transformation

贪心,其实仅仅用在初始位置所在的字符串半边处理便足够了,于是考虑几种情况,判一下就可以。这题错的吐血了。少打两个else,导致绝杀失败,不然30多名好歹好看一点。

#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std ; typedef long long LL ; #define rep( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define clr( a , x ) memset ( a , x , sizeof a )
#define mid ( ( l + r ) >> 1 ) const int MAXN = 100005 ; char s[MAXN] ;
int a[MAXN] ;
int n , p ; void solve () {
int ans = 0 ;
clr ( a , 0 ) ;
scanf ( "%s" , s + 1 ) ;
int l = n + 1 , r = 1 ;
For ( i , 1 , n / 2 ) {
if ( s[i] != s[n - i + 1] ) {
a[i] = abs ( s[i] - s[n - i + 1] ) ;
a[n - i + 1] = a[i] = min ( a[i] , 26 - a[i] ) ;
ans += a[i] ;
}
}
if ( p <= n / 2 ) {
For ( i , 1 , n / 2 ) if ( a[i] ) l = min ( l , i ) , r = max ( r , i ) ;
} else {
For ( i , n / 2 + 1 , n ) if ( a[i] ) l = min ( l , i ) , r = max ( r , i ) ;
}
if ( l != n + 1 ) {
if ( p <= l ) ans += r - p ;
else if ( p >= r ) ans += p - l ;
else ans += min ( r - l + r - p , r - l + p - l ) ;
}
printf ( "%d\n" , ans ) ;
} int main () {
while ( ~scanf ( "%d%d" , &n , &p ) ) solve () ;
return 0 ;
}

486D. Valid Sets

考虑以每一个点作为根结点扩展出一棵树,这个树满足树上全部的节点的权值都不比树根大且val[root]-val[v]<=d。然后能够树型DP求以这个点为树根的集合数。考虑到假设以u为根时扩展的树中包括了与u权值同样的v,那么以v为根时便不能包括u了,这个我们能够用一个数组判重。

详细见代码。

#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std ; typedef long long LL ; #define rep( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define clr( a , x ) memset ( a , x , sizeof a )
#define mid ( ( l + r ) >> 1 ) const int MAXN = 2005 ;
const int MAXE = 4005 ;
const int mod = 1e9 + 7 ; struct Edge {
int v , n ;
Edge () {}
Edge ( int v , int n ) : v ( v ) , n ( n ) {}
} ; Edge E[MAXE] ;
int H[MAXN] , cntE ;
int val[MAXN] ;
int vis[MAXN][MAXN] ;
LL dp[MAXN] ;
int d , n ;
int root ; void clear () {
cntE = 0 ;
clr ( H , -1 ) ;
clr ( vis , 0 ) ;
} void addedge ( int u , int v ) {
E[cntE] = Edge ( v , H[u] ) ;
H[u] = cntE ++ ;
} LL dfs ( int u , int fa ) {
dp[u] = 1 ;
LL ans = 1 ;
for ( int i = H[u] ; ~i ; i = E[i].n ) {
int v = E[i].v ;
if ( v == fa ) continue ;
if ( val[v] > val[root] || vis[root][v] || val[root] - val[v] > d ) continue ;
if ( val[root] == val[v] ) vis[root][v] = vis[v][root] = 1 ;
LL tmp = dfs ( v , u ) ;
ans = ( ans + tmp * dp[u] % mod ) % mod ;
dp[u] = ( dp[u] + tmp * dp[u] ) % mod ;
}
return ans ;
} void solve () {
int u , v ;
clear () ;
For ( i , 1 , n ) scanf ( "%d" , &val[i] ) ;
rep ( i , 1 , n ) {
scanf ( "%d%d" , &u , &v ) ;
addedge ( u , v ) ;
addedge ( v , u ) ;
}
LL ans = 0 ;
For ( i , 1 , n ) {
root = i ;
ans = ( ans + dfs ( i , 0 ) ) % mod ;
}
printf ( "%I64d\n" , ans ) ;
} int main () {
while ( ~scanf ( "%d%d" , &d , &n ) ) solve () ;
return 0 ;
}

486E. LIS of Sequence

设F1[i]为1~i内以i结尾的LIS。F2[i]为i~n内以i开头的LIS。ans为1~n内的LIS。

1.F1[i]+F2[i]-1<ans。

2.F1[i]+F2[i]-1==ans时长度F1[i]不唯一。

3.F1[i]+F2[i]-1==ans时长度F1[i]唯一。

可用二分求F1[i],F2[i]。

#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std ; typedef long long LL ; #define rep( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define clr( a , x ) memset ( a , x , sizeof a )
#define mid ( ( l + r ) >> 1 ) const int MAXN = 100005 ; int vis[MAXN] ;
int S[MAXN] , top ;
int a[MAXN] ;
int F1[MAXN] ;
int F2[MAXN] ;
int n ; int search1 ( int x , int l , int r ) {
while ( l < r ) {
int m = mid ;
if ( S[m] >= x ) r = m ;
else l = m + 1 ;
}
return l ;
} int search2 ( int x , int l , int r ) {
while ( l < r ) {
int m = mid ;
if ( S[m] <= x ) r = m ;
else l = m + 1 ;
}
return l ;
} void solve () {
clr ( vis , 0 ) ;
For ( i , 1 , n ) scanf ( "%d" , &a[i] ) ;
top = 0 ;
For ( i , 1 , n ) {
if ( !top || a[i] > S[top] ) {
S[++ top] = a[i] ;
F1[i] = top ;
} else {
int x = search1 ( a[i] , 1 , top ) ;
S[x] = a[i] ;
F1[i] = x ;
}
}
top = 0 ;
rev ( i , n , 1 ) {
if ( !top || a[i] < S[top] ) {
S[++ top] = a[i] ;
F2[i] = top ;
} else {
int x = search2 ( a[i] , 1 , top ) ;
S[x] = a[i] ;
F2[i] = x ;
}
}
int ans = top ;
For ( i , 1 , n ) if ( F1[i] + F2[i] - 1 == ans ) ++ vis[F1[i]] ;
For ( i , 1 , n ) {
if ( F1[i] + F2[i] - 1 < ans ) putchar ( '1' ) ;
else if ( vis[F1[i]] == 1 ) putchar ( '3' ) ;
else putchar ( '2' ) ;
}
printf ( "\n" ) ;
} int main () {
while ( ~scanf ( "%d" , &n ) ) solve () ;
return 0 ;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

【codeforces】Codeforces Round #277 (Div. 2) 解读的更多相关文章

  1. Codeforces Round #277 (Div. 2) 题解

    Codeforces Round #277 (Div. 2) A. Calculating Function time limit per test 1 second memory limit per ...

  2. 贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation

    题目传送门 /* 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 */ /************************************************ ...

  3. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  4. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  5. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

  6. Codeforces Beta Round #77 (Div. 2 Only)

    Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...

  7. Codeforces Beta Round #76 (Div. 2 Only)

    Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...

  8. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

  9. Codeforces Beta Round #74 (Div. 2 Only)

    Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...

随机推荐

  1. Spinlock implementation in ARM architecture

    Spinlock implementation in ARM architecture   SEV and WFE are the main instructions used for impleme ...

  2. JasperReport html 导出

    In my last blog post I discussed about Generating jasper reports in different formats using json fil ...

  3. java 多线程(三)条件对象

    转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47417383 在上一篇博客中,我们学会了用ReentrantLock来控制线程訪问 ...

  4. C语言数据类型取值范围解析

    版权声明:本文为博主原创文章,未经博主允许不得转载.   为什么int类型的取值范围会是-2^31 ~ 2^31-1  ,为什么要减一呢? 计算机里规定,8位二进制为一个字节,拿byte来说,一个BY ...

  5. jquery中的this与$(this)的区别总结(this:html元素)($(this):JQuery对象)

    jquery中的this与$(this)的区别总结(this:html元素)($(this):JQuery对象) 一.总结 1.this所指的是html 元素,有html的属性,可用 this.属性  ...

  6. 从show slave status 中1062错误提示信息找到binlog的SQL

    mysql> show slave status\G *************************** 1. row *************************** Slave_I ...

  7. PHP的SPL标准库里面的堆(SplHeap)怎么使用

    PHP的SPL标准库里面的堆(SplHeap)怎么使用 一.总结 1.因为SplHeap是抽象类,所以要先继承,实现里面的抽象方法compare后,才能new对象使用. 二.PHP的SPL标准库里面的 ...

  8. node转发formdata

    router.post('/keUpload', checkLogin, setAccessControlAllow, (req, res, next) => { const busboy = ...

  9. bat文件从@含义起

    今天看到一个批处理文件,内容很简单,执行很方便,学习了一下才知道就是一条条的dos命令, 掌握其中的几个常用命令能看懂别人的文件就行了 1.@ 一般紧随其后 类似@echo off 其作用类似于ech ...

  10. web.xml 中的listener、 filter、servlet 加载顺序及其详解(转)

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...