A题 - Twelve Months

没法补

B题 - Chat

大模拟,队友已补

C题 - Coprime

三角形同色模型。假设有n个元素,每两个元素间都存在两种不同的关系A和B。现在要求找出所有三元组,使得它们两两间均为关系A或关系B,总共有多少种可能。

解决:反过来想,我们可以先找出不符合的关系数,那么问题就变为找关系即存在A又存在B的元组。我们先遍历所有元素,假如和该元素符合A关系的元素数目为$a$,符合B关系的元素数目为$b$,那么这个元素对答案有的贡献。对于每个符合的关系$(a_{i}, a_{j}, a_{k})$如果被算进了贡献,我们把每个关系看成一条边,那么有且只有两条边是相同的,这两条边的公共点不会对答案做出贡献,但另外两个点必会对答案做出贡献,所以上面我们提到的关系$(a_{i}, a_{j}, a_{k})$其实被两个元素用到,所以最后的贡献我们要除2。至于其他细节就很套路了。

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;const int M = 1e3 + 5;
const int N = 1e5 + 5;typedef long long ll;int prime[N];
bool vis[N];
int cn = 0;void init() {for(int i = 2; i < M; ++ i) {if(!vis[i]) prime[cn ++] = i;for(int j = 0; j < cn && i * prime[j] < M; ++ j) {vis[i * prime[j]] = 1;if(i % prime[j] == 0) break;}}
}int gcd(int x, int y) {return y == 0 ? x : gcd(y, x % y);
}int num[N];
int fac[N][10];
int facn[N];
int a[N];void getfac(int p, int x) {facn[p] = 0;for(int i = 0; i < cn; ++ i) {if(x < prime[i]) break;if(x % prime[i] == 0) {fac[p][facn[p] ++] = prime[i];while(x % prime[i] == 0)x /= prime[i];}if(x == 1) break;}if(x != 1) fac[p][facn[p] ++] = x;return ;
}void getnum() {for(int i = 2; i < N; ++ i)for(int j = i + i; j < N; j += i)num[i] += num[j];
}int RC(int p) {int res = 0;int lim = (1<<facn[p]);for(int i = 1; i < lim; ++ i) {int mul = 1, p1 = 0;for(int k = 0; k < facn[p]; ++ k) {if(i & (1<<k)) {mul *= fac[p][k]; ++ p1;}}if(p1&1) res += num[mul]-1;else res -= num[mul]-1;}return res;
}int main() {//clock_t t = clock();int T;init();scanf("%d", &T);while(T --) {int n, maxs = 1;scanf("%d", &n);memset(num, 0, sizeof(num));for(int i = 0; i < n; ++ i) {scanf("%d", a + i);num[a[i]] ++;getfac(i, a[i]);//maxs = max(maxs, a[i]);
    }getnum();ll pr = 0;for(int i = 0; i < n; ++ i) {int res = RC(i);pr += 1ll * res * (n - res - 1);}pr /= 2;printf("%I64d\n", 1ll*n*(n-1)*(n-2)/6 - pr);}//cout << clock()-t << "MS" << endl;return 0;
}

View Code

D题 - Galaxy

带权中位数?因为权值都为1,我们直接一个区间一个区间地枚举即可,$O(1)$转移没问题。

E题 - Hatsune Miku

简单dp题,dp[p][j]表示第p个位置为j时最优解是什么,其可以由dp[p-1][k]转移过来。

F题 - Random Inversion Machine

不会

G题 - Memory

貌似是最小割,但并不会。

H题 - NAND

暴搜,写个dfs把所有结果记录下来就行了,但dfs比较恶心,要剪纸才行。

I题 - Osu!

签到题,直接模拟即可。

J题 - Square

状压dp。

解决:比赛时知道了这题要状压dp,但发现一个问题:对于每一行,如果我们记录当前行摆放情况和前k行每一列的摆放情况,那么状态会特别大。我们换种思路,把题意做一步退化,使其变为:计算最大子矩阵边长小于k的情况数。那么我们在计算合法状态时只需考虑连续k个方格是否每列均大于k,这样每行只需记录$(n-k+1)*k$个状态。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long ll;
 5
 6 const int N = 8;
 7 const int M = 2000 + 5;
 8 const ll MOD = 1e9 + 7;
 9
