传送门

【PR #1】删数

  • 题意:写的很清楚了,略
  • 思路:

    首先转化为差分数组,两个连续数相同,删掉,乘二放进去。

    发现能互相转化的两个数,符号,值\(/lowbit\)都一样。

    把能相互转化的数归为一类,处理出每个的lowbit,能除\(2\)的次数。

    \(f_i\)表示前\(i\)个最终的数的数量。

    枚举第\(i\)最后为\(2^j\),想要知道多少到\(i\)可以变为\(2^j\)。

    考虑到两个\(2^j\)凑出\(2^{j+1}\)这个可以倍增处理已知右端点\(i\),合并后值为\(2^j\)的左端点\(L_{i,j}\)

    \(g_{i,j}=g_{{g_{i,j-1}\ \ -1},\ j-1}\)
  • 调很久的原因:

    1.没有考虑\(b_i=0\)是随便合并成一个\(0\),单独处理,方案\(+1\)即可。

    2.数组下标为负数(一些点能过,一些不能过)
  • code:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
const int M=31;
int a[N],b[N],R[N],L[N][M],f[N];
int main() {
// freopen("ex_data2.in","r",stdin);
int T,n;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<n;i++) b[i]=a[i+1]-a[i];
n--;
for(int i=1;i<=n;i++) {
R[i]=0;
while(b[i]&&b[i]%2==0) {R[i]++;b[i]/=2;}
}
for(int l=1,r;l<=n;l=r+1) {
r=l;
while(r<n&&b[r+1]==b[l]) {r++;}
if(!b[l]) {f[r]=f[l-1]+1;continue;} //zero can't add up, just leave one
for(int i=l;i<=r;i++) {
L[i][R[i]]=i;f[i]=f[i-1]+1;
for(int j=R[i]+1;j<=30;j++) {
if(L[i][j-1])L[i][j]=L[L[i][j-1]-1][j-1];
if(L[i][j]>=l)f[i]=min(f[L[i][j]-1]+1,f[i]);
}
}
}
for(int i=0;i<=n;i++)for(int j=0;j<=30;j++)L[i][j]=0;
printf("%d\n",f[n]+1);
}
return 0;
}

T2 【PR #1】守卫

  • 题意:图,求生成树森林,满足每个连通块有且只能包含一个士兵。每个士兵都有能选的点集。
  • 思路:

    有三种思路,可以去看题解,我的是第二种,最好想的一种,不过跑的不快。

    可以想到先求最小生成树森林。连通块不够就从大到小删边。

    判断一条边能否删:跑连通块与士兵的匹配就好了。

    每一次都跑吗?\(O(n^4)\)的耶。(好像有的人也跑过了很多点的)

    其实次删边,从一个连通块变为两个连通块。那只用在新的一个连通块处跑增广路(\(O(n^3)->O(n^2)\))

    当然方便处理我dfs*2分别标记了一下两个连通块中的点。

    首先以上操作默认当前每个连通块都应该匹配了一个士兵的。

    若删边前的连通块本身匹配的士兵为\(p\),看\(p\)在两个连通块中的哪个,更改一下匹配关系,且另一个就是新连通块。

    这里的g_fa()就用来找连通块在二分图匹配上代表的节点编号。如果找到增广路了,就删这条边,改一下\(fa\)(随便改一个该连通块里面的节点即可,这里就改边\(x,y\)就好)

    总复杂度\(O(n^3)\),匹配用的匈牙利。
  • 调了很久的原因

    这个调的是真tm久,至少放了5h上去。

    原因:两个连通块中的一个可能和原连通块编号相同。这样撤回时可能清空新连通块时,把原本的也清空了。

    改一下顺序,先删除,再添加就不会影响添加了。
  • code:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=305;
const int M=N*N;
typedef long long ll;
struct edge {int x,y,z;}E[M],U[M];
bool cmp(edge u,edge v) {return u.z<v.z;}
int n,m,k,fa[N],ecnt,ab[N],ba[N],s[N][N],flag[N];
bool pm[N][N],road[N],mp[N][N];
int g_fa(int u) {return fa[u]==u?u:fa[u]=g_fa(fa[u]);}
bool _find(int u) {
for(int v=1;v<=k;v++) {
if(road[v]||!pm[u][v])continue;
road[v]=1;
if(!ba[v]||_find(ba[v])) {
ab[u]=v;ba[v]=u;return 1;
}
}
return 0;
}
void dfs1(int u,int lst) {
flag[u]=1;
for(int v=1;v<=n;v++) {
if(!mp[u][v]||v==lst)continue;
dfs1(v,u);
}
}
void dfs2(int u,int lst) {
flag[u]=2;
for(int v=1;v<=n;v++) {
if(!mp[u][v]||v==lst)continue;
dfs2(v,u);
}
}
void solve() {
sort(E+1,E+1+m,cmp);
ll ans=0;
int C=n;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++) {
int x=g_fa(E[i].x),y=g_fa(E[i].y);
if(x==y) {mp[E[i].x][E[i].y]=mp[E[i].y][E[i].x]=0;continue;} //delete edge 1
ans+=E[i].z;C--;
fa[x]=y;U[++ecnt]=E[i];
}
for(int i=1;i<=k;i++) {
for(int j=1;j<=s[i][0];j++) {
pm[g_fa(s[i][j])][i]=1;
}
}
for(int i=1;i<=n;i++) {
int x=g_fa(i);
if(flag[x])continue;flag[x]=1;
for(int j=1;j<=n;j++)road[j]=0;
if(!_find(x)){printf("-1\n");return;}
}
for(int i=ecnt;i&&C<k;--i) {
for(int j=1;j<=n;j++)flag[j]=0;
int x(U[i].x),y(U[i].y),u(g_fa(x));
dfs1(y,x);dfs2(x,y);
int p=ab[u];ab[u]=0;
for(int j=1;j<=s[p][0];++j) {
if(flag[s[p][j]]==1) {ba[p]=y;ab[y]=p;break;}
if(flag[s[p][j]]==2) {ba[p]=x;ab[x]=p;break;}
}
for(int j=1;j<=k;j++) {
if(!pm[u][j])continue;
pm[u][j]=0;
for(int t=1;t<=s[j][0];t++) {
if(flag[s[j][t]]==1) {pm[y][j]=1;}
else if(flag[s[j][t]]==2) {pm[x][j]=1;}
}
}
for(int j=1;j<=n;j++)road[j]=0;
if(_find(ba[p]==x?y:x)) {
ans-=U[i].z;C++;
for(int j=1;j<=n;++j) {
if(flag[j]==1) fa[j]=y;
else if(flag[j]==2) fa[j]=x;
}
mp[x][y]=mp[y][x]=0;
}
else {
ab[ba[p]]=0;ba[p]=u;ab[u]=p;
for(int j=1;j<=k;j++) {
for(int t=1;t<=s[j][0];t++) {
if(flag[s[j][t]]==1) {pm[y][j]=0;pm[u][j]=1;}
else if(flag[s[j][t]]==2) {pm[x][j]=0;pm[u][j]=1;}
}
}
}
}
if(C<k) printf("-1\n");
else {printf("%lld\n",ans);}
} int main() {
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++) {
int u,v,w;scanf("%d%d%d",&u,&v,&w);
E[i]=(edge){u,v,w};mp[u][v]=mp[v][u]=1;
}
for(int i=1;i<=k;i++) {
scanf("%d",&s[i][0]);
for(int j=1;j<=s[i][0];j++) scanf("%d",&s[i][j]);
}
solve();
return 0;
}

