DS x

数据结构课后题整理....只会一个是什么鬼....

染色问题:

线段树? 功能太强大了! 我们并不需要那么多的功能

运用并查集!!!

将相同的并为一段

BZOJ 2375(讲真我没找到这个题在哪里...)

(其实是因为我没有权限号啦~)

题目大概是这样的:

小t非常喜爱画画,但是他还是一个初学者.他最近费尽千辛万苦才拜到已仙逝的达.芬奇为师(神仙?妖怪?谢谢).

达.芬奇果然是画鸡蛋长大的,让小t一入门就拿着一张白纸条疯狂地涂色.

假设纸条被划分成了n个区域,用1~n的整数从左到右顺序编号,达芬奇总共下达了m条指令.

第I条指令是让小t把编号为(I*p+q)mod n+1与(I*q+p)mod n+1(p,q为常整数)之间的区域(连续的一段区域)涂成第I种颜色.

你可以假设达芬奇家中颜料的颜色数足够多(达芬奇是画鸡蛋长大的).

现在由于达芬奇下达的指令过多,小t一时应付不过来.达芬奇只让他回答每一个区域最后的颜色.

趁达芬奇还在“五谷轮回之所”忙碌时,小t偷偷的请让你这个计算机高手帮他算出最后的颜色状态,并告诉他.时间紧迫,要快哟!(达芬奇的指令次数多到恶心)是真的恶心

输入格式

文件仅一行,为四个整数n,m,p,q。

输出格式

文件共n行,第i行代表最后第i个格子的颜色。白色编号为0

输入样例

4 3 2 4(假样例....)

输出样例

2

2

3

0

数据范围

20%数据满足:1≤n≤1000,1≤m≤10000

40%数据满足:1≤n≤10000,1≤m≤100000

100%数据满足:1≤n≤1000000,1≤m≤10000000;1≤m*p+q,m*q+p≤231-1

/*思路+小技巧*/

因为一开始染好的色,如果后来也将其染色,那么他以前染过的颜色便会被覆盖,所以我们大可以不必从前往后进行染色可以考虑从后往前进行,

但是这样做所扫过的还是每个区间的长度,所以还需要进行优化!

那么怎么优化呢?

首先考虑bool数组,记录下来是否被染过色,如果染过就跳过,但是这样做还是全部都扫过一遍,在复杂度上是没有什么本质上的变化的

所以划掉

接下来我们需要考虑的是并查集的性质,以及考虑其父亲结点,……

正确的思路是这样的:

一开始先将父结点设置为自己(并查集~)

将被染色的结点的父亲结点都手动设置为该染色区间的最后一个的父结点,然后将接下来再次染色的循环从要被染色的结点的父亲结点开始。

因为没有染过色的结点的父亲结点一定是自己,但是染过色的的父亲结点却不是自己,是已经染色的区间的最后,会直接蹦到没有被染色的地方!

所以可以将for循环染色的开始设置为这个结点的父亲结点,限制条件是当前长度小于被染色区间的最右边(及当前被染色区间最后一个结点),下一个变成的是当前的结点的父亲的下一个结点的父结点,以此循环...

所以遇到这种题我们需要考虑的就是:尽量不重复刷,(因为只需要知道最后颜色状态).

代码如下(其他的就是并查集的操作):

for (int a=m;a>=1;a--) //逆序
{
    for (int b=getf(l[a]);b<=r[a];b=getf(b+1)) //如上面的解释
    {
        if (!color[b]) //如果没有被染色
        {
             color[b]=1;//标记
             ans[b]=a;//记录答案
             f[getf(b)]=getf(r[a]);//进行合并
        }
    }
}

完整代码:(已经经过检验^_^请放心食用)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <string>
 6
 7 using namespace std;
 8
 9 const int M = 1000002;
10 int n,m,p,q;
11 int f[M];
12 bool color[M];
13 int ans[M];
14
15 inline int read()
16 {
17     int x=0,f=1;
18     char ch=getchar();
19
20     while(ch<‘0‘||ch>‘9‘)
21     {
22         if(ch==‘-‘)f=-1;
23         ch=getchar();
24     }
25
26     while(ch>=‘0‘&&ch<=‘9‘)
27     {
28         x=10*x+ch-‘0‘;
29         ch=getchar();
30     }
31
32     return x*f;
33 }
34
35 inline int getf(int x)
36 {
37     return f[x] == x ? x : f[x] = getf(f[x]);
38 }
39
40 int main()
41 {
42     n=read();
43     m=read();
44     p=read();
45     q=read();
46     for(int i=1;i<=n+1;i++) f[i]=i;            //因为有可能会蹦到n+1位置
47     for(int i=m;i>=1;i--)
48     {
49         int l=(i*p+q)%n+1,r=(i*q+p)%n+1;    //题目的变态要求...
50         if(l>r) swap(l,r);                    //可能会出现"左端点">"右端点"的情况
51         for(int j=getf(l);j<=r;j=getf(j+1))
52         {
53             if(!color[j])                     //如果没有被染色
54             {
55                 color[j]=1;                    //进行染色
56                 f[getf(j)]=getf(r);            //将当前被染色的父结点手动设置到最后一个的父结点
57 //                f[getf(j)]=getf(j+1);        //在网上是有人这样写的,那样比较快一些!但是我没有理解...
58                 ans[j]=i;                    //记录答案
59             }
60 //            if(getf(1) == n+1) break;        //注意当所有位置全部染色后及时退出
61         }
62     }
63
64     for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
65
66     return 0;
67 }

