2016 USP-ICMC
Time:2018.4.11 2:20-6:00
A Giant Snail Maze
题意
分析
ym:从里向外dpdp,转移时维护前缀minmin正反转两圈。待补
B Martian Sunrise sole by ym sole by czh
题意
给出n种音调,一种音调由7个音阶构成,一个音乐家可以演奏2种音调,现给出有一个很长的曲子共有m个音阶,一个音乐家可以演奏其中连续的一段,问最少需要多少个音乐家
(n<=16,m<=1e5)
分析
ym:将所有情况枚举出来,从左到右贪心的取即可,时间复杂度(n^2*m)
czh:从一到ans枚举音乐家的谱子
C Sleep Buddies solved by ym&czh
分析
直接对每一个集合的数看做二进制的位,最多只有2^10,枚举数字算贡献即可,小数注意精度eps,时间复杂度O(2^10*2^10*10)
D Interstellar Love
Difficult
E Mars Explorer
题意
分析
ym:正着走拿物品不会更优,因此先正着走到最远处,往回走的时候再考虑拿,bitsetbitset优化背包,需要注意自身重量。待补
F Bandejao solved by czh&ym
签到
G Job List
题意
分析
模拟
H Reporting on Mars solved by ym&czh
题意
实质上给n个-1/1的序列,要求每个连续的k个数的乘积都为正数,可以对任意数进行修改,问最少修改的次数
分析
赛时:贪心wa的结束
赛后:实施证明贪心确实容易漏情况
简单推导发现下标 mod k 同余的位置符号相同,可以预处理出每类位置取正或者取负的代价,然后简单dp即可
dp[i][0/1]:前i个位正数/负数的最优解
I Lazy Painting solved by ym&czh
题意
给一个有n×m个格子的网格,给出一个H×W的矩形,现给出q条操作,每条操作给出当前操作的左上角的格子坐标为(ri,ci)为矩形的涂色,若左边界全涂色则不进行任何涂色,若未被全部涂色,则从左边界为染色的格子出发开始在矩形内染未染色的格子 1 ≤ N, M ≤ 105 and 1 ≤ N * M ≤ 3 * 106,(1 ≤ H ≤ N, 1 ≤ W ≤ M) ,q (1 ≤ q ≤ 105), (1 ≤ ri ≤ N - H + 1, 1 ≤ ci ≤ M - W + 1)
分析
数据范围过大,若想开数组需考虑用vector动态开二维数组
显然对每一个询问暴力从左边界bfs修改会爆炸
主要问题是如何解决被涂色的点呗被重复询问,可以对于每一列开一个set,1~n从小到大编号,染色的格子删掉,每次二分查找左边界未涂色的格子,从其出发dfs
(erase中指针被删除会失效)
时间复杂度O(n*mlognlogn)
#include<bits/stdc++.h> using namespace std; int dx[5]={1,-1,0,0}; int dy[5]={0,0,1,-1}; const int maxn = 2e5+7; set<int>pos[maxn]; int sum; int n,m,h,w,q,x,y; int xx, yy; void dfs(int a, int b) { if(a<x||a>xx||b<y||b>yy||pos[b].count(a)==0) return; pos[b].erase(a); sum--; for(int i=0;i<4;i++) { dfs(a+dx[i], b+dy[i]); } } int main() { scanf("%d%d%d%d%d", &n, &m, &h, &w, &q); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { pos[i].insert(j); } } sum=n*m; while(q--) { scanf("%d%d", &x, &y); xx=x+h-1, yy=y+w-1; set<int>::iterator p; p=pos[y].lower_bound(x); while( p!=pos[y].end()&&(*p)<=xx) { dfs(*p,y); //int t=*p; p=pos[y].lower_bound(x); // 此行不知道为什么将x改为*p就RE if(p==pos[y].end()) break; } printf("%d\n", sum); } return 0; }
J The Keys solved by ym &czh
题意
n扇门从1~n排成一行,按顺序开门,给出开n扇门的钥匙比编号,现有m个钥匙扣,每把钥匙随机的放在一个钥匙扣上,初始所有的钥匙扣都在兜里,问需要交换几次使全部的门都打开的期望值
(一把钥匙可能开多扇门,每次交换一定可以将正确的钥匙拿出,开第一扇门拿的钥匙扣不算交换次数,每次交换)
分析
每一扇门不在当前钥匙扣的概率为(k-1)/k
根据期望线性可加不难算出ans=k−1k∑ni=1[di≠di+1]ans=k−1k∑i=1n[di≠di+1]。
K Dire, Dire Docks
题意
给出n个点的坐标,要求有n条线段,线段只经过两个点,且不能穿过其它线段,一个点不能超过四条线段连接,输出线段的起末点,解不唯一,顺序不唯一
分析
ym:极角排序,留坑
Summary
Ym:深知dp多么强大,不会dp是多么无助,前期脑残罚时过多
Czh: