星球大战

这题是使用了一个total变量持续记录连通块数目,极大减少了判断时间

一开始我直接用从0到n-1遍历找连通块,这样绝对超时

通过代码如下

#include<bits/stdc++.h>
using namespace std;
int fa[400005],q[400005],ans[400005],total;
vector<int> v[400005];
bool vis[400005];
int get(int x){if(x==fa[x]){return x;}return fa[x]=get(fa[x]);
}
void merge(int x,int y){fa[get(fa[x])]=get(fa[y]);
}
int main(){int n,m,t,x,y;scanf("%d%d",&n,&m);for(int i=0;i<=n-1;i++){fa[i]=i;}for(int i=0;i<m;i++){scanf("%d%d",&x,&y);v[x].push_back(y);v[y].push_back(x);}scanf("%d",&t);for(int i=0;i<t;i++){scanf("%d",&x);q[i]=x;vis[x]=1;}total=n-t;for(int i=0;i<=n-1;i++){if(!vis[i]){for(int j=0;j<v[i].size();j++){if(!vis[v[i][j]]&&get(i)!=get(v[i][j])){total--;merge(i,v[i][j]);}}}}ans[t]=total;reverse(q,q+t);for(int i=0;i<t;i++){vis[q[i]]=0;total++;for(int j=0;j<v[q[i]].size();j++){if(!vis[v[q[i]][j]]&&get(q[i])!=get(v[q[i]][j])){total--;merge(q[i],v[q[i]][j]);}}ans[i]=total;} reverse(ans,ans+t);for(int i=0;i<=t;i++){printf("%d\n",ans[i]);}return 0;
}

A不了的
1、fa数组没初始化到4e5
2、数组没开大到4e5
3、算法不行

这题还能用图的特殊性质来代替我的vector,但是复杂度是一样的

说能过那是假的
题意很清楚