10 char mp[N+5][N+5];
11
12 int pw[N+1][N+1];
13 ll dp[N+1][M];
14 int bar[N+1];
15
16 void init()
17 {
18   for(int i = 1; i <= N; ++ i) {
19     pw[i][0] = 1;
20     for(int j = 1; j <= N; ++ j)
21       pw[i][j] = pw[i][j-1] * i;
22   }
23 }
24
25 int getp(int s, int b, int i)
26 {
27   return s / pw[b][i] % b;
28 }
29
30 int putp(int s, int b, int i, int val)
31 {
32   int tmp = s % pw[b][i];
33   return (s / pw[b][i+1] * b + val) * pw[b][i] + tmp;
34 }
35
36 int main()
37 {
38   //freopen("in", "r", stdin);
39   int T;
40   init();
41   scanf("%d", &T);
42   while(T --) {
43     int n, ba = 1;
44     scanf("%d", &n);
45     for(int i = 1; i <= n; ++ i) {
46       scanf("%s", mp[i]);
47       bar[i] = 0;
48       for(int j = 0; j < n; ++ j)
49         if(mp[i][j] == '*') {
50           ba = 0; bar[i] |= (1 << j);
51         }
52     }
53     printf("1\n");
54     ll pre = 1, ans = 0;
55     for(int d = 2; d <= n; ++ d) {
56       int lim = pw[d][n-d+1];
57       memset(dp, 0, sizeof(dp));
58       dp[0][0] = 1;
59       for(int i = 0; i < n; ++ i) {
60         for(int si = 0; si < lim; ++ si) {
61           for(int s = 0; s < (1<<n); ++ s) {
62             if(s & bar[i+1]) continue;
63             int nsta = 0, ok = 1;
64             for(int j = 0; j < n-d+1; ++ j) {
65               int np = getp(si, d, j);
66               int tmp = (1<<j+d)-(1<<j);
67               if((s & tmp) == tmp) np ++;
68               else np = 0;
69               if(np == d) { ok = 0; break; }
70               nsta = putp(nsta, d, j, np);
71             }
72             if(!ok) continue;
73             dp[i+1][nsta] = (dp[i+1][nsta] + dp[i][si]) % MOD;
74           }
75         }
76       }
77       ans = 0;
78       for(int si = 0; si < lim; ++ si)
79         ans = (ans + dp[n][si]) % MOD;
80       printf("%lld\n", (ans - pre + MOD) % MOD);
81       pre = ans;
82     }
83     printf("%d\n", ba);
84   }
85   return 0;
86 }

View Code

K题 - Colorful Toy

几何+Ponya定理。

现在暂时不太会。留个坑。

L题 - Trie

不会。

转载于:https://www.cnblogs.com/UtopioSPH001/p/10048858.html

The 2014 ACM-ICPC Asia Anshan Regional Contest相关推荐

  1. 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...

  2. 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...

  3. 2014 ACM/ICPC Asia Regional Guangzhou Online C题Wang Xifeng's Little Plot(dfs)

    Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  4. The 2019 ICPC Asia Shanghai Regional Contest

    The 2019 ICPC Asia Shanghai Regional Contest 题号 题目 知识点 A Mr. Panda and Dominoes B Prefix Code C Maze ...

  5. 2018 ICPC Asia Jakarta Regional Contest

    2018 ICPC Asia Jakarta Regional Contest 题号 题目 知识点 难度 A Edit Distance B Rotating Gear C Smart Thief D ...

  6. 【题目记录】——The 2021 ICPC Asia Jinan Regional Contest

    文章目录 C Optimal Strategy 组合数 H Game Coin K Search For Mafuyu 欧拉序列 题目集地址 The 2021 ICPC Asia Jinan Regi ...

  7. 2019-2020 ICPC Asia Xuzhou Regional Contest【徐州现场赛】

    题目: 209-2020 ICPC Asia Xuzhou Regional Onsite Contest E. Multiply 题意: 找到最大的 i 使得 z*x^i 是 y! 的因子 分析: ...

  8. hdu 5023 poj 2777(线段染色)2014 ACM/ICPC Asia Regional 广州 Online

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5023 http://poj.org/problem?id=2777 题意:给出一个长度为N的线段,分 ...

  9. 2014 ACM/ICPC Asia Regional Xi'an Online

    2014西安网络赛 A. Post Robot 把每种单词都kmp跑一遍,顺序输出即可 #include <cstdio> #include <iostream> #inclu ...

  10. 2014 ACM/ICPC Asia Regional Beijing Site

    1001 A Curious Matt 1002 Black And White 1003 Collision 1004 Dire Wolf 1005 Everlasting L 1006 Fluor ...

最新文章

  1. 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
  2. 密码程序python_Python获取web密码程序的脚本源代码
  3. Android之webview长按超链接类型获取链接文字及url、长按图片链接类型分别获取图片和链接的url
  4. ChaiNext:当前市场短期行情波动大
  5. 使用Zabbix Agent 2监控MongoDB
  6. 代码中启动ros节点roslaunch和rosrun,代码启动节点与关闭节点,地图切换
  7. 转:Apple的App Analytics统计平台你必须知道的
  8. VMware 和 linux镜像文件
  9. cef调用本地html,在CefSharp中使用本地构建的网页(Working with locally built web page in CefSharp)...
  10. sap查看后台作业进度_SAP资产折旧运行 AFAB
  11. 两条波浪线符号_波浪线符号(word小技巧)
  12. 网络钓鱼(Phishing)攻击方式
  13. Field属性(域)
  14. 有个码龄 10 年的程序员跟我说:“他编程从来不用鼠标”,我说:
  15. Pig的安装及基本使用
  16. uni-app实现本地打包安卓APK
  17. iPhone内存比Android手机小,为什么iPhone内存1G、2G比安卓内存4G运行更快?
  18. dell加装固态硬盘_[图解]戴尔灵越15R 5537怎么更换加装固态硬盘?
  19. centos解压分卷rar_Centos下解压rar、zip文件的方法
  20. CIPP翻转内衬法整体修复技术简介

热门文章

  1. php用dre打开,php设计模式--适配器模式
  2. 计算机网络知识之URL、IP、子网掩码、端口号
  3. oracleundo表空间概述_34_undo表空间概述
  4. JavaWeb实战项目之乐购商城V1.0(一)-------环境搭建
  5. Git学习笔记(二)
  6. Codeforces Round #703 (Div. 2) A-E 题解
  7. 计算机插u盘抖动,u盘插入电脑闪蓝屏怎么办? 爱问知识人
  8. 多远线性回归代码-波士顿房价问题
  9. ESP32存储配网信息+LED显示配网状态+按键清除配网信息(附源码)
  10. 深度学习网络调参技巧