2016 USP-ICMC

Time:2018.4.11  2:20-6:00  

Link


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 同余的位置符号相同,可以预处理出每类位置取正或者取负的代价,然后简单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 ≤ N1 ≤ 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=k1kni=1[didi+1]ans=k−1k∑i=1n[di≠di+1]。


K Dire, Dire Docks

题意

给出n个点的坐标,要求有n条线段,线段只经过两个点,且不能穿过其它线段,一个点不能超过四条线段连接,输出线段的起末点,解不唯一,顺序不唯一

分析

ym:极角排序,留坑


Summary

Ym:深知dp多么强大,不会dp是多么无助,前期脑残罚时过多

Czh:

 

posted @ 2018-04-11 12:52  Deadlined  阅读(255)  评论(0编辑  收藏  举报