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

染色问题:

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

运用并查集!!!

将相同的并为一段

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

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

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string> using namespace std; const int M = ;
int n,m,p,q;
int f[M];
bool color[M];
int ans[M]; inline int read()
{
int x=,f=;
char ch=getchar(); while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
} while(ch>=''&&ch<='')
{
x=*x+ch-'';
ch=getchar();
} return x*f;
} inline int getf(int x)
{
return f[x] == x ? x : f[x] = getf(f[x]);
} int main()
{
n=read();
m=read();
p=read();
q=read();
for(int i=;i<=n+;i++) f[i]=i; //因为有可能会蹦到n+1位置
for(int i=m;i>=;i--)
{
int l=(i*p+q)%n+,r=(i*q+p)%n+; //题目的变态要求...
if(l>r) swap(l,r); //可能会出现"左端点">"右端点"的情况
for(int j=getf(l);j<=r;j=getf(j+))
{
if(!color[j]) //如果没有被染色
{
color[j]=; //进行染色
f[getf(j)]=getf(r); //将当前被染色的父结点手动设置到最后一个的父结点
// f[getf(j)]=getf(j+1); //在网上是有人这样写的,那样比较快一些!但是我没有理解...
ans[j]=i; //记录答案
}
// if(getf(1) == n+1) break; //注意当所有位置全部染色后及时退出
}
} for(int i=;i<=n;i++) printf("%d\n",ans[i]); return ;
}

^_^

End.

【説明する】DS的更多相关文章

  1. POJOの説明

    参考URL: https://baike.baidu.com/item/POJO/3311958?fr=aladdin https://wenku.baidu.com/view/eba89bbcf12 ...

  2. 【説明する】hash

    首先对于判重,我们能想到的方法有什么呢? 1)bool数组 2)set(集) 数组与集合的优缺点: 1.因为集合是对数组做的封装,所以,数组永远比任何一个集合要快. 2.数组声明了它容纳的元素的类型, ...

  3. 【説明する】KMP

    KMP是一个困扰我很久的算法,听老师或者是学姐讲了差不多有4次了,但是还是搞不太懂,今天终于,终于,终于搞懂了! ——2017-10-29 Vanora 首先推荐一下KMP详解——July 读罢之后内 ...

  4. 【説明する】STL

    作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的. STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现. 所以今天要整理的东西就是STL!(orz 杨 ...

  5. winform导出excel

    public void AllDataSetToExcel(DataSet ds) { string saveFileName = ""; bool fileSaved = fal ...

  6. UbuntuでPostgreSQLをインストールからリモートアクセスまでの手順

    PostgreSQLサーバの立ち上げに少しハマりましたので.メモしておきます. OS: Ubuntu14.04 LTS インストール 最初はPostgreSQLをインストールします.普通にapt-ge ...

  7. VirtualBox 共享文件夾

    説明:host為window10,guest為centos7 一.安装VBoxLinuxAdditions 1. 在guest上挂载virtualbox安装目录下的VBoxGuestAdditions ...

  8. Ruby中字符串与正则表达式的问题

    Ruby的正则表达式为Regexp类的对象 主要的元语言字符 記号 意味 例 説明 ^ 行頭 /^abc/ abcで始まる行 $ 行末 /abc$/ abcで終わる行 . 任意の1文字 /a.b/ a ...

  9. WebMidiLink

    g200kg > WebMidiLink > 1.Introduction WebMidiLink 2012/06/26 1.Introduction « Prev 1.Introduct ...

随机推荐

  1. 如何统计序列中元素的频度---Python数据结构与算法相关问题与解决技巧

    实际案例: 1. 某随机序列 [12,5,6,4,6,5,5,7]中,找到出现次数最高的3个元素,它们出现的次数是多少? 2. 对于某英文文章的单词,进行词频统计,找到出现次数最高的10个单词,它们出 ...

  2. oracle--ORA常见报错

    常见错误地址 http://ora-12xyz.com/error/ora-01911 ORA-01034和ORA-27101的解决办法 出现ORA-01034和ORA-27101的原因是多方面的:主 ...

  3. HDU 6603 Azshara's deep sea(凸包+区间DP)

    由于题目要求,首先维护出一个凸包,然后在凸包上寻找点对关系,用rel[i][j]表示i点和j点之间是否可以连线,又由于维护出来的凸包上的点的个数不多,可以直接枚举点对并枚举所有圆,判断两点直线和圆是否 ...

  4. jmeter测试结果jtl字段分析

    1  Bytes Throughput Over Time  每秒传输字节吞吐量,表明Jmeter在测试时,随着时间推移发送和接受的字节数 2  Response Codes per Second  ...

  5. PS使用记录:人像(证件照)更换背景

    PS使用记录:人像(证件照)更换背景 参考:非常干净的抠羽毛ps教程抠图羽毛 (1)准备2019PS,原图 (2)选择人像:选择->主体 (3)边缘处理:选择 ->选择并遮住 ->选 ...

  6. echart 折线渐变 加柱形图结合图形,左右纵轴自设置格式,现行图北京渐变 ,x轴字体倾斜

    app.title = '折柱混合'; option = { grid: { left: '5%', //距离左边的距离 right: '5%', //距离右边的距离 top:'8%', bottom ...

  7. vue 和react中子组件分别如何向父组件传值

    vue子组件和父组件双向传值: 子: Vue.component("childComponent",{ template:`<div><p @click='pos ...

  8. kali优化配置(3)--工具箱

    1.netcat 收集信息.Telnet/banner.传输文本信息.连接服务器端口. *通过IP,连接服务器端口: *信息通信: *重定向符号:> (e.g:>>ps.txt:重定 ...

  9. vsftp 主动模式安装

    server:192.168.109.137 client:192.168.109.138 ------------------------------------------------------ ...

  10. debian系列systemd 配置nodejs服务

    1  新建service配置文件 vi /etc/systemd/system/node.service [Unit] Description=My super nodejs app [Service ...