agc031
T1 题意:给你一个串,求所有子序列个数,满足没有相同字符。1e5,2s。
解:考虑一个合法的子序列。其中每个字母的出现位置都有(出现次数)种选择。还可以不选,要 + 1。
然后乘起来就做完了。如果变成子串的话更简单,每个位置为开头的长度不会超过26,直接暴力。本质不同子串就开个hash池判重。
本质不同子序列......不会。
- #include <bits/stdc++.h>
- const int N = , MO = 1e9 + ;
- char str[N];
- int bin[];
- int main() {
- int n;
- scanf("%d", &n);
- scanf("%s", str);
- for(int i = ; i < n; i++) {
- bin[str[i] - 'a']++;
- }
- int ans = ;
- for(int i = ; i < ; i++) {
- ans = 1ll * ans * (bin[i] + ) % MO;
- }
- printf("%d", (ans + MO - ) % MO);
- return ;
- }
AC代码
T2 题意:给你一个序列,可以若干次选择两个相同的数字,使其之间的数字全部变成这个数字。求最终可能的序列总数。2e5,2s。
解:发现选出来的序列一定是一些相离的,所以可以DP,设f[i]表示前i位可能的方案总数。那么第i位可能和前面任一个相同的数匹配,f[i] += f[j - 1]。
同时也可能不匹配,相当于自己跟自己匹配。我们要对所有ai等于一个数的DP值求和,直接开个桶。
发现有连续相同的数的时候会挂,把它们缩起来。
- #include <bits/stdc++.h>
- typedef long long LL;
- const int N = , MO = 1e9 + ;
- int a[N], bin[N], f[N];
- int main() {
- int n;
- scanf("%d", &n);
- for(int i = ; i <= n; i++) {
- scanf("%d", &a[i]);
- if(a[i] == a[i - ]) {
- i--;
- n--;
- }
- }
- f[] = ;
- for(int i = ; i <= n; i++) {
- (bin[a[i]] += f[i - ]) %= MO;
- f[i] = bin[a[i]];
- }
- printf("%d", f[n]);
- return ;
- }
AC代码
T3 题意:求一个1 ~ 2n的排列,满足第一个数是A,最后一个数是B,且相邻两个数的二进制只有一位不同。17,2s。
解:猜一下结论,如果A和B二进制下不同的位数有偶数个,那么一定无解。其余的有解。
因为有个头尾的限制,所以我们直接暴力分治。
每次讨论A和B最高位是否相同。相同的话就先把最高位变一下填2n-1个,然后变回来填后面的。
不同的话就前2n-1个最高位从A,后面最高位从B。
- /**
- * There is a start and there is no end in the space. ---Infinity.
- * It ruins and goes though there is also a start in stars. ---Finite.
- * Only the man who has wisdom can read the most foolish one from the history.
- * Fishes living in the sea doesn't know the life in the land.
- * It also ruins and goes if they have wisdom.
- * It funnier that man exceeds the speed of light than fish start living in the land.
- * It can be said that this is an final ultimatum from the god to the people who can fight.
- *
- * Steins;Gate
- */
- #include <bits/stdc++.h>
- const int N = ;
- int n, A, B, p[N], top, now, lm, same, dt;
- inline void out(int x) {
- for(int i = ; i < n; i++) {
- printf("%d", (x >> i) & );
- }
- return;
- }
- inline int cal(int x) {
- int ans = ;
- while(x) {
- ans++;
- x -= x & (-x);
- }
- return ans;
- }
- inline int Abs(int x) {
- return x < ? -x : x;
- }
- inline int First(int x) {
- for(int i = n - ; i >= ; i--) {
- if((x >> i) & ) return << i;
- }
- return ;
- }
- void solve(int n, int l, int r, int a, int b) {
- if(n == ) {
- p[l] = a;
- p[r] = b;
- return;
- }
- int mid = (l + r) >> , nexlm = ( << (n - )) - ;
- if(((a >> (n - )) & ) == ((b >> (n - )) & )) {
- solve(n - , mid + , r, a & nexlm, b & nexlm);
- if((a >> (n - )) & ) {
- for(int i = mid + ; i <= r; i++) {
- p[i] |= << (n - );
- }
- p[l] = p[mid + ];
- solve(n - , l + , mid + , a & nexlm, p[mid + ] & nexlm);
- }
- else {
- p[l] = p[mid + ];
- solve(n - , l + , mid + , a & nexlm, p[mid + ] & nexlm);
- for(int i = l + ; i <= mid + ; i++) {
- p[i] |= ( << (n - ));
- }
- }
- }
- else {
- solve(n - , l, mid, a & nexlm, (b & nexlm) ^ );
- if((a >> (n - )) & ) {
- for(int i = l; i <= mid; i++) {
- p[i] |= << (n - );
- }
- solve(n - , mid + , r, p[mid] & nexlm, b & nexlm);
- }
- else {
- solve(n - , mid + , r, p[mid] & nexlm, b & nexlm);
- for(int i = mid + ; i <= r; i++) {
- p[i] |= << (n - );
- }
- }
- }
- return;
- }
- int main() {
- scanf("%d%d%d", &n, &A, &B);
- lm = ( << n) - , dt = A ^ B, same = dt ^ lm;
- if((cal(dt) & ) == ) {
- puts("NO");
- }
- else {
- puts("YES");
- solve(n, , lm, A, B);
- for(int i = ; i <= lm; i++) {
- //out(p[i]); printf(" ");
- printf("%d ", p[i]);
- //puts("");
- }
- }
- return ;
- }
AC代码
T4 题意:给定两个排列a和b,定义f(a, b)是一个排列,满足第ai个位置上的数是bi。定义A为一个序列,每个元素是一个排列,且A1 = a, A2 = b, Ai = f(Ai-2, Ai-1),求Ak。10w,1e9,2s。
解:神仙...
对于两个排列a和b,定义ab[i] = a[b[i]], a-1[a[i]] = i。于是我们把A的前几项写出来,然后瞎搞一通,就能发现一个奇妙的规律orz...
直接上官方题解了。
我们把A的每一个元素拆成sts-1的形式。然后发现si+6 = siba-1b-1a,是个等比数列。然后t是6个一循环的。
于是我们求出ba-1b-1a的k / 6次方就做完了......注意到求一个排列的k次方只需找出每个元素所在的环,然后跳(k % 环长)步即可。
- #include <bits/stdc++.h>
- const int N = ;
- int a[N], b[N], c[N], d[N], A[N], n, k, vis[N], B[N], dis[N], C[N], D[N];
- int t1[][N], t2[][N], t3[][N], ans[][N];
- std::vector<int> v[N];
- inline int Find(int x, int t) {
- int loop = v[vis[x]].size() - ;
- t = (t + dis[x]) % loop;
- return v[vis[x]][t];
- }
- int main() {
- scanf("%d%d", &n, &k);
- k--;
- for(int i = ; i <= n; i++) scanf("%d", &a[i]);
- for(int i = ; i <= n; i++) scanf("%d", &b[i]);
- /// get A c = b-1 d = a-1
- for(int i = ; i <= n; i++) {
- c[b[i]] = i;
- d[a[i]] = i;
- }
- /*for(int i = 1; i <= n; i++) {
- printf("%d ", c[i]);
- }
- puts("");
- for(int i = 1; i <= n; i++) {
- printf("%d ", d[i]);
- }
- puts("");*/
- for(int i = ; i <= n; i++) {
- A[i] = b[d[c[ a[i] ]]];
- }
- int t = k / ;
- //printf("t = %d \n", t);
- /// get B = A^t
- for(int i = ; i <= n; i++) {
- if(vis[i]) continue;
- /// !vis[i]
- int j = i;
- v[i].push_back(i);
- do {
- j = A[j];
- dis[j] = v[i].size();
- vis[j] = i;
- v[i].push_back(j);
- } while(j != i);
- dis[i] = ;
- }
- for(int i = ; i <= n; i++) {
- B[i] = t ? Find(i, t) : i;
- }
- /*printf("vis : \n");
- for(int i = 1; i <= n; i++) {
- printf("%d ", vis[i]);
- }
- puts("");
- printf("A : \n");
- for(int i = 1; i <= n; i++) {
- printf("%d ", A[i]);
- }
- puts("");*/
- memcpy(t1[] + , B + , n * sizeof(int));
- memcpy(t1[] + , B + , n * sizeof(int));
- memcpy(t2[] + , a + , n * sizeof(int));
- memcpy(t2[] + , b + , n * sizeof(int));
- for(int i = ; i <= n; i++) {
- t3[][t1[][i]] = i;
- t3[][t1[][i]] = i;
- }
- for(int i = ; i <= n; i++) {
- ans[][i] = t1[][t2[][t3[][i]]];
- ans[][i] = t1[][t2[][t3[][i]]];
- }
- t = k % ;
- //printf("t = %d \n", t);
- for(int i = ; i <= t; i++) {
- for(int j = ; j <= n; j++) {
- ans[i][ans[i - ][j]] = ans[i - ][j];
- }
- }
- /*puts("");
- for(int i = 0; i <= 1; i++) {
- for(int j = 1; j <= n; j++) {
- printf("%d ", ans[i][j]);
- }
- puts("");
- }
- puts("");*/
- for(int i = ; i <= n; i++) {
- printf("%d ", ans[t][i]);
- }
- return ;
- }
AC代码
agc031的更多相关文章
- AtCoder Grand Contest 031 (AGC031) D - A Sequence of Permutations 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC031D.html 前言 比赛的时候看到这题之后在草稿纸上写下的第一个式子就是 $$f(p,q) = pq^ ...
- 【AtCoder】AGC031
A - Colorful Subsequence 答案是 \(\prod_{c = 'a'}^{'z'} (cnt[c] + 1)\) #include <bits/stdc++.h> # ...
- AGC031 A~C
A题意:给定字符串s,求无重复字符子序列个数(子序列相同位置不同算不同) 在最后加一串a~z表示选了这些就是不选这个字符了,然后答案就是每次选每个字符位置的方案数的积 #include<iost ...
- AtCoder Grand Contest 031 B - Reversi
https://atcoder.jp/contests/agc031/tasks/agc031_b B - Reversi Time Limit: 2 sec / Memory Limit: 1024 ...
- AtCoder Grand Contest 031 B - Reversi(DP)
B - Reversi 题目链接:https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: 给出n个数,然后现在你可以对一段区间修改成相同的值,前提是 ...
- Atcoder AGC031C Differ By 1 Bit (构造、二进制)
哎呀这个C怎么比B还水....(我现在大概也就会做点这种水题了吧) 题目链接 https://atcoder.jp/contests/agc031/tasks/agc031_c 题目大意 符号约定: ...
- Atcoder AGC031B Reversi (DP计数)
简单的计数题.(总算做出一道AGC的B题了,然而这场比赛我忘记打了233333) 题目链接: https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: ...
- AtCoder整理(持续更新中……)
做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...
- 【做题记录】AtCoder AGC做题记录
做一下AtCoder的AGC锻炼一下思维吧 目前已做题数: 75 总共题数: 239 每一场比赛后面的字母是做完的题,括号里是写完题解的题 AGC001: ABCDEF (DEF) AGC002: A ...
随机推荐
- flutter 动画双指放大图片
class GridAnimation extends StatefulWidget { @override State<StatefulWidget> createState() { r ...
- 利用Python制作简单的小程序:IP查看器
前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固 ...
- 如何抓取电商的数据 & Python
如何抓取电商的数据 & Python https://www.zhihu.com/question/40720286 https://www.zhihu.com/question/382455 ...
- dataTable之自定义按钮实现全表 复制 打印 导出 重载
//本文对常用表格插件datatable 的自定义按钮功能键进行详细解释//其中 15-78行是定义表单//16 18 19 三行定义自定义功能按钮 实现对全表的 复制 打印 导出(csv即excel ...
- Appium之编写H5应用测试脚本(切换到Webview)
App使用H5编写,默认方式找不到元素.启动后获取所有上下文,找到webivew_xxxx的,然后进行切换. 源码: package MyAppium; import io.appium.java_c ...
- ABP实践学习
一.
- 树&图 记录
A - Lake Counting POJ - 2386 最最最最最基础的dfs 挂这道题为了提高AC率(糖水不等式 B - Paint it really, really dark gray Cod ...
- MySQL启动错误---发生系统错误/系统找不到指定的文件。
今天启动mysql时,突然报错发生系统错误,系统找不到指定的文件.当时有点懵,安装mysql 之后,一直就没有修改过,怎么会报错呢?上网搜索了一下,重新安装一下mysql服务就可以了,现在也不知道什么 ...
- Java 学习(1) ---JDK安装和配置环境变量
一,Java 开发的第一步,就是安装JDK(Java Development ToolKit Java开发工具包) JDK 是Java开发的核心,因为它包括Java 运行环境,工具包和命令.当我们安 ...
- 简单介绍一下在CentOS上安装Docker。
简单介绍一下在CentOS上安装Docker. 前置条件: 64-bit 系统 kernel 3.10+ 1.检查内核版本,返回的值大于3.10即可. $ uname -r 2.使用 sudo 或 r ...