首页 > 其他分享 >寒假集训杂题选记 2

寒假集训杂题选记 2

时间:2024-01-21 15:45:04浏览次数:26  
标签:ch int 选记 sum kN read 寒假 杂题 getchar

目录

写在前面

寒假集训期间杂题选记。

CF1288E

知识点:数据结构,乱搞

小清新数据结构。

显然 \(i\) 最靠上的出现位置不是 1 就是 \(i\);\(i\) 最靠下的位置一定出现在 \(i\) 即将被扔到顶上前或者所有操作结束之后,且此时 \(i\) 的位置即为在它之上的元素的个数。

发现比较难处理的是当某个位置被扔到顶上之后其他元素的后移,但是发现其实并不需要真的显式地将这些元素后移,仅需要维护相对的前后关系,并支持一个前缀的查询即可。

考虑维护一个长度为 \(m+n\) 的 01 序列,1 表示该位置有元素。初始时位置 \(m + 1\sim n\) 为 1;另外维护 \(\operatorname{pos}_i\) 表示元素 \(i\) 所在位置。第 \(j\) 次操作将 \(i\) 移动到顶部时,查询 \(1\sim \operatorname{pos}_i\) 之和即为 \(i\) 此时的排名,然后 \(\operatorname{pos}_i\) 置 0,将位置 \(m-j+1\) 置 1,然后更新 \(\operatorname{pos}_i = m-j+1\) 即可。

注意还需要在所有操作进行完后对所有元素求一次排名。

总复杂度 \(O((n + m)\log (n + m))\) 级别。

//
/*
By:Luckyblock
*/
#include <bits/stdc++.h>
#define LL long long
const int kN = 3e5 + 10;
//=============================================================
int n, m, pos[kN];
int ans1[kN], ans2[kN];
//=============================================================
inline int read() {
  int f = 1, w = 0; char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0'); 
  return f * w;
}
namespace Bit {
  #define lowbit(x) ((x)&(-x))
  int lim, t[kN << 1];
  void Init(int n_) {
    lim = n_;
  }
  void Insert(int pos_, int val_) {
    for (int i = pos_; i <= lim; i += lowbit(i)) {
      t[i] += val_;
    }
  }
  int Sum(int pos_) {
    int ret = 0;
    for (int i = pos_; i; i -= lowbit(i)) {
      ret += t[i];
    }
    return ret;
  }
  int Query(int l_, int r_) {
    return Sum(r_) - Sum(l_ - 1);
  }
  #undef lowbit
}
//=============================================================
int main() {
  //freopen("1.txt", "r", stdin);
  n = read(), m = read();
  Bit::Init(n + m);
  for (int i = 1; i <= n; ++ i) {
    pos[i] = m + i;
    ans1[i] = ans2[i] = i;
    Bit::Insert(pos[i], 1);
  }
  for (int i = m; i; -- i) {
    int x = read();
    ans1[x] = 1;
    ans2[x] = std::max(ans2[x], Bit::Sum(pos[x]));
    
    Bit::Insert(pos[x], -1);
    pos[x] = i;
    Bit::Insert(pos[x], 1);
  }
  for (int i = 1; i <= n; ++ i) {
    ans2[i] = std::max(ans2[i], Bit::Sum(pos[i]));
  }
  for (int i = 1; i <= n; ++ i) {
    printf("%d %d\n", ans1[i], ans2[i]);
  }
  return 0;
}

P3538 [POI2012] OKR-A Horrible Poem

知识点:哈希,二分,枚举

一眼题,但是卡常。

首先 \(5\times 10^5\) 内的数至多只有 100 多个因子,可以考虑对每个询问都大力枚举区间长度的所有因子 \(d\),然后检查 \(d\) 是否可以作为循环节;然后是典中典结论,若 \(s[1: |s| - d] = s[d + 1: |s|]\),则 \(s[1:d]\) 是 \(s\) 的循环节,哈希判断即可。

这题卡因数分解呃呃,改成线性筛质因数分解 + dfs 求因数还过不去,懒得改了。

90pts 代码:

//
/*
By:Luckyblock
*/
#include <bits/stdc++.h>
#define LL long long
const int kN = 5e5 + 10;
const LL c1 = 1145141;
const LL p1 = 998244353;
//=============================================================
int n, q;
char s[kN];
int pnum, p[kN], minp[kN];
bool vis[kN];
std::vector <int> d;
LL pw1[kN], h1[kN];
int ans;
//=============================================================
inline int read() {
  int f = 1, w = 0; char ch = getchar();
  for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0'); 
  return f * w;
}
void Init() {
  for (int i = 2; i <= n; ++ i) {
    if (! vis[i]) p[++ pnum] = i, minp[i] = i; 
    for (int j = 1; j <= pnum; ++ j) {
      if (i * p[j] > n) break;
      vis[i * p[j]] = true;
      minp[i * p[j]] = p[j];
      if (i % p[j] == 0) break;
    }
  }

  pw1[0] = 1;
  for (int i = 1; i <= n; ++ i) {
    pw1[i] = pw1[i - 1] * c1 % p1;
    h1[i] = (c1 * h1[i - 1] % p1 + s[i]) % p1;
  }
}
LL hash(int l_, int r_) {
  LL ret1 = (h1[r_] - pw1[r_ - l_ + 1] * h1[l_ - 1] % p1 + p1) % p1;
  return ret1;
}
bool check(int l_, int r_, int x_) {
  LL ret1 = hash(l_, r_ - x_);
  LL ret2 = hash(l_ + x_, r_);
  return ret1 == ret2;
}
void Dfs(int l_, int r_, int len_, int i_, int sum_) {
  if (i_ >= (int) d.size()) {
    if (check(l_, r_, sum_)) ans = sum_; 
    return ;
  }
  while (sum_ < len_ && len_ % sum_ == 0 && sum_ < ans) {
    Dfs(l_, r_, len_, i_ + 1, sum_);
    if (1ll * sum_ * d[i_] > len_) break;
    sum_ *= d[i_];
  }
  return ;
}
int query(int l_, int r_) {
  int now = ans = r_ - l_ + 1;
  d.clear();
  while (now != 1) {
    int nowp = minp[now];
    d.push_back(nowp);
    while (now % nowp == 0) now /= nowp;
  }
  std::reverse(d.begin(), d.end());
  Dfs(l_, r_, r_ - l_ + 1, 0, 1);
  return ans;
}
//=============================================================
int main() {
  // freopen("1.txt", "r", stdin);
  n = read();
  scanf("%s", s + 1);
  Init();
  
  q = read();
  while (q --) {
    int l_ = read(), r_ = read();
    printf("%d\n", query(l_, r_));
  }
  return 0;
}
/*
8
aaabcabc
1
3 8
*/

写在最后

标签:ch,int,选记,sum,kN,read,寒假,杂题,getchar
From: https://www.cnblogs.com/luckyblock/p/17977918

相关文章

  • 寒假学习(11)
    今天我计划学习一些基本函数的功能及它们的使用方法,由于网上大多没有汇总,碰巧又赶上最近学的数据处理,所以我根据需要自己整理了几个可能会用到的关于数据的函数。Python内置函数:len():用于获取对象的长度或元素个数。string="hello"length=len(string)print(length)......
  • 寒假学习(10)
    接下来要做的是任务模块,我们计划页面上面一块为轮播图组成的轮播广告,下面为任务条目,不过今天先继续学习python知识,以免跟不上spark的学习。今天主要学到为函数和模块。函数:在Python中,函数是一段可重复使用的代码块,可以接受参数并返回结果。函数的定义以def关键字开始,后面跟着......
  • 「杂题乱刷」AT_abc337_e
    题目链接题目传送门(at)题目传送门(luogu)题意简述有\(n\)瓶果汁,其中有一瓶坏的,你需要使用最少的小白鼠使得这些小白鼠能找出已经变质的果汁的编号,对于每只小白鼠,你可以给他们喝任意瓶不重复的果汁,每瓶果汁可以被平均分。解题思路妙妙构造题。思路一:拿\(n\)个小白鼠,每个小......
  • 大三寒假学习进度笔记11
    今日对之前学习的pyspark内容进行了梳理,同时尝试了通过SparkSQL的JDBC方式从mysql读取数据和写入数据#coding:utf8frompyspark.sqlimportSparkSessionfrompyspark.sql.typesimportStructType,StringType,IntegerTypeimportpandasaspdif__name__=='__main__......
  • 1.20寒假每日总结11
    学习执行计划。简单的解释为:explainquery;一个简单的例子为:explainselectsum(id)fromtest1;该语句的执行计划为:STAGEDEPENDENCIES:Stage-1isarootstageStage-0dependsonstages:Stage-1STAGEPLANS:Stage:Stage-1MapReduceMap......
  • 寒假生活指导12
    importurllib.requesturl='https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1629789477003_137&jsoncallback=jsonp138&action=cityAction&n_s=new&event_submit_doGetAllRegion=true'headers={#':authori......
  • 寒假集训Day5
    vector去重unique(a.begin(),a.end());返回一段没有重复的数组的末尾得到去重后的数组:a.erase(unique(a.begin(),a.end()),a.end());二分推荐写法intl=1,r=1e9,ans;while(l<=r){intmid=(l+r)>>1;if(check(mid)){ans=mid;l=mid+1;......
  • Petrozavodsk Summer 2019. Day 9. MEX Foundation Contest【杂题】
    比赛链接A.TheOnePolynomialMan给定模数\(p\)和\(0\simp-1\)的两个集合\(U,V\),求有多少个有序对\((a,b)\)满足:\(f(a,b)=\prod\limits_{z\inV}\left(\frac{(2a+3b)^2+5a^2}{(3a+b)^2}+\frac{(2a+5b)^2+3b^2}{(3a+2b)^2}-z\right)\equiv0\pmo......
  • 大三寒假学习进度笔记10
    今日学习SprackSQL的两种语言风格,分别是DLS风格和SQL风格,其中SQL风格的语句需要先将DataFrame注册成表才能使用接下来是学习中使用到的部分代码#coding:utf8frompyspark.sqlimportSparkSessionfrompyspark.sql.typesimportStructType,StringType,IntegerTypeimpor......
  • 寒假规划
          学习规划1.20到2.6重点备战数学建模美赛 期待收获:高数,线代,概率论的掌握(对打算法有帮助)matlab或者python,语言编程能力。神经网络的学习,遗传算法等的学习文献查找分析能力 然后根据团队选题,确认学习规划如果选系统类,就抽时间重点看......