^_^

End.

时间: 2024-08-07 04:05:47

DS x的相关文章

Windows server 2008 R2 AD DS搭建(额外DNS)

使用额外的DNS服务器搭建AD DS服务器,AD DS服务器本身不是DNS服务器. 先决条件: 1台DNS服务器,1台AD DS服务器: DNS服务器开启动态更新: 部署参考步骤如下: 1.DNS服务器信息检查 2.AD DS服务器信息检查 3.在DNS服务器上面运行dnsmgmt.msc,确定 4.右击"正向查找区域",选择"新建区域" 5.选择下一步 6.选择"主要区域" 7.输入域名"contoso.local",下一步

在Windows7上安装和使用AD DS管理工具

为什么要安装AD DS管理工具 要管理活动目录,默认只有在域控制器下才可以,管理员对活动目录的管理和维护又比较频繁,因此需要经常出入机房才能完成管理任务 用远程桌面也可以进行域管理,但有一定的安全隐患,还会产生较大的网络流量,占用宝贵的带宽资源 AD DS是微软公司基于Windows7系统推出的远程服务管理工具,默认情况下已经设置好了安全措施,可以管理活动目录上的特定功能 下载地址:Download Windows 7 Service Pack 1 (SP1) 远程服务器管理工具 http://

DS.DELMIA.VMAP.V5-6R2017.SP2.Win32

Tracrite.Software.Optimum.Control.Pro.v4.00.08.0102 Agisoft.PhotoScan.Professional.v1.3.2.4164 x64 Altair.HyperWorks.2017.1.Suite.Win64 DS.DELMIA.VMAP.V5-6R2017.SP2.Win32 exida.exSILentia.2014.v2.4.0.25 IMOLD.V13.SP4.2.for.SolidWorks2011-2017 maxmess

为什么要安装AD DS管理工具

要管理活动目录,默认只有在域控制器下才可以,管理员对活动目录的管理和维护又比较频繁,因此需要经常出入机房才能完成管理任务 用远程桌面也可以进行域管理,但有一定的安全隐患,还会产生较大的网络流量,占用宝贵的带宽资源 AD DS是微软公司基于Windows7系统推出的远程服务管理工具,默认情况下已经设置好了安全措施,可以管理活动目录上的特定功能 下载地址:Download Windows 7 Service Pack 1 (SP1) 远程服务器管理工具 http://www.microsoft.co

Azure上A/D系列虚拟机到DS系列迁移(1)

有一些用户在刚开始的时候创建了A7,D14等虚拟机来跑一些IO要求比较高的应用,比如Oracle数据库,MySQL数据库,等到用户量上来之后,性能不够,需要升级数据磁盘到SSD固态硬盘,但是问题是: Azure的固态硬盘SSD磁盘属于高级存储Premium Storage A系列,D系列的虚拟机无法使用高级存储作为数据磁盘 只有DS,DSv2,GS系列的虚拟机才可以使用SSD作为数据磁盘 A系列,D系列虚拟机无法直接升级为DS/GS系列 GS系列暂时在中国没有上线 那么在这种情况下,除了创建高级

Windows server 2008 R2 AD DS搭建(应答文件)

使用应答文件安装新林中第一台域控制器 1.将以下代码复制保存为TXT文件 ;第一台域控制器应答文件 [DCInstall] ReplicaOrNewDomain=Domain NewDomain=Forest NewDomainDNSName=contoso.local ForestLevel=4 DomainNetbiosName=CONTOSO DomainLevel=4 InstallDNS=Yes ;ConfirmGc这个参数在部署林中第一台域控制器是是必须为Yes ConfirmGc=

Windows server 2008 R2 AD DS搭建(命令)

使用命令安装AD DS服务器 查看AD DS服务器信息 2.在AD DS服务器上运行CMD 3.将下列命令复制到CMD命令行中 dcpromo /unattend /InstallDns:yes /newDomain:forest /replicaorNewDomain:domain /newDomainDnsName:contoso.local /DomainNetbiosName:contoso /forestLevel:4 /domainLevel:4 /createDNSDelegati

[DS Basics] List

1, LinkedList composed of one and one Node: [data][next]. [head] -> [data][next] -> [data][next] -> [data][next] -> [null]. Empty linkedList: head == null. V.S. Array DS: fast at insert/delete. [DS Basics] List,布布扣,bubuko.com

[DS Basics] Sorting

Time complexity: Binary search O(log2 n): i=0.   n elements:         ------------------- i=1.   n/2 elements:                   ---------- i=2.   n/4 elements:                          ----- ... i=i.    n/2^i elements:                        - 进行n/2^

IBM DS存储存储性能调优

ibm存储适用,其他存储有类似参数. 1.调整全局cache参数 1.1 start and stop cache flush:这两个参数影响控制器处理cache区域的操作,在这中情况下是按照先进先出的原则往磁盘上写数据.这只对打开了写cache的情况下适用. 在一般的情况下,在决大多数时候start的值大于stop的值.但是也有少量的情况下start等于stop的值.如start=stop=80%意味着,控制器的cache将不允许超过80%的部分用于写cache操作,在这种情况下,控制会尽可能