题意:给定n*m的格子,每个格子有不同的种类,q次操作,每次操作使[x1,y1]到[x2,y2]的格子除了k类型的以外都删除,最后单次询问所有格子被删了几个 官方题解提到了两种有意思的做法,随机和二进制分组 目前我写了随机的做法,简单粗暴好懂 (upd.劳资总算把二进制分组的给做出来了! 给每种类型打个随机权值,操作覆盖到的区间都加上这个权值 最后查询的时候只需这道这个点的值是不是该类型的权值的倍数就行了 就这么简单 实现上只需套路作差取前缀和就能得到单点的值,总复杂度\(O(n)\) (WA了…
题意:给出n<5e4,a[1...n],单次1e5总次1e6次查询除去区间(L,R)的数的个数 开场5分钟:莫队是不可能莫队的,这道题是不可能莫队的 最后1小时:真香 具体操作没啥特别的,注意一下add和del是和实际相反的操作,以及开区间特判 然而这是卡着过去的.. 正解用裸主席树或其他dsa,只需把数组翻倍再拼接就好(我好菜啊 #include<iostream> #include<algorithm> #include<cstdio> #include<…
题意:给出n条铁路区间\([L,R]\),共有m个boom依时间顺序放置在\(k_i\)中,区间与\(k_i\)有交集的都被炸掉 求每次炸掉的铁路个数和最后输出所有id被炸的时间点 炸弹能炸到的区间满足\(L≤K≤R\) 因为\(L\)与\(R\)无关,将其关系改写为\(X≤K≤Y\), 对应于二维空间,铁路区间相当于一个点\((L,R)\),每次询问有多少个没被屏蔽的点满足\(X≤K\)且\(K≤Y\) 然后KD树乱搞剪枝就好 唯一的问题是屏蔽掉的点无法在push_up时再次更新两个维度的极左…
题意: 给出一个已知的哈希表.求字典序最小的插入序列,哈希表不合法则输出-1. 题解: 对于哈希表的每一个不为-1的数,假如他的位置是t,令s = a[t]%n.则这个数可以被插入当且仅当第s ~ t-1个数都不为-1且已经插入完成. 那么对于每一个这样的数,需要连t-s条边(s<=t)或者t+n-s条边(s>t). 总的边数有O(n^2)条.可以用线段树优化建图.最后跑一边拓扑排序. 对于不合法的情况,第s ~ t-1个数存在-1或者拓扑图存在环会导致不合法. #include <bi…
题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿舍的人数). 最后跑一边费用流. #include <bits/stdc++.h> using namespace std; typedef long long ll; ; const int INF = 0x3f3f3f3f; int n, k; ], y[]; ][]; typedef pai…
题意: 构造一个n*n的矩阵,使得Ai,i = 0,Ai,j = Aj,i,Ai,1+Ai,2+...+Ai,n = 2.求种类数. 题解: 把构造的矩阵当成邻接矩阵考虑. 那么所有点的度数都为2,且存在重边但不存在自环.这种情况的图为多个环,即每个点都在且仅在一个环里. 考虑每次加一个点来递推dp[].假设当前是第n个点,从前n-1个点中筛出(1~n-3)个点和第n个点形成环. 设n-1个点中保留k个点,即筛出n-1-k个点和第n个点形成环. 递推方程为:f(n) = (n-1)f(n-2)+…
题意: 给一个n*m的矩阵赋值(0,1,2).使得每个数都不小于它左面和上面的数. 题解: 构建0和1的轮廓线.对于单独的轮廓线,共需要往上走n步,往右走m步.有C(n+m,n)种方式. 两个轮廓线的总情况是C(n+m,n)*C(n+m,n)种方式.但是还要去重掉相交的情况. 假设将0轮廓线向左上平移一个单位,那么此时两个轮廓线既不能相交也不能重合. 假设0轮廓线是从A到B,1轮廓线是从C到D.那么相交的情况可以理解成从A到D,从C到B.情况数是C(n+m,n-1)*C(n+m,m-1) 总答案…
题意: n个点,m1条边的图E1,n个点,m2条边的图E2.求图E2有多少子图跟图E1同构. 题解: 用STL的全排列函数next_permutation()枚举映射.对于每一种映射枚举每一条边判断合法性. 总情况数要除以图E1的自同构数去重. #include <bits/stdc++.h> using namespace std; int n, m1, m2; int u, v, d; int ans; ]; ][], b[][]; int main() { while(~scanf(&q…
#include<bits/stdc++.h>using namespace std;const long long mod=1000000007,inv=570000004;long long i,j,n,m,a[1010]/*成功几率*/,sum=0,dp[1010][1010]/*动态规划*/,def[1010]//预处理;long long qpow(long long x,long long y,long long mod)//快速幂{    long long ans=1,tmp=…
题目链接:戳这里 转自:戳这里 题意:长度为n的序列,删掉m个数字后有多少种不同的序列.n<=10^5,m<=10. 题解:dp[i][j]表示加入第i个数字后,总共删掉j个数字时,有多少种不同的序列.假设不考虑有重复的情况,dp方程为:dp[i][j]=dp[i-1][j] (第i个数字不删)+dp[i-1][j-1] (第i个数字删).现在考虑重复的情况.如果前面有与a[i]相同的数字a[k] (k小于i),并且i-k<=j,就会产生重复.比如:cdeaae(用字符串举例比较方便)…