CF Edu Round 71
CF Edu Round 71
A There Are Two Types Of Burgers
贪心随便模拟一下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXN 200006
int n , m;
int A[MAXN];
int b , p , f , h , c;
int main() {
int T;cin >> T;
while( T-- ) {
cin >> b >> p >> f >> h >> c;
int res = 0;
if( h > c ) {
if( b > 2 * p ) b -= 2 * p , res += p * h;
else { printf("%d\n",( b / 2 ) * h); continue; }
if( b > 2 * f ) printf("%d\n",res + f * c);
else printf("%d\n", res + ( b / 2 ) * c);
} else {
if( b > 2 * f ) b -= 2 * f , res += f * c;
else { printf("%d\n",( b / 2 ) * c); continue; }
if( b > 2 * p ) printf("%d\n",res + p * h);
else printf("%d\n", res + ( b / 2 ) * h);
}
}
}
B Square Filling
贪心,从左上角往左往下枚举,如果可以涂就涂,最后判断一下就好了。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
#define MAXN 56
int A[MAXN][MAXN];
int n , m;
bool book[MAXN][MAXN];
vector<pair<int,int> > ans;
int main() {
cin >> n >> m;
for( int i = 1 ; i <= n ; ++ i )
for( int j = 1 ; j <= m ; ++ j ) scanf("%d",&A[i][j]);
for( int i = 1 ; i <= n ; ++ i ) {
for( int j = 1 ; j <= m ; ++ j ) if( A[i][j] ) {
if( ( i == n || j == m ) ) if(!book[i][j]){ return puts("-1") , 0; } else continue;
if( A[i][j] == 1 && A[i + 1][j] == 1 && A[i + 1][j + 1] == 1 && A[i][j + 1] == 1 )
book[i][j] = book[i+1][j] = book[i+1][j+1] = book[i][j + 1] = 1 , ans.push_back( make_pair( i , j ) );
else if( !book[i][j] ) return puts("-1") , 0;
}
}
cout << ans.size() << endl;
for( int i = 0 ; i < ans.size() ; ++ i )
printf("%d %d\n",ans[i].first , ans[i].second);
}
C Gas Pipeline
随便线性dp一下就好了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 300006
#define int long long
typedef long long ll;
using namespace std;
ll dp[MAXN][2] , len;
char s[MAXN];
signed main() {
int T; cin >> T;
while( T --> 0 ) {
ll n, a, b;
scanf("%lld%lld%lld%s", &n, &a, &b , s);
len = strlen(s);
dp[0][0] = b, dp[0][1] = 0x3f3f3f3f3f3f3f3f;
for (int i = 1; i <= len; i++)
if (s[i - 1] == '1')
dp[i][1] = dp[i - 1][1] + a + 2 * b , dp[i][0] = 0x3f3f3f3f3f3f3f3f;
else
dp[i][1] = min( ( a << 1 ) + dp[i - 1][0], dp[i - 1][1] + a) + ( b << 1 ),
dp[i][0] = min( a + dp[i - 1][0] , ( a << 1 ) + dp[i - 1][1] ) + b;
printf("%lld\n",dp[len][0]);
}
}
D Number Of Permutations
容斥一下,总排列数 - 第一个顺序 - 第二个顺序 + 两个都顺序
计算很简单,用阶乘搞一下就好了
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
#define P 998244353
#define MAXN 300006
#define int long long
int n;
pair<int,int> A[MAXN];
int J[300050];
bool cmp1(pair<int,int> a,pair<int,int> b) {
return a.first == b.first ? a.second < b.second : a.first < b.first;
}
bool CMP(pair<int,int> a,pair<int,int> b) {
return a.second < b.second;
}
signed main() {
J[0] = 1; for (int i = 1; i <= 300000; ++i) J[i] = J[i - 1] * 1ll * i % P;
scanf("%lld", &n);
for (int i = 1; i <= n; ++i)
scanf("%lld%lld", &A[i].first, &A[i].second);
sort(A + 1, A + 1 + n, cmp1);
int cur = 1 , ans = J[n];
int l = 0;
for (int i = 1; i <= n; ++i)
if (A[i].first != A[i - 1].first) cur *= J[l], l = 1, cur %= P;
else l++;
cur *= J[l] , cur %= P , ans -= cur;
bool flg = 1;
for (int i = 1; i <= n; ++i)
if (A[i].second < A[i - 1].second) { flg = 0; break; }
if (flg) {
cur = 1 , l = 0;
for (int i = 1; i <= n; ++i)
if (A[i].first != A[i - 1].first || A[i].second != A[i - 1].second)
cur *= J[l], l = 1 , cur %= P;
else l++;
cur *= J[l], cur %= P , ans += cur;
}
sort(A + 1, A + 1 + n, CMP);
cur = 1, l = 0;
for (int i = 1; i <= n; ++i) {
if (A[i].second != A[i - 1].second)
cur *= J[l] , cur %= P , l = 1;
else ++ l;
}
cur *= J[l] , cur %= P , ans -= cur;
printf("%lld\n", (ans % P + P) % P);
return 0;
}
E XOR Guessing
考场上嫖了个ywh的随机。。。
然而实际上很简单。。
考虑分成前7位和后7位,前100个数字前7位全部留空,后100个数字后7位全部留空,做完了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
using namespace std;
int pre , aft;
int main() {
cout << '?' ;
for( int i = 1 ; i <= 100 ; ++ i ) cout << ' ' << i;
cout << endl;
fflush( stdout );
cin >> pre;
cout << '?';
for( int i = 1 ; i <= 100 ; ++ i ) cout << ' ' << ( i << 7 );
cout << endl;
fflush( stdout );
cin >> aft;
int res = 0;
res |= ( pre & ( ( 1 << 8 ) - 1 ) << 7 );
res |= ( aft & ( 1 << 7 ) - 1 );
cout << '!' << ' ' << res << endl;
fflush( stdout );
}
F Remainder Problem
大水题
第二种操作,如果$ y > \sqrt n $ 直接naive地暴力
否则,每次一操作后预处理一下 $ y \leq \sqrt n $的答案
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
typedef long long ll;
using namespace std;
#define MAXN 500006
#define MXBL 730
int t, x, y;
ll buc[MAXN] , S[MXBL][MXBL] , res ;
signed main() {
int T;cin >> T;
while( T --> 0 ) {
scanf("%d%d%d", &t, &x, &y);
if (t != 1) {
if (x < MXBL ) printf("%lld\n", S[x][y]);
else {
res = 0; for (int j = y; j < MAXN; j += x) res += buc[j];
printf("%lld\n", res);
}
} else {
for (int j = 1; j < MXBL; ++j) S[j][x % j] += y;
buc[x] += y;
}
}
}
G Indie Album
ACAM 好题
其实自己根本不怎么会acam。。。这题赛后写来顺便学习了一下acam
当然,考场上很多人都写的广义后缀自动机+树链剖分。
只是yijan现在还不大会(。。。wtcl
发现后缀自动机各种板子写多了的带佬们看字符串题都是秒啊。。
首先对于所有询问串建ac自动机,再把fail树建立出来。
如果不考虑复杂度,把询问离线,然后对于每一个文本串都在询问的fail树上跑,跑到的节点都+1,然后每个询问在这个串里面出现的次数就是这个串子树的和。
但是这么做显然复杂度是错的,但是发现这道题给文本串的方式很特殊,所有的文本串也构成了一个树形结构,于是可以考虑dfs这个文本串构成的树,用一种类似增量法的科技,增加一个字符后会多对一个位置+1,而离开dfs时会对这个位置-1,中间统计一下所有关于这个串的答案就可以了。
单点+,区间查需要一个fenwick tree,复杂度 \(O (TlogT)\)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 400006
int n , m;
char ch[MAXN];
int trie[MAXN][26] , fail[MAXN * 26] , ncnt = 0;
int T[MAXN];
int dfn;
void add( int x , int c ) {
while( x <= dfn ) T[x] += c , x += x & -x;
}
int que( int x ) {
int ret = 0;
while( x > 0 ) ret += T[x] , x -= x & -x;
return ret;
}
vector< pair<int,int> > ff[MAXN];
int ins( char* P ) {
int cur = 0 , len = strlen( P );
for( int i = 0 ; i < len ; ++ i ) {
int v = P[i] - 'a';
if( !trie[cur][v] ) trie[cur][v] = ++ncnt;
cur = trie[cur][v];
}
return cur;
}
queue<int> Q;
vector<int> F[MAXN] , G[MAXN];
void build( ) {
int cur;
for( int i = 0 ; i < 26 ; ++ i ) if( trie[0][i] )
Q.push( trie[0][i] ) , fail[trie[0][i]] = 0;
while( !Q.empty( ) ) {
cur = Q.front() , Q.pop();
F[fail[cur]].push_back( cur );
for( int i = 0 ; i < 26 ; ++ i ) {
if( trie[cur][i] )
fail[trie[cur][i]] = trie[fail[cur]][i] ,
Q.push( trie[cur][i] );
else
trie[cur][i] = trie[fail[cur]][i];
}
}
}
int L[MAXN] , R[MAXN];
void predfs( int u ) {
L[u] = ++ dfn;
for( int i = 0 ; i < F[u].size() ; ++ i ) predfs( F[u][i] );
R[u] = dfn;
}
int ans[MAXN];
void work( int u , int p ) {
p = trie[p][ch[u] - 'a'];
add( L[p] , 1 );
for( int i = 0 ; i < G[u].size() ; ++ i )
work( G[u][i] , p );
for( int i = 0 ; i < ff[u].size() ; ++ i )
ans[ff[u][i].second] = que( R[ff[u][i].first] ) - que( L[ff[u][i].first] - 1 );
add( L[p] , -1 );
}
char P[MAXN];
int ffa[MAXN];
int main() {
cin >> n;
for( int i = 1 , t , opt ; i <= n ; ++ i ) {
scanf("%d ",&opt);
if( opt == 1 ) { scanf("%c",&ch[i]) , ffa[i] = 0 , G[0].push_back( i ); continue; }
scanf("%d %c",&t,&ch[i]);
ffa[i] = t , G[t].push_back( i );
getchar();
}
cin >> m;
for( int i = 1 , t ; i <= m ; ++ i ) {
scanf("%d%s",&t,P);
int x = ins( P );
ff[t].emplace_back( make_pair( x , i ) );
}
build( );
predfs( 0 );
for( int i = 1 ; i <= n ; ++ i ) if( !ffa[i] )
work( i , 0 );
for( int i = 1 ; i <= m ; ++ i ) printf("%d\n",ans[i]);
}
CF Edu Round 71的更多相关文章
- CF Educational Round 78 (Div2)题解报告A~E
CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students 依题意模拟即可 #include<bits/stdc++.h> us ...
- Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块
Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块 [Problem Description] ...
- Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题
Educational Codeforces Round 71 (Rated for Div. 2)-E. XOR Guessing-交互题 [Problem Description] 总共两次询 ...
- CF Codeforces Round #231 (Div. 2)
http://codeforces.com/contest/394 话说这次CF做的超级不爽,A题一开始交过了,我就没再管,B题还没看完呢,就死困死困的,后来觉得B题枚举一下估计能行,当时是觉得可以从 ...
- rsa Round #71 (Div. 2 only)
Replace A Time limit: 1000 msMemory limit: 256 MB You are given a string SS containing only letter ...
- [题解向] CF#Global Round 1の题解(A $\to$ G)
这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...
- Educational Codeforces Round 71
https://www.cnblogs.com/31415926535x/p/11460682.html 上午没课,做一套题,,练一下手感和思维,,教育场的71 ,,前两到没啥,,后面就做的磕磕巴巴的 ...
- [cf]Codeforces Round #784(Div 4)
由于一次比赛被虐得太惨,,生发开始写blog的想法,于是便有了这篇随笔(找了个近期的cf比赛练练手(bushi))第一次写blog,多多包涵. 第二场cf比赛,第一场打的Div2,被虐太惨,所以第二场 ...
- 【做题笔记】CF Edu Round 132
1. 前言 本人第一次把 Div2. D 切了,开心. C 不会,寄. 后来在场外想到一种奇怪做法 AC 了. 2. 正文(A-D) CF 比赛链接 A. Three Doors 签到题.循环查找手中 ...
随机推荐
- Less-23 preg_replace1
Less-23: 直接跳到Less-23的原因是,Less-(11~22)均为注入点不为get方式的注入.我先把get型注入写的差不多,再回来整理关于注入点的内容. 核心语句: 查询.报错均有回显. ...
- Java:并发笔记-04
Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线 ...
- Uniapp云打包生成apk下载链接
使用uni[]()app云打包生成安装包下载链接 manifest.json 中配置自动获取appid manifest.json中配置app 图标 按教程生成.keystore证书 使用云打包生成安 ...
- es7集群的搭建
es7集群的搭建 一.需求 二.前置条件 三.搭建步骤 1.下载es 2.创建 `es` 用户并给es目录授权 3.修改es的配置文件 4.es01目录下 elasticsearch.yml 的一个完 ...
- nio之缓冲区(Buffer)理解
一.缓冲区简介 Nio中的 Buffer 是用于存储特定基础类型的一个容器.为了能熟练的使用 Nio中的各种 Buffer , 我们需要理解 Buffer 中的 三个重要 的属性. 1. capaci ...
- 启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析
文/朱季谦 遇到一个很诡异的问题,我在启动多个配置相同zookeeper的Dubbo项目时,其他项目都是正常启动,唯独有一个项目在启动过程中,Dubbo注册zookeeper协议时,竟然出现了这样的异 ...
- IOC和DI之刨根问底之第一节
很多freshman上来就想搞清楚什么是IOC和DI,其实很多先进的理论和技术都在老的基础上升华出来的,最终目的是为了解放生产力. 所以先来说说下面两点基础知识: Direct Dependency( ...
- 嵌入式单片机之STM32F103C8T6最小系统板电路设计参考
STM32F103C8T6最小系统板电路设计 一.电源部分 设计了一个XH插座,以便使用3.7V锂电池供电,接入电压不允许超过6V. 二.指示灯部分 电源指示灯可以通过一个短路帽控制亮灭,以达到节电的 ...
- 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...
- linux下创建文件的文件权限问题
今天发现创建文件的权限和自己规定的权限不一致,了解到了权限掩码的问题,这里总结一下. 首先权限掩码umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常我们都 ...