这题直接先记录Z的数量cntz
然后从头开始
如果是O,cnto++
如果是R ans+=cnto*cntz
如果是Z cntz–
很巧妙

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
ll ans,cnt,flag,temp,sum,cot;
char ch[100007];
int main()
{#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){scanf("%s",ch);int len=strlen(ch);for(int i=0;i<len;i++)if(ch[i]=='Z')cnt++;for(int i=0;i<len;i++){if(ch[i]=='O')cot++;if(ch[i]=='R')ans+=cot*cnt;if(ch[i]=='Z')cnt--;}printf("%lld\n",ans);//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

接近凌晨
再写一题

双倍快乐

一题挺难想的动态规划

要求在一段序列里寻找两条可不连续的独立的不下降子序列
使得两条序列之和最大

看了几篇博客,都是没讲的很深入
我也想了很久

最后是通过调试想出的这个转移方程的意义

那么首先要明白

既然是两条子序列

我们就要用二维dp

那么以什么为维度呢?

就以每条子序列的 末端!

因为末端好穷举,而且遍历不会漏掉

所以我们的 i 从1开始到n
j从0开始,0代表其中一条序列为空序列
j<i意味着 i永远大于j
就不会重复列举了

此时如果num[i]>num[j]
那么num[i]就具备连接到num[j]后面的条件

然后一个一个链接就好

然后枚举k
总之挺难想的

dp[i][j]意思是两子序列分别以i,j结尾的最大序列之和

#include <bits/stdc++.h>using namespace std;
int dp[600][600];
int num[600];
int main() {int n;scanf("%d",&n);num[0] = 0;for (int i=1;i<=n;i++) {scanf("%d",&num[i]);}memset(dp,0,sizeof(dp));int ans = 0;for (int i=1;i<=n;i++) {for (int j=0;j<i;j++) {if (num[i] >= num[j]) {for (int k=0;k<i;k++) {dp[i][k] = max(dp[i][k],dp[j][k] + num[i]);dp[k][i] = max(dp[k][i],dp[k][j] + num[i]);ans = max(ans,dp[i][k]);}}}}printf("%d\n",ans);return 0;
}

2019.7.14 并查集P1197 [JSOI2008]星球大战 说能过那是假的(动态规划) cometoj #c6 双倍快乐相关推荐

  1. 洛谷 p1197 [JSOI2008]星球大战(并查集)

    洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...

  2. P1197 [JSOI2008]星球大战 题解

    题目:P1197 [JSOI2008]星球大战 并查集 - 图论 - 连通块 题目大意 给出一个 n n n 个点, m m m 条边的无向图,并告诉你 k k k 个攻击目标的编号 敌人依次攻击这 ...

  3. 【反向并查集、联通图】P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  4. [hiho 14]并查集

    题目描述 并查集,顾名思义有两个操作:合并和查询. 并就是把两个集合合并到一起. 查就是查询两个节点是否属于同一个集合. 每个节点有一个父节点.一个集合内存在一个唯一的根,判断根的条件就是节点的父节点 ...

  5. P1197 [JSOI2008]星球大战~写题笔记

    题目:https://www.luogu.org/problemnew/show/P1197 #include<iostream> #include<algorithm> #i ...

  6. P1197 [JSOI2008]星球大战

    并查集维护集合 这道题code写起来很容易 但有很多启示 这道题需要逆序做 为什么呢? 对于路径压缩的并查集来说,如果合并了.那么想要在分开是很难的. 而且这道题要求每步输出.但是!! 这道题是先给操 ...

  7. 洛谷 P1197 [JSOI2008]星球大战

    题意简述 有n个点和m条通道, 现在按顺序破坏k个点 求每一次破坏后联通块的个数 题解思路 并查集,逆序做, 先假设给的k个星球全都被炸,求出此时的联通块个数,就是经过k次打击的联通块个数. 然后每次 ...

  8. Luogu P1197 [JSOI2008]星球大战

    经巨佬们指教,得知要用:逆向思维法(这个一定要想到啊QwQwQ) 之后想了想,发现我大致思路跟第一篇题解比较像(后来AC代码的细节不一样,我是在每次'恢复'循环开始时计数的,题解是循环末尾,大同小异吧 ...

  9. BZOJ1015 [JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3895  Solved: 1750 [Subm ...

最新文章

  1. CentOS 7.0下使用yum安装MySQL
  2. c++ map利用迭代器赋值
  3. Java从零开始(二) Tomacat
  4. 计算机专业中最受热议的4个专业,2018考研后身价倍增的4个专业盘点
  5. WinZip命令行详解
  6. fpga运算服务器_SparseArray替代HashMap来提高性能
  7. LaTeX Cookbook by Eric
  8. async与defer
  9. odbc监控oracle,在zabbix下面使用ODBC 监控oracle数据库(11.2.0.3)和mysql数据库
  10. 关于一段式、两段式、三段式状态机
  11. 汇编语言教程 -- 开始
  12. 革命性的超级WiFi - 电视白空间解释说
  13. iOS开发值苹果手机各种尺寸详细表以及iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax屏幕适配
  14. word从第三页插入页码
  15. 生成yolov5.wts文件出错
  16. DW CS5及CC的部分序列号总结
  17. 编码人大脑的5大小吃
  18. 大数据4V+1C 的特征
  19. frame切换、多窗口切换
  20. PPT制作心得与感悟

热门文章

  1. 电脑绣花打版软件评比 《下》
  2. D1net阅闻:贝恩资本等欲以190亿美元收购东芝半导体
  3. 仿Bilibili iOS客户端
  4. 上海出租车是如何计费的?
  5. TFT LCD 的Array制程
  6. bomb实验(报告)
  7. 计算机组成原理数字逻辑,计算机组成原理数字逻辑.ppt
  8. Execution Error,return code 2 from org.apache.haddop.hive.ql.exec.mr.MapRedTask解决办法
  9. 从Https破解角度分析Https
  10. python 实现读取excel中的所有sheet后,增加新的sheet,生成新的excel文件