Public Round #1的更多相关文章

  1. Three.js typescript definitely typed 文件

    最近学习three.js,想用typescript编写代码,去http://definitelytyped.org/找了一圈没有发现three.js的definitely typed文件. 好吧,花了 ...

  2. java oop

    /** 多层嵌套内部类, 调用时要层层往下调用 格式: 外部类.内部类1.内部类2 对象名 = new 外部类().new 内部类1().new 内部类2(); 对象名.属性/方法名(); */ cl ...

  3. 代理(Proxy)模式 ,桥梁(Bridge)模式

    一:代理模式 1 根据名字我们就可以理解为:代替别人管理 2 什么情况下使用代理模式呢? 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系 ...

  4. C#基础--Virtual与abstract区别、重写

    Virtual作用:子类可以对父类重写,虚方法是对多态特征体现.代表一类对象的所具有的公共属性或方法. public class Animal { public string Name { get; ...

  5. 【java】java.lang.Math:public static long round(double a)和public static int round(float a)

    package math; public class TestMath_round { public static void main(String[] args) { System.out.prin ...

  6. Javascript四舍五入(Math.round()与Math.pow())

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ ...

  7. What technical details should a programmer of a web application consider before making the site public?

    What things should a programmer implementing the technical details of a web application consider bef ...

  8. Round() 四舍五入 js银行家算法(转)

    首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825;        ...

  9. 【C#】Excel舍入函数Round、RoundUp、RoundDown的C#版

    本人在C#中进行小数舍入的时候常常会怀念Excel中的Round.RoundUp.RoundDown这几个函数,原因就是后者“接地气”,比较符合俺小老百姓的舍入要求,啥“银行家舍入法”就让银行家用去吧 ...

随机推荐

  1. Vue3生命周期的理解

    beforeCreate():在实例生成之前 created():在实例生成之后 beforeMount():在模板已经被编译成函数之后,组件内容被渲染到页面之前 mounted():在组件内容被渲染 ...

  2. CCF201509-2日期计算

    问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有29天.满足下面条件之一的是闰年: 1) 年份是4的整数倍,而且不是100的整数倍: 2) 年份是400的整数倍. ...

  3. java读取xml文件并转换成对象,并进行修改

    1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.javaimport java.io.FileInputStream; import java.io.FileWriter; i ...

  4. Idea中配置Tomcat以及运行maven项目

    maven安装和详细配置 提示:下面是Tomcat9.0版本的下载链接,需要其他版本的去官方网站下载. 链接:https://pan.baidu.com/s/1CONf8KVXM4gyJj4pxjFB ...

  5. 网卡激活-up(dhcp方式获得ip)

    一次修复记录 采样: [root@fp-web-124 network-scripts]# cat /etc/redhat-release CentOS Linux release 7.2.1511 ...

  6. 帝国CMS实现栏目批量修改:是否生成

    帝国cms实现栏目批量修改 是否生成:不生成栏目页, 不生成内容页, 不生成JS调用, 标签不调用的修改方本文关键字词:栏目批量设置第一步./e/admin/SetMoreClass.php中查找: ...

  7. 算法基础⑦搜索与图论--BFS(宽度优先搜索)

    宽度优先搜索(BFS) #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  8. Myeclipse+svn相关文章

    Myeclipse安装svn插件https://www.cnblogs.com/liuyk-code/p/7519886.html 使用svn https://jingyan.baidu.com/ar ...

  9. Nginx作为高性能服务器的缘由以及请求过程

    Nginx作为高性能服务器的缘由以及请求过程 简介: Nginxx采用的是多进程(单线程)&多路IO复用模型,使用I/O多路复用技术的Nginx,就成了"并发事件驱动"的服 ...

  10. HCNP Routing&Switching之代理ARP

    前文我们了解了端口隔离相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16186451.html:今天我们来聊一聊ARP代理相关话题: 端口隔离之破解之